2014-06-11 6 views
11

मुझे कुछ हद तक टूटी हुई PHP स्थापना के साथ एक सिस्टम पर एक php स्क्रिप्ट चलाने की आवश्यकता है। मुद्दों को हल करने की कोशिश करने के बजाय मैं अपने कोड को अपने स्वयं के PHP बाइनरी के साथ पैकेज करना चाहता हूं (मैं निष्पादन योग्य निष्पादित कर सकता हूं)। मैं बस एक साधारण php द्विआधारी सभी मॉड्यूल मैं में संकलित की जरूरत है कि करना चाहते हैं मेरी सामान्य प्रक्रिया है:।स्टेटिक बाइनरी में PHP संकलित करें

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

यह मैं कोई एक्सटेंशन के साथ एक php द्विआधारी देता है। यहां से मैं आवश्यक एक्सटेंशन जोड़ सकता हूं। उदाहरण के लिए कर्ल और जेसन समर्थन

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

यह आमतौर पर काम करने लगता है। मेरी स्क्रिप्ट को एडब्ल्यूएस के साथ बातचीत के लिए libxml समर्थन की आवश्यकता है। तो मैंने कॉन्फ़िगर कमांड में --enable-libxml --enable-simplexml जोड़ा।

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

जाहिर है यह गतिशील libxml2 को जोड़ने है: जब मैं दूरस्थ मशीन के लिए द्विआधारी नकल यह जब एक्सएमएल पुस्तकालय कि तरह लग रहा है का उपयोग करने के प्रयास में कोई त्रुटि हो जाता है। मैं इसका मतलब यह लेता हूं कि PHP एक्सटेंशन को स्थिर रूप से PHP में संकलित किया गया है, जबकि लाइब्रेरी का उपयोग PHP लाइब्रेरी का उपयोग नहीं कर रहा है। रनिंग ldd इस बात की पुष्टि करता:

$ 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) 

आप कई पुस्तकालयों गतिशील रूप से मेरी php द्विआधारी से जुड़े होते हैं देखते हैं देख सकते हैं। मुझे लगता है कि यह आम तौर पर काम कर रहा था क्योंकि मेरे लक्षित तंत्र में इन पुस्तकालयों में से बहुत कुछ था लेकिन libxml लाइब्रेरी नहीं।

तो मेरा सवाल यह है कि, मैं साझा पुस्तकालयों पर निर्भरता के बिना पूरी तरह से स्थिर बाइनरी कैसे बना सकता हूं। मुझे एहसास है कि यह मेरे निष्पादन योग्य को बड़ा कर देगा लेकिन इसका मतलब यह भी होगा कि मैं कोड के साथ अपने php निष्पादन योग्य पैकेज कर सकता हूं और यह किसी भी 64-बिट लिनक्स मशीन पर काम करेगा।

+2

php इंस्टॉल को ठीक करना दस लाख गुना बेहतर विचार है। –

+0

साझा प्रणाली, एक्सेस नहीं है। –

+2

लेकिन वे बाइनरी इंस्टॉल की अनुमति देते हैं? –

उत्तर

3

मुझे एक समाधान मिला है हालांकि यह मेरी इच्छा से थोड़ा गड़बड़ है। मैं libxml को एक साझा ऑब्जेक्ट के रूप में छोड़ रहा हूं और बस इसे अपने कोड पैकेज के साथ और LD_LIBRARY_PATH पर्यावरण चर का उपयोग कर रहा हूं ताकि यह सिस्टम पर इंस्टॉल किए गए लोगों की बजाय मेरी साझा लाइब्रेरी ऑब्जेक्ट्स लोड कर सके।

आदर्श रूप से मुझे केवल एक बाइनरी फ़ाइल चाहिए लेकिन यह समाधान काम करता है। यदि सिस्टम उपयुक्त हैं तो यह सिस्टम पुस्तकालयों का उपयोग करने का थोड़ा सा लाभ भी है (यानी मेरे कोड पैकेज में सभी साझा पुस्तकालय शामिल नहीं हैं)। लेकिन मुझे अभी भी यह जानने में दिलचस्पी होगी कि क्या एक पूरी तरह से स्थिर PHP बाइनरी संकलित करने का कोई तरीका है या नहीं।

+0

हाय एरिक, क्या आपको यह करने का कोई बेहतर तरीका पता चला? मेरे पास php, jquery, HTML, MySQL, जावास्क्रिप्ट और एचटीएमएल में विकसित एक पूर्ण वेब आधारित अस्पताल प्रणाली है जिसे अस्पताल ने मुझे एक निष्पादन योग्य में संकलित करने में मदद करने के लिए कहा है। यह एक आरपीएम लिनक्स आधारित सर्वर पर चलता है और विभिन्न भौगोलिक क्षेत्रों में अस्पताल की कई अन्य शाखाएं भी उससे जुड़ती हैं। –

+1

एक बाइनरी नहीं है। मैं थोड़ी देर के लिए वर्णित LD_LIBRARY_PATH का उपयोग कर समाप्त हुआ।बाद में यह परियोजना डॉकर में माइग्रेट की गई जिससे मुझे पर्यावरण के मूल रूप से समर्थित होने के बावजूद PHP के संस्करण को बेहतर ढंग से नियंत्रित करने की इजाजत मिल गई। –

0

यह मेरे a long time ago सुझाव दिया गया था http://statifier.sf.net/ या http://magicErmine.com

वे किसी भी निष्पादन के बाहर एक स्थिर द्विआधारी बनाने की कोशिश करने के लिए।

मुझे लगता है कि इस तरह Magento पर लोगों ने उस PHP 5.2 बाइनरी बना दिया।

संबंधित मुद्दे