Können PHP7-Dateien im Cache ohne Quellcode verteilt werden?

8

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?

    
dasup 18.11.2016, 00:00
quelle

1 Antwort

9

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:

  1. Blocksignale
  2. schützt den gemeinsamen Speicher
  3. zend_file_cache_script_load

Nun schauen wir uns zend_file_cache_script_load an:

  1. öffnen
  2. Lese-Header (layout )
  3. verifiziere Magie "OPCACHE"
  4. System-ID überprüfen
  5. validieren Sie optional den Zeitstempel
  6. liest die zwischengespeicherte Datei
  7. überprüfen Sie die Prüfsumme

Also das erste Problem, das wir haben, ist, dass die System-ID ist nicht einzigartig, sondern besteht aus folgenden Elementen:

  1. PHP-Version
  2. Build-ID der Zend-Erweiterung
  3. Binäre Kennung, enthält Folgendes:
    1. sizeof(char)
    2. sizeof(int)
    3. sizeof(long)
    4. sizeof(size_t)
    5. sizeof(zend_long)
    6. ZEND_MM_ALIGNMENT
  4. Wenn Sie keine dev-Version von PHP verwenden (unveröffentlicht, von git):
    1. ___DATE__ Kompilierdatum von binary
    2. ___TIME___ Kompilierzeit von binär

Die PHP-Version und der Build-Bezeichner sind erforderlich, da sich mindestens Folgendes zwischen Versionen oder Builds ändern kann:

  • Integrale Bezeichner für Opcodes
  • das Layout der internen Strukturen
  • die Reihenfolge der Anweisungen, die die VM erwartet (Details einer vorhandenen Kontrollstruktur können sich zB ändern. foreach)
  • Optimierungen, die von opcache durchgeführt werden (weil vorherige möglicherweise als unsicher erkannt wurden)

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.

Solltest du?

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.

    
Joe Watkins 18.11.2016 06:25
quelle

Tags und Links