2014-06-11 16 views
11

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.

+2

risolvere l'installazione di php è un'idea milioni di volte migliore. –

+0

Sistema condiviso, non ho accesso. –

+2

ma consentono installazioni binarie? –

risposta

3

Ho trovato una soluzione anche se è un po 'pacchiana di quanto vorrei. Sto lasciando libxml come oggetto condiviso e includendolo con il mio pacchetto di codice e usando la variabile di ambiente LD_LIBRARY_PATH in modo che carichi i miei oggetti della libreria condivisa invece di quelli installati sul sistema.

Idealmente vorrei un solo file binario ma questa soluzione funziona. Ha anche il leggero vantaggio di utilizzare le librerie di sistema se sono adatte (ad esempio il mio pacchetto di codice non deve includere tutte le librerie condivise). Ma sarei ancora interessato a sapere se esiste un modo per compilare un binario php completamente statico.

+0

Ciao Erick, hai trovato un modo migliore per farlo? Ho un sistema ospedaliero basato su web completo sviluppato in php, jquery, HTML, MySQL, JavaScript e HTML che l'ospedale mi ha chiesto di aiutarli a compilarlo in un eseguibile. Funziona su un server RPM basato su Linux e molti altri rami dell'ospedale in diverse regioni geografiche si collegano anche ad esso. –

+1

Non un singolo binario. Ho finito per usare LD_LIBRARY_PATH per un po '.Successivamente il progetto è migrato su Docker permettendomi di controllare meglio la versione di PHP indipendentemente da quale sia l'ambiente nativamente supportato. –