$ परिणाम == -1 लौटने प्रणाली मान लिया जाये कि यूनिक्स की तरह आधारित (मैं नहीं जानता कि कैसे एक ही कोड के साथ विंडोज कैसा व्यवहार करेंगे)
पीएचपी (5.2.9) कार्यकारी() फ़ंक्शन करता है सी exec() आदिम को कॉल न करें (जो -1 देता है यदि यह प्रक्रिया को प्रतिस्थापित/निष्पादित नहीं कर सका, जो यहां मामला नहीं है)। इसके बजाय यह popen() को कॉल करता है जो एक पाइप बनाता है, एक कांटा() करता है और आपके आदेश के साथ एक खोल निष्पादित करता है। रिटर्न_वल्यू, -1, सी आदिम से प्रत्यक्ष परिणाम नहीं है, बल्कि आपके आदेश को संसाधित करने के तरीके के आधार पर आंतरिक रूप से PHP द्वारा बनाया गया है। दूसरे शब्दों में, "ls" कमांड को अच्छी तरह से निष्पादित किया जा सकता है, जबकि उदाहरण के लिए PHP सही ढंग से पाइप बंद नहीं कर सका।
सी/कोड/मानक/exec.c में सी कोड को देखते हुए, दो कारण हो सकते हैं कि रिटर्न कोड -1 है, एक त्रुटि से ट्रिगर किया गया है; popen के बाद 2 एक होता है() फोन
fp = VCWD_POPEN(cmd_p, "r");
if (!fp) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to fork [%s]", cmd);
goto err;
}
// ...
err:
pclose_return = -1;
goto done;
हालांकि इस मामले में, आप नहीं परिणाम देखना होगा, और लॉग एक त्रुटि दिखा सकती है।
बाद में, return_value लाइन
pclose_return = php_stream_close(stream);
(_php_stream_free को देखते हुए) के माध्यम से सेट किया गया है (php_stream_close() एक मैक्रो _php_stream_free के साथ बदल दिया है()), सबसे अधिक संभावना उम्मीदवार कि लौट सकते हैं -1
है
ret = stream->ops->close(stream, preserve_handle ? 0 : 1 TSRMLS_CC);
कौन सा बदले में परोक्ष रूप से सी आदिम pclose कॉल()। मैनुअल
pclose() फ़ंक्शन रिटर्न -1 अगर प्रतीक्षा 4 (2) कोई त्रुटि देता है, या कुछ अन्य त्रुटि का पता चला है।
वहाँ पाइप के समापन, कि स्थापित किया जाना परिणामी डेटा नहीं रोकता के दौरान पाया एक त्रुटि होने लगते हैं।तर्कसंगत कारण खोजने के लिए, किसी को ऑपरेटिंग सिस्टम सेटअप और लॉग, PHP कॉन्फ़िगरेशन और संकलन पैरामीटर की जांच करने की आवश्यकता है।
मैं
- अपने ओएस के लिए पैच लागू करने के लिए, और शायद नवीनतम संस्करण के लिए अद्यतन (यदि लागू हो) की सिफारिश करेंगे,
- 5.3.3 के लिए पीएचपी अद्यतन करने के लिए (के रूप में नवीनतम अब) के बाद से PHP exec() कोड महत्वपूर्ण रूप से बदल गया।
ध्यान रखें कि संस्करण 5.3 में PHP सुहोसिन मॉड्यूल से संबंधित परिवर्तन थे जो डिफ़ॉल्ट रूप से PHP फ़ाइलों को चलाने पर सुरक्षा को बढ़ाते थे।
क्या यदि आपका '$ कमांड' चर एक खाली स्ट्रिंग है ताकि 'exec()' 'ls' को कोई तर्क न दे? क्या बाहर निकलने वाला कोड अभी भी '-1' है? यदि हां, तो क्या आपने अपने मौजूदा सिस्टम के लिए 'ls' के कार्यान्वयन में 'मैन ls' के साथ कार्यान्वित किया है ताकि यह देखने के लिए कि निकास कोड' -1' परिभाषित किया गया है या नहीं? क्या यह अन्य आदेशों के साथ सच है (शायद एक 'du -h index.html')? – sleepynate
ऐसा लगता है कि मैं 'exec (" ") 'को कॉल नहीं कर सकता हूं। यह एक चेतावनी प्रिंट करता है। कोई अन्य आदेश वही व्यवहार करता है। 'नींद 5' रिटर्न -1, 'lsmod' रिटर्न -1 आदि ... – Quamis
केवल एक चीज जो मैं देख सकता हूं वह है [exec php मैन्युअल पृष्ठ पर पोस्ट] (http://www.php.net/manual /en/function.exec.php#76687) लेकिन चूंकि यह अन्य सर्वरों पर काम कर रहा है, यह स्पष्ट नहीं है कि यह क्यों होगा। – Troubadour