Ho bisogno di eseguire uno script php su un sistema con un'installazione PHP un po 'spezzata. Piuttosto che cercare di risolvere i problemi, voglio solo impacchettare il mio codice con il proprio binario PHP (posso eseguire un eseguibile). Voglio avere solo un semplice binario php che ha tutti i moduli compilati ho bisogno nel mio processo generale è:.Compilare PHP in Static Binary
./configure --enable-static --enable-cli --disable-all
Questo mi dà un binario php senza le estensioni. Da qui posso aggiungere le estensioni di cui ho bisogno. Ad esempio per aggiungere arricciatura e supporto JSON
./configure --enable-static --enable-cli --disable-all --with-curl --enable-json
Questo sembra funzionare bene in generale. Il mio script ha bisogno del supporto di libxml per interagire con AWS. Così ho aggiunto --enable-libxml --enable-simplexml
al comando configure. Quando copio il file binario alla macchina remota si ottiene un errore quando si cerca di utilizzare la libreria XML che assomiglia a:
/usr/lib/x86_64-linux-gnu/libxml2.so.2: version `LIBXML2_2.9.0' not found
Ovviamente è dinamicamente il collegamento a libxml2. Prendo questo per significare che mentre l'estensione PHP è staticamente compilata in PHP, la libreria che l'estensione PHP sta usando non lo è. ldd esecuzione di conferma:
$ 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)
Come potete vedere ci sono molte librerie che sono collegate dinamicamente al mio php binario. Sto indovinando che funzionava generalmente perché il mio sistema di destinazione aveva molte di queste stesse librerie ma non la libreria libxml.
Quindi la mia domanda è, come faccio a fare un binario completamente statico senza dipendenze sulle librerie condivise. Mi rendo conto che questo renderà il mio eseguibile più grande ma significherebbe anche che posso impacchettare il mio eseguibile php con il codice e funzionerà su qualsiasi macchina Linux a 64 bit.
risolvere l'installazione di php è un'idea milioni di volte migliore. –
Sistema condiviso, non ho accesso. –
ma consentono installazioni binarie? –