2014-06-11 12 views
11

Ich muss ein PHP-Skript auf einem System mit einer etwas kaputten PHP-Installation ausführen. Anstatt zu versuchen, die Probleme zu umgehen, möchte ich einfach meinen Code mit seiner eigenen PHP-Binärdatei verpacken (ich kann eine ausführbare Datei ausführen). Ich möchte nur einen einfachen PHP-Binary habe, die die Module alles, was ich in Not zusammengestellt hat Mein allgemeiner Prozess ist.Kompilieren Sie PHP in statische binäre

./configure --enable-static --enable-cli --disable-all 

Das ist mir ohne Erweiterungen einen PHP-Binary gibt. Von hier aus kann ich die Erweiterungen hinzufügen, die ich brauche. Zum Beispiel, um Locken und JSON-Unterstützung hinzuzufügen

./configure --enable-static --enable-cli --disable-all --with-curl --enable-json 

Dies scheint allgemein gut zu funktionieren. Mein Skript benötigt libxml-Unterstützung für die Interaktion mit AWS. Also habe ich --enable-libxml --enable-simplexml zum configure-Befehl hinzugefügt. Wenn ich die binäre auf den entfernten Rechner kopieren wird es einen Fehler beim Versuch, die XML-Bibliothek zu verwenden, die wie folgt aussieht: dynamisch auf libxml2 verbindet es

/usr/lib/x86_64-linux-gnu/libxml2.so.2: version `LIBXML2_2.9.0' not found 

Offensichtlich. Ich nehme an, dass, während die PHP-Erweiterung statisch in PHP kompiliert wird, die Bibliothek, die die PHP-Erweiterung verwendet, nicht ist. ldd bestätigt dies:

$ ldd sapi/cli/php 
linux-vdso.so.1 => (0x00007fff05cf3000) 
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f3c69f82000) 
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f3c69d68000) 
libcurl.so.4 => /lib64/libcurl.so.4 (0x00007f3c69afc000) 
librt.so.1 => /lib64/librt.so.1 (0x00007f3c698f4000) 
libm.so.6 => /lib64/libm.so.6 (0x00007f3c695ed000) 
libdl.so.2 => /lib64/libdl.so.2 (0x00007f3c693e8000) 
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f3c691cf000) 
libxml2.so.2 => /lib64/libxml2.so.2 (0x00007f3c68e66000) 
libz.so.1 => /lib64/libz.so.1 (0x00007f3c68c4f000) 
libc.so.6 => /lib64/libc.so.6 (0x00007f3c68890000) 
libfreebl3.so => /lib64/libfreebl3.so (0x00007f3c6860f000) 
libidn.so.11 => /lib64/libidn.so.11 (0x00007f3c683db000) 
libssh2.so.1 => /lib64/libssh2.so.1 (0x00007f3c681b1000) 
libssl3.so => /lib64/libssl3.so (0x00007f3c67f72000) 
libsmime3.so => /lib64/libsmime3.so (0x00007f3c67d44000) 
libnss3.so => /lib64/libnss3.so (0x00007f3c679fc000) 
libnssutil3.so => /lib64/libnssutil3.so (0x00007f3c677d0000) 
libplds4.so => /lib64/libplds4.so (0x00007f3c675cb000) 
libplc4.so => /lib64/libplc4.so (0x00007f3c673c6000) 
libnspr4.so => /lib64/libnspr4.so (0x00007f3c67188000) 
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f3c66f6a000) 
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f3c66d20000) 
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f3c66a40000) 
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f3c6680a000) 
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f3c66606000) 
liblber-2.4.so.2 => /lib64/liblber-2.4.so.2 (0x00007f3c663f7000) 
libldap-2.4.so.2 => /lib64/libldap-2.4.so.2 (0x00007f3c661a4000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f3c6a1d7000) 
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f3c65f7f000) 
libssl.so.10 => /lib64/libssl.so.10 (0x00007f3c65d12000) 
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007f3c6592b000) 
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f3c6571c000) 
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f3c65518000) 
libsasl2.so.3 => /lib64/libsasl2.so.3 (0x00007f3c652fa000) 
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f3c650d6000) 
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f3c64e6f000) 

Wie Sie es viele Bibliotheken zu sehen sind, die zu meinem php binary dynamisch verknüpft sind. Ich vermute, dass es im Allgemeinen funktionierte, weil mein Zielsystem viele dieser gleichen Bibliotheken aber nicht die Bibliothek libxml hatte.

Also meine Frage ist, wie mache ich eine vollständig statische binäre ohne Abhängigkeiten von gemeinsam genutzten Bibliotheken. Ich weiß, dass dies meine ausführbare Datei größer machen wird, aber es würde auch bedeuten, dass ich meine php-Programmdatei mit dem Code verpacken kann und sie wird auf jedem 64-Bit-Linux-Rechner funktionieren.

+2

das Reparieren der PHP-Installation ist eine Million Mal bessere Idee. –

+0

Geteiltes System, kein Zugriff. –

+2

aber sie erlauben binäre Installationen? –

Antwort

3

Ich habe eine Lösung gefunden, obwohl es ein bisschen unordentlicher ist, als ich es möchte. Ich belasse die libxml als gemeinsames Objekt und schließe sie einfach in mein Code-Paket ein und benutze die Umgebungsvariable LD_LIBRARY_PATH, damit sie meine Shared-Library-Objekte statt der auf dem System installierten Objekte lädt.

Idealerweise möchte ich nur eine einzelne Binärdatei, aber diese Lösung funktioniert. Es hat auch den leichten Vorteil, die Systembibliotheken zu verwenden, wenn diese geeignet sind (d. H. Mein Code-Paket muss nicht alle gemeinsam genutzten Bibliotheken enthalten). Aber ich wäre immer noch interessiert zu wissen, ob es eine Möglichkeit gibt, eine vollständig statische PHP-Binärdatei zu kompilieren.

+0

Hallo Erick, hast du einen besseren Weg gefunden, dies zu tun? Ich habe ein vollwertiges webbasiertes Krankenhaussystem, das in PHP, Jquery, HTML, MySQL, JavaScript und HTML entwickelt wurde. Das Krankenhaus hat mich gebeten, bei der Kompilierung in einer ausführbaren Datei zu helfen. Es läuft auf einem Linux-basierten RPM-Server und mehrere andere Zweige des Krankenhauses in verschiedenen geographischen Regionen verbinden sich auch damit. –

+1

Keine einzige Binärdatei. Ich benutzte den LD_LIBRARY_PATH, der für eine Weile beschrieben wurde.Später wurde dieses Projekt auf Docker migriert, wodurch ich die Version von PHP besser kontrollieren konnte, unabhängig davon, was die Umgebung nativ unterstützte. –