Get PHP proc_open() to read a PhantomJS stream for as long as png is created -


मेरे पास एक PHP स्क्रिप्ट थी, जो shell_exec () पर निर्भर था और (परिणामस्वरूप) 99 काम किया था % समय की। स्क्रिप्ट ने एक फाँटमजीएस स्क्रिप्ट निष्पादित की जो एक छवि फ़ाइल का उत्पादन करती थी। फिर अधिक PHP का उपयोग करते हुए कि छवि फ़ाइल को एक निश्चित तरीके से संसाधित किया गया था। समस्या यह थी कि कभी कभी shell_exec () लटकाएगा और प्रयोज्यता वाले मुद्दों का कारण होगा। इसे पढ़ना मैंने सीखा है कि shell_exec () समस्या है और proc_open पर स्विचिंग फांसी को हल करेगा।

समस्या यह है कि जब shell_exec निष्पादित कमांड के लिए proc_open को समाप्त करने के लिए इंतजार करता है, और इसलिए PHP आज्ञाओं का पालन करें और उत्पन्न छवि पर काम करना विफल हो जाता है क्योंकि छवि अभी भी तैयार की जा रही है मैं विंडोज पर काम कर रहा हूं, इसलिए pcntl_waitpid एक विकल्प नहीं है।

मैं जो कुछ करने की कोशिश कर रहा हूं, वह लगातार फैंटमजेएस आउटपुट (कुछ भी) है, ताकि proc_open < / कोड> इसे स्टडिन पाइप के माध्यम से पढ़ा जाएगा और इस तरह से मैं छवि प्रसंस्करण PHP फ़ंक्शंस को समय के साथ काम करना शुरू कर सकता हूं जैसे कि लक्ष्य छवि फ़ाइल तैयार है।

यहां मेरी फिटकॉम जेएस स्क्रिप्ट है:

  अंतराल = सेट इन्टरवाल (फ़ंक्शन () {console.log ("x");}, 250); Var पृष्ठ = आवश्यकता ('वेबपेज')। बनाएँ (); Var args = की आवश्यकता होती है ('सिस्टम')। Args; Page.open ('http://www.cnn.com', फ़ंक्शन () {page.render ('test.png'); phantom.exit ();});  

और मेरा PHP कोड:

  ob_implicit_flush (सत्य); $ Descriptorspec = सरणी (0 = & gt; सरणी ("पाइप", "आर"), // stdin 1 = & gt; सरणी ("पाइप", "वा"), // stdout 2 = & gt; सरणी ("पाइप" , "W") // stderr); $ प्रक्रिया = proc_open ("c: \ phantomjs \ phantomjs.exe /test.js", $ वर्णनकर्ताओं, $ पाइप); अगर (is_resource ($ प्रक्रिया)) {जबकि (! फीफ ($ पाइप [1])) {$ return_message = fgets ($ पाइप [1], 1024); अगर (strlen ($ return_message) == 0) तोड़; गूंज $ वापसी_संदेश। '& Lt; br / & gt;'; ob_flush (); फ्लश (); }}  

test.png उत्पन्न है, लेकिन मुझे एक भी $ return_message नहीं मिल रहा है क्या मैं गड़बड़ कर रहा हूं?

आपके लिंक किए गए गिथूब मुद्दे में, आप उपयोग कर सकते हैं:

<प्री> Proc_Close (Proc_Open ("प्रेतजज टेस्ट। जेएस एंड ए, अर्रे (), $ एफू));

अपने phantomjs स्क्रिप्ट चलाने के लिए (जो कि पर आधारित है)। ऐसा लगता है कि आपको केवल छवि की आवश्यकता है, इसलिए इस मामले में पाइप आवश्यक नहीं हैं।

संदर्भ के लिए पूरी स्क्रिप्ट है और जैसे ही खिड़कियों पर काम करता है।


Comments

Popular posts from this blog

Member with no value in F# -

java - Joda Time Interval Not returning what I expect -

c# - Showing a SelectedItem's Property -