2012-04-10 17 views
6

के रूप में एक PHP एक्सटेंशन संकलित करना मैं विंडोज़ पर एक गैर थ्रेड-सुरक्षित वातावरण में उपयोग करने के लिए छविमैजिक (कल्पना) एक्सटेंशन को संकलित करने की कोशिश कर रहा हूं।गैर-थ्रेड-सुरक्षित

मैं PHP 5.3.10 का उपयोग कर रहा हूं और मेरे संकलन वातावरण के रूप में विजुअल सी ++ एक्सप्रेस सेट अप किया है। समस्या यह है कि मैं अपाचे 2.2 में एक एफसीजीआई मॉड्यूल के रूप में PHP के गैर-थ्रेड-सुरक्षित संस्करण का उपयोग कर रहा हूं।

इस प्रकार, मेरे PHP को php5.lib के साथ आपूर्ति की जाती है और php5ts.lib नहीं है। मेरा मानना ​​है कि यही कारण है कि मैं इन त्रुटियों को मिल रहा है है:

imagick.obj : error LNK2019: unresolved external symbol __imp__tsrm_mutex_alloc referenced in function _zm_startup_imagick 

मैं केवल कभी भी बनाया और लिनक्स पर बातें संकलित किया है, तो कैसे एक खिड़कियों पर्यावरण पर यह करने के लिए भी यकीन नहीं है।

मैं विस्तार को कैसे संकलित कर सकता हूं ताकि यह गैर-थ्रेड-सुरक्षित हो?


मैंने php5ts.lib की एक प्रति प्राप्त करने के लिए PHP 5.3.10 की थ्रेडसेफ बाइनरी डाउनलोड की। मैं तब विस्तार को संकलित करने में सक्षम था।

मैं अनुमान लगा रहा हूँ कि ZTS पूर्वप्रक्रमक निर्देश स्थापित करने के लिए या तो 1 या 0 विस्तार या तो threadsafe या गैर threadsafe के रूप में संकलित करने के लिए कारण होगा। (इसके बारे में भी निश्चित नहीं है, इसलिए यदि कोई मुझे सही बताता है या नहीं, तो यह बहुत सराहना की जाएगी। :))

मैंने फिर विंडोज 7 चलाने वाली वर्चुअल मशीन स्थापित की और नवीनतम संस्करण स्थापित किया WAMP। इसका कारण यह है कि यह PHP के थ्रेडसेफ संस्करण का उपयोग करता था।

मैंने डीएल को PHP स्थापना में एक्सटी फ़ोल्डर में रखा और इसे php.ini में सक्षम किया। हालांकि, WAMP में दोनों के नियम व एनटीएस संस्करण की कोशिश कर के बाद भी, मैं मिलेगा:

PHP Warning: PHP Startup: Unable to load dynamic library 'c:/wamp/bin/php/php5.3.10/ext/imagick.dll' - The specified module could not be found. 
in Unknown on line 0 

लेकिन बात यह है कि c:/wamp/bin/php/php5.3.10/ext/imagick.dll' मौजूद है है, और हाँ मैं इस बार का एक बहुत जाँच कर ली है।

मैंने फिर छविमैजिक को 6.6.2-10-Q16 तक घटा दिया, लेकिन फिर भी वही समस्या दिखाई दे रही है।

अपाचे 2.2 (सभी मैन्युअल रूप से स्थापित) पर PHP dev.10 के nts संस्करण को चलाने के लिए मेरी dev मशीन पर एक ही समस्या होती है।


ऐसा लगता है कि मैं ZTS पूर्वप्रक्रमक के बारे में गलत हो सकता है। अगर मैं संकलित डीएल पर निर्भरता वॉकर का उपयोग करके ZTS=0 और संकलित करता हूं, तो यह दिखाता है कि इसे php5ts.dll की आवश्यकता है जो केवल PHP के थ्रेडसेफ संस्करणों पर मौजूद है।


मैं निर्भरता वॉकर के साथ और अधिक फेरबदल किया और पाया कि मैं msvc100d.dll के लिए लिंक सांख्यिकीय करना पड़ा। मैंने प्रीप्रोसेसर परिभाषा में ZTS हटा दिया और php5ts.dll के बजाय php5.lib का उपयोग करके संकलित करने में सक्षम था। मुझे लगता है कि यह मुझे एक गैर-टीएस डीएल मिलना चाहिए।

हालांकि, जब विस्तार लोड हो रहा है, मैं अभी भी हो रही है:

PHP Warning: PHP Startup: Invalid library (maybe not a PHP library) 'imagick.dll' in Unknown on line 0 

और त्रुटियों निर्भरता वॉकर से:

Error: At least one module has an unresolved import due to a missing export function in an implicitly dependent module. 
Error: Modules with different CPU types were found. 
Warning: At least one delay-load dependency module was not found. 
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module. 

स्थापित दृश्य ग व्यक्त ++ 2008 और संकलित मंच टूलकिट V90 का उपयोग कर , लेकिन अभी भी एक ही मुद्दे का सामना करना पड़ रहा है।

कोई युक्ति की सराहना की :)


समाधान मिला! मेरा जवाब देखें

+0

serverfault.com प्रश्न। – Raptor

उत्तर

5

मिल गया! मुझे उम्मीद है कि यह भविष्य में विंडोज़ पर PHP एक्सटेंशन को संकलित करने में मदद कर सकता है। मैंने जो किया है वह इस पर आधारित है: https://wiki.php.net/internals/windows/stepbystepbuild

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

PHP निर्माण प्रक्रिया का उपयोग करने का सबसे अच्छा तरीका है।

  1. स्थापित विजुअल C++ एक्सप्रेस 2008 (किसी भी संस्करण करना होगा, लेकिन व्यक्त नि: शुल्क है) और Windows एसडीके 6.1 (ध्यान दें कि हम 6.1 संस्करण नहीं कुछ भी पुराने या नए चाहते हैं)।

  2. SVN client tools इंस्टॉल करें यदि आपने ऐसा नहीं किया है और अपने PATH चर के प्रभाव को पुनरारंभ करने के लिए पुनरारंभ करें।

  3. PHP SDK binary tools प्राप्त करें और इसे C:\php-sdk पर निकालें।

  4. CMD ShellMicrosoft Windows SDK v6.1 के तहत अपने प्रारंभ मेनू में cd C:\php-sdk चलाएं।

  5. रन setenv /x86 /xp /release यह 32-बिट रिलीज बनाता है। 64-बिट रिलीज बनाने के लिए आप /x64 का उपयोग कर सकते हैं (मैंने यह कोशिश नहीं की है)।

  6. रन bin\phpsdk_setvars.bat

  7. रन bin\phpsdk_buildtree.bat php53dev

  8. PHP source code डाउनलोड करें और C:\php-sdk\php53dev\vc9\x86 करने के लिए इसे निकालने ताकि आप C:\php-sdk\php53dev\vc9\x86\php5.3-xyz

  9. अंत डाउनलोड नवीनतम deps और C:\php-sdk\php53dev\vc9\x86 के लिए सब कुछ निकालें। आपको किसी मौजूदा फ़ोल्डर को ओवरराइट करने के लिए कहा जा सकता है, इसलिए हाँ दबाएं।

  10. रन cd C:\php-sdk\php53dev\vc9\x86

  11. चेक बाहर SVN भंडार से अपने विस्तार के नवीनतम संस्करण: svn co http://svn.php.net/repository/pecl/imagick/trunk pecl/imagick मैं यहाँ Imagick बाहर की जाँच कर रहा हूँ।

  12. किसी भी निर्भरता को स्थापित करें। मेरे मामले में, मुझे ImageMagick इंस्टॉल करने की आवश्यकता है, इसलिए मैंने नवीनतम अनुशंसित windows binary डाउनलोड किया। आपको अपने PATH वैरिएबल को अपडेट करने के लिए इंस्टॉलेशन के बाद पुनरारंभ करना होगा, लेकिन संकलित करने के बाद आप इसे कर सकते हैं। सुनिश्चित करें कि आप सी/सी ++ हेडर इंस्टॉल करते हैं और साथ ही साथ भी शामिल हैं।

  13. ImageMagick इंस्टॉल निर्देशिका से C:\php-sdk\php53dev\vc9\x86\deps\include पर includes निर्देशिका की सामग्री कॉपी करें।

  14. कॉपी ImageMagick से lib निर्देशिका की सामग्री अब C:\php-sdk\php53dev\vc9\x86\deps\lib

  15. के लिए निर्देशिका स्थापित करते हैं, के निर्माण करते हैं: cd C:\php-sdk\php53dev\vc9\x86\php5.3-xyz चलाने तो buildconf तो configure --help। मदद ठीक से देखो। यह आपको सभी कॉन्फ़िगरेशन झंडे और सक्षम करने के लिए उपलब्ध किसी भी उपलब्ध एक्सटेंशन दिखाएगा। मेरे मामले में, के बाद से मैं Imagick कहा, मैं बुलाया --with-imagick

  16. भागो config का विकल्प होता है: आप एक गैर धागा सुरक्षित द्विआधारी उपयोग --disable-zts का निर्माण करना चाहते configure --enable-cli --with-imagick=shared --disable-zts हैं, अन्यथा कि विन्यास ध्वज को हटा दें। मुझे यकीन नहीं है कि क्यों, लेकिन कभी-कभी एक्सटेंशन --with-myextension ध्वज और कभी-कभी --enable-myextension का उपयोग करते हैं, इसलिए ध्वज के उपयोग के लिए configure --help देखें। यदि आप विस्तार ध्वज के बाद =shared जोड़ते हैं, तो इसे एक अलग डीएलएल के रूप में संकलित किया जाएगा, जो हम चाहते हैं।

  17. संकलन: nmake चलाएं nmake snap

  18. हो गया :) C:\php-sdk\php53dev\vc9\x86\php-5.3.10\Release (गैर-थ्रेड-सुरक्षित) या C:\php-sdk\php53dev\vc9\x86\php-5.3.10\Release_TS (थ्रेड-सुरक्षित) देखें। आपकी संकलित बाइनरी वहां होनी चाहिए। संकलित एक्सटेंशन (pecl), pecl-5.3.10-nts-Win32-VC9-x86.zip से संबंधित ज़िप फ़ाइल में होना चाहिए। इस फ़ाइल को खोलें और extensio DLL को अपने PHP स्थापना में अपने ext फ़ोल्डर में निकालें।

  19. PHP एक्सटेंशन सक्षम करें और अपने वेबसर्वर को पुनरारंभ करें। phpinfo() चलाएं और जांचें कि एक्सटेंशन सक्षम है।

  20. यदि एक्सटेंशन ठीक से काम नहीं करता है, तो सुनिश्चित करें कि आप अपने PATH चर को अपडेट करने के लिए रीबूट करें। मेरे मामले में, मुझे अपने PATH चर में imagemagick इंस्टॉल निर्देशिका की आवश्यकता है।

  21. ???

  22. लाभ!

+0

मैं निर्देशों के इस खूबसूरत टुकड़े को लिखने में समय लेने के लिए धन्यवाद देना चाहता हूं। वास्तव में सहायक! –

0

क्या आपके पास संकलन करने की आवश्यकता है? क्यों डाउनलोड नहीं? यह आमतौर पर विंडोज पर बहुत आसान/तेज है।

VC6: http://www.sk89q.com/2010/03/vc6-windows-binaries-for-imagick-2-3-0/

VC9: http://valokuva.org/builds/

+0

मैंने Valokuva.org से बिल्ड करने का प्रयास किया, लेकिन उन्होंने मेरे मैन्युअल रूप से स्थापित सर्वर या WAMP पर काम नहीं किया। Sk89q.com से द्विआधारी भी काम नहीं कर पाए। यही कारण है कि मैं imagemagick के नवीनतम संस्करण के खिलाफ 3.1.0b1 संकलित करना चाहता हूं। – F21

+0

मेरा मतलब 3.1.0rc1 3.1.0b1 नहीं था। – F21