2012-12-05 4 views
5

के तहत पॉपन और पॉक्लोज़ मैंने एक ऐसी घटना पर ठोकर खाई है जिसे मैं स्वयं समझा नहीं सकता।जेन-सर्वर

मैं PHP को निष्पादित करने के लिए पॉपन का उपयोग कर रहा हूं और उसके बाद एक php स्क्रिप्ट निष्पादित करता हूं, और उसे बंद करने के लिए pclose। अभी तक बहुत अच्छा है। मैं काफी गंभीर परेशानियों में भाग गया क्योंकि जिस स्क्रिप्ट का मैंने उपयोग किया था, वह निष्पादित नहीं हुआ था और इसके बजाय इसे लगातार 3 बार कोशिश करने के बाद मैंने ज़ेंड-सर्वर को क्रैश कर दिया (कोई पृष्ठ और नहीं खुल जाएगा)। मुझे पता चला कि इसका कारण यह था कि मैंने php.exe के लिए गलत निर्देशिका का उपयोग किया था। उदाहरण:

if (pclose(popen("C:\wrongDir\php\php.exe C:\Zend\Apache2\htdocs\myApp\public\mytest.php 57 > C:\Logs\1\0\jobOut.log 2> C:\Logs\1\0\jobErr.log"))>-1) 
{ 
..... 
} 
एक तरफ "wrongDir" अन्य सभी dirs से

सही थे .... popen भी jobOut और jobErr फ़ाइलें (जो खाली थे) बनाया। (टिप्पणी: PHP एक खोजपाथ में नहीं है इसलिए यह सही पथ के बिना नहीं मिला था)

भले ही मैंने अब समस्या हल की है .... मेरे पास सवाल है यदि यह एक सामान्य व्यवहार है, या अगर मैंने कुछ गलत किया है (शायद सर्वर सेटिंग्स भी)।मैन्युअल में दोनों आदेशों के बारे में मैंने जो कुछ पढ़ा है, उससे मुझे यह सुना है कि मेरे मामले में मुझे या तो -1 या 0 का रिटर्न वैल्यू होना चाहिए था और समस्या के साथ मैं समस्या में भाग गया था और फिर सर्वर लटक रहा था)।

धन्यवाद।

उत्तर

1

ऐसा प्रतीत होता है कि pclose() प्रक्रिया की निकास स्थिति वापस नहीं करता है बल्कि प्रक्रिया को बंद करने की क्षमता के बजाय।

प्रक्रिया समाप्ति 'कोड' उपयोग pcntl_wifexited() और pcntl_wexitstatus प्राप्त करने के लिए()

http://php.net/manual/en/function.pclose.php
http://php.net/manual/en/function.pcntl-wexitstatus.php

+0

दिलचस्प हालांकि एक सवाल ही नहीं रहेगा। यह वहां क्यों दुर्घटनाग्रस्त हो जाता है (इस प्रकार बाल प्रक्रिया लटकती है। हालांकि अगर मैं कमांडलाइन में एक ही कमांड टाइप करता हूं तो यह एक त्रुटि के साथ समाप्त होता है और मैं कमांडलाइन प्रॉम्प्ट पर फिर से आ जाता हूं .... वहां कोई लटक नहीं है। तो मेरे प्रश्न का वह हिस्सा अगर यह एक सामान्य व्यवहार है या यदि यह एक संभावित कॉन्फ़िगरेशन त्रुटि है, जब मैं php के माध्यम से त्रुटिपूर्ण आदेश चलाता हूं तो बाल प्रक्रिया अनिश्चित काल तक सक्रिय रहती है) इस प्रकार प्रक्रिया अभी भी "चल रही है" इसे उत्पन्न नहीं करना चाहिए था वहाँ बाहर निकलें कोड। – Thomas

+0

मुझे आश्चर्य है कि popen/pclose घोंसला घोंसला समस्या पैदा कर रहा है। यदि आप इसे कई पंक्तियों में विभाजित करते हैं तो क्या यह अभी भी दुर्घटनाग्रस्त है? – ethrbunny

+0

तो ज़ेन सर्वर पर इसका परीक्षण नहीं कर सका (वह वर्तमान में उपलब्ध नहीं है) लेकिन मैं xampp पर थोड़ा परीक्षण करने में सक्षम था। समस्या पॉपन/pclose द्वारा सीधे कारण नहीं है! ऐसा लगता है कि यह वेबसर्वर खुद के कारण होता है। जब nonexisting exe को एक त्रुटि संदेश चेतावनी बॉक्स कहा जाता है सर्वर पर खुलता है (वेबसर्वर द्वारा स्वयं बनाया गया .... इस प्रकार ज़ेंड सर्वर पर मैंने इसे नहीं देखा लेकिन अब मेरी स्थानीय मशीन पर स्थानीय वेबसर्वर के साथ)। और उस प्रक्रिया को खुले रखा ताकि वह बंद न हो। pcntl_wifexited() के लिए मैं वहां सही हूं कि मुझे फिर से करने की आवश्यकता होगी ताकि मैं एकाधिक प्रोसेस के लिए pcntl_fork का उपयोग कर सकूं? – Thomas