Warum macht PHP verwenden opcode-caches, während das Java kompiliert zu bytecode-Dateien?
- Aus meiner Sicht -, PHP-und Java haben eine ähnliche Struktur. Auf den ersten Sie schreiben einige high-level-code, der dann übersetzt werden müssen, in eine einfachere code-format ausgeführt werden, indem eine VM. Ein Unterschied ist, dass PHP funktioniert direkt aus dem source-code-Dateien, während Java speichert den bytecode in .die class-Dateien, von wo aus die VM geladen werden.
Heute die Anforderungen für den schnellen PHP-Ausführung wachsen, was dazu führt, dass die Menschen glauben, dass es besser wäre, direkt die Arbeit mit den opcodes und nicht durch das kompilieren Schritt jedes mal, wenn ein Nutzer auf eine Datei.
Die Lösung zu sein scheinen ein laden der so genannten Beschleunigern, die im Grunde zu speichern, die erarbeiteten Ergebnisse im cache, und verwenden Sie dann die Cache-opcodes kompilieren wieder.
Anderen Ansatz, durchgeführt von Facebook, ist komplett kompilieren von PHP code in eine andere Sprache.
Also meine Frage ist, warum ist niemand in der PHP-Welt zu tun, was Java macht? Es sind noch ein paar dynamische Elemente, die Sie wirklich brauchen, um neu kompiliert werden, jedes mal, oder sowas? Ansonsten wäre es wirklich klüger zu kompilieren alles, wenn der code in Produktion geht und dann nur damit arbeiten.
- Schaukeln und Karussells. Man produziert schneller Laufzeiten, die anderen können schnell eingesetzt werden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der wichtigste Unterschied ist, dass die JVM eine explizite Spezifikation für den bytecode vollständig. Das macht bytecode-Dateien, die tragbar und nützlich für mehr als nur die Ausführung durch eine bestimmte JVM-Implementierung.
PHP nicht einmal ein language specification. PHP-opcodes sind ein Implementierungsdetail einer bestimmten PHP-engine, also man kann nicht wirklich etwas Interessantes mit Ihnen und es wenig Sinn, in so dass Sie mehr sichtbar.
PHP-opcodes sind nicht das gleiche wie Java-classfiles. Java classfiles sind auch angegeben, und sind portabel zwischen Maschinen. PHP-opcodes sind nicht tragbar in jeder Weise. Sie haben Speicheradressen gebacken in Ihnen, zum Beispiel. Sie sind ausschließlich ein Implementierungsdetail der PHP-interpreter, und sollten nicht betrachtet werden, so etwas wie Java-bytecode.
Muss es so sein? Nein, wahrscheinlich nicht. Aber der PHP-source-code ist ein Chaos, und es gibt weder die Lust, noch den politischen Willen in der PHP-internals-community, dies zu verwirklichen. Ich denke, es war die Rede von Backen ein opcode-cache in PHP 6, PHP 6 gestorben, und ich weiß nicht, den status der Idee.
Referenz: ich schrieb phc so war ich ziemlich Knie-tief in die PHP-Implementierung/Zusammenstellung für ein paar Jahre.
Es ist nicht ganz wahr, dass niemand in der PHP-Welt ist zu tun, was java tut. Projekte wie Alexey Zakhlestin ist appserver bieten eine gewisse Persistenz eher an ein java servlet-container (obwohl seine inspiration ist mehr Ruby-Rack-und-Python-WSGI als Java)
PHP nicht verwenden eine standard-Mechanismus für die opcodes. Ich wünschte, es entweder fest zu einer stack-VM (python,java) oder einer register VM (x86, perl6 etc). Aber es nutzt etwas absolut homegrown und da liegt der Hase im Pfeffer.
Verwendet es eine verbundene list im Speicher die Ergebnisse in den einzelnen opcode-mit ein ->op1 ->op2 und ->Ergebnis. Nun, jeder von denen sind entweder Konstanten oder Einträge in einer temp-Tabelle, etc. Diese Zeiger können nicht serialisiert werden, in der jeder vernünftige Mode.
Nun, Menschen, die dies erreicht haben, mit Elementen wie pecl/bcompiler, die nicht dump der Strom in die Festplatte.
Aber die Klassen machen sogar noch komplizierter, was bedeutet, dass es mögliche code-Fragmente wie
Was bedeutet, dass eine große Anzahl von Entscheidungen über die Klassen & Funktionen kann nur zur Laufzeit - so etwas wie Java-würde Würgen auf zwei Klassen mit dem gleichen Namen, die bedingt definiert zur Laufzeit. Im Grunde, APC Vererbung & Klasse-caching-code ist vielleicht der komplizierteste & bug-anfällig Teil der codebase. Wenn eine Klasse zwischengespeichert wird, werden alle übergeordneten geerbt Mitglieder müssen geschrubbt werden, bevor es gespeichert werden kann, um die opcode-cache.
Den Mauszeiger problem ist nicht unüberwindbar. Es ist ein apc_bindump, die ich habe nie die Mühe gemacht, zu reparieren, zu laden gesamten cache-Einträge vom Datenträger direkt, wenn ein Neustart erfolgt. Aber es ist schmerzhaft zu Debuggen alle, die etwas bekommen, die muss noch suchen Sie alle system - Zeiger- apache-Fall ist zu einfach, da alle php-Prozesse haben das gleiche system Zeiger, weil von der Gabel Verhalten. Die alten fastcgi Versionen waren langsamer, weil Sie verwendet, um die Gabel zuerst & init php-später - die php-fpm behoben, indem Sie es tun, die andere Weise herum.
Aber schließlich, was wirklich fehlt in PHP ist der Wille zu erfinden, das bytecode-format, wegwerfen, die aktuelle Motor & alle Module neu zu schreiben, es mit einer stack-VM & erstellen eines JIT. Ich wünschte, ich hätte die Zeit - die fb-Jungs sind fast da mit Ihren hiphop-HHVM. Die und opfert eval() für schnellere Leistung - das ist eine Messe Opfer 🙂
PS: ich bin der Mann, der nicht finden können, Zeit zum aktualisieren APC für 5,4 richtig
Ich denke, Sie alle sind falsch informiert. HHVM ist nicht ein compiler auf einen anderen languague ist eine virtuelle Maschine selbst. Die Verwirrung ist wegen facebook verwenden, um kompiliert zu c++, aber das Konzept war zu langsam für die Anforderungen der Entwickler (zehn Minuten zusammenstellen nur zum test ein paar kleine Dinge).