2012-06-28 14 views
5

मैं proc_open का उपयोग कर प्रक्रिया निष्पादित करने का प्रयास कर रहा हूं। प्रक्रिया के लिए I/O पाइपों द्वारा संभाला जाता है !!fclose(): 18 मान्य स्ट्रीम संसाधन नहीं है

$descriptorspec = array(
    0 => array("pipe", "r"), 
    1 => array("pipe", "w"), 
    2 => array("pipe", "w") 
); 

अब, के रूप में यह होता है, कभी-कभी "ग कार्यक्रम 'कि मैं खोल दिया अटक जाते है, और मैं एक max_time_limit जांच करते हैं कि जबरन प्रक्रिया को बंद कर दिया जाएगा जोड़ लिया है। जब भी "प्रक्रिया समाप्त हो जाती है" वैध तरीके से या मजबूती से सूचना को संसाधित करने के लिए मैंने कॉलबैक फ़ंक्शन - अर्थात "call_user_function" का उपयोग करके) पर कॉलबैक फ़ंक्शन जोड़ा है।

'प्रस्थान' समारोह में, मैं मैं/हे पाइप

foreach ($pipes as $pipe) { 
    fclose($pipe); 
} 

ऊपर काम करता है बिल्कुल ठीक बंद करने कर रहा हूँ अगर प्रक्रिया एक वैध बाहर निकलने पड़ा है। हालांकि, अगर मैंने जबरन मेरी प्रक्रिया को मार डाला, तो मैंने ऐसा करने के लिए proc_terminate कहा। मैं समझता हूं कि प्रक्रिया समाप्त करने से आगे बढ़ना होगा और किसी भी I/O पाइप को बंद कर दिया जाएगा, लेकिन समस्या यह है कि कॉलबैक के कारण, मेरी "ऑनएक्सिट" फ़ंक्शन प्रक्रिया हमेशा कॉल हो जाती है (और यही वह तरीका है जिसे मैं चाहता हूं .. .as मुझे कुछ और प्रोसेसिंग करने की ज़रूरत है)। अब, इस मामले में, जैसा कि मैंने पाइप बंद करने की कोशिश, मैं निम्नलिखित त्रुटि मिलती है:

fclose(): 18 is not a valid stream resource 

मैं "ftell" का उपयोग करें कि क्या पाइप वैध है या नहीं, लेकिन वह भी बाहर errored की जाँच करने की कोशिश की। मैं कैसे जांचूं कि पाइप पहले ही बंद हो चुके हैं या नहीं ??

+0

आप उन पाइप को क्यों बंद कर रहे हैं? वे आपकी लिपि को समाप्त करने पर कचरा कलेक्टर द्वारा स्वचालित रूप से बंद हो जाएंगे। – lanzz

+0

@lanzz: मैं बस यह सुनिश्चित करना चाहता था कि इससे कोई अराजकता न हो। –

+0

@ बार्ट: आपसे सहमत हैं ... पहले इस पर ध्यान नहीं दे रहा था .... अब वह करना शुरू कर दिया है .... सभी अन्य प्रश्न भी जायेंगे और अपडेट करेंगे ... धन्यवाद! –

उत्तर

12

क्या पता चल सके कि संसाधन अभी भी यह बंद करने के लिए प्रयास करने से पहले एक संसाधन है के बारे में:

foreach ($pipes as $pipe) { 
    // Finds whether a variable is a resource 
    if(is_resource($pipe)) { 
    fclose($pipe); 
    } 
} 
+0

हाँ वास्तव में ...... यह करता है .... धन्यवाद एक टन! –

-1

या यदि आपका कोड ठीक से काम कर रहा है और कहा कि सिर्फ एक "चेतावनी" है तो @ के साथ एक चेतावनी बंद कर दें। बस इतना ही।

@fclose($pipe); 
संबंधित मुद्दे