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.
das Reparieren der PHP-Installation ist eine Million Mal bessere Idee. –
Geteiltes System, kein Zugriff. –
aber sie erlauben binäre Installationen? –