PHP7 bietet einen Bytecode-Caching-Mechanismus namens opcache . Ich würde gerne wissen, ob es eine Möglichkeit gibt, die "opcached" Version eines PHP-Skripts (.bin Dateierweiterung) zu verteilen und auszuführen, ohne den Quellcode zu verteilen. (Ich habe die opcache.file_cache
-Direktive in php.ini
aktiviert, um die .bin-Datei zu erhalten.)
Ich gehe davon aus, dass PHP7 beim Ausführen eines Skripts das Opcache-Verzeichnis nach einer .bin-Datei mit übereinstimmendem Namen, Zeitstempel und vielleicht sogar nach einer Prüfsummen- oder einem Hash-Wert vergleicht. Wenn alle Dinge übereinstimmen, führt PHP7 die .bin-Datei aus, anstatt die .php-Datei zu analysieren. Vielleicht ist es möglich, PHP dazu zu bringen, die .bin-Datei auszuführen, selbst wenn das entsprechende .php-Skript nicht vorhanden ist?
PHP muss in der Lage sein, die Datei zu öffnen, damit Opcache aufgerufen werden kann; Wenn es nicht existiert, kann es nicht geladen werden ...
Lasst uns im Detail schauen, um zu sehen, welche Tricks wir könnten spielen:
%Vor%Wir können sehen, dass der Cache für Dateien aktiviert ist und Vorrang vor dem Cache für gemeinsam genutzten Speicher hat.
Als nächstes wollen wir uns file_cache_compile_file ansehen:
Nun schauen wir uns zend_file_cache_script_load an:
Also das erste Problem, das wir haben, ist, dass die System-ID ist nicht einzigartig, sondern besteht aus folgenden Elementen:
sizeof(char)
sizeof(int)
sizeof(long)
sizeof(size_t)
sizeof(zend_long)
ZEND_MM_ALIGNMENT
___DATE__
Kompilierdatum von binary ___TIME___
Kompilierzeit von binär Die PHP-Version und der Build-Bezeichner sind erforderlich, da sich mindestens Folgendes zwischen Versionen oder Builds ändern kann:
Die binäre Kennung ist erforderlich, da mindestens das Layout einer zval ändert sich mit Endianess und Architektur: Die Architektur kann die Größe einiger einfacher Compilertypen (long, size_t usw.) sowie die Ober- und Untergrenzen dieser Typen beeinflussen, während Endianess die Reihenfolge der Elemente in der Struktur beeinflussen kann. sowie die binäre Darstellung der grundlegenden Compiler-Typen.
Beachten Sie, dass viel Aufwand betrieben wird, um das aktuelle System zu identifizieren, das Sie zum Nachdenken anregen sollte ...
Die Deaktivierung der Validierung von Zeitstempeln opcache.validate_timestamps=0
ermöglicht das Laden eines Dateicache-Eintrags, selbst wenn die aktuelle Datei im Dateisystem leer ist.
Die in der Kopfzeile enthaltene Prüfsumme dient nur dazu, den Skriptabschnitt der Datei zu verifizieren (der hinter dem Header steht), sie enthält (und kann nicht) die Kopfzeile, in die der Systembezeichner oder die Prüfsumme selbst geschrieben wird .
So können Sie PHP dazu bringen, eine zwischengespeicherte Datei von einer anderen Maschine zu laden, indem Sie die System-ID in der Kopfzeile der zwischengespeicherten Datei, die dem Zielmaschinenidentifikator entspricht.
Aus Spaß vielleicht, aber als eine Methode zum Bereitstellen Ihrer Software, definitiv nicht .
Der Dateicache ist nicht für diesen Zweck gedacht, das Laden von Caches von verschiedenen Architekturen und / oder Builds führen zum Absturz von PHP.