2012-04-16 4 views
7

मैं एक ऐप बना रहा हूं जो एक बिंदु पर बाहरी यूआरएल से कुछ सामग्री को घुमाता है। अब तक, यह हमेशा जल्दी/तुरंत समाप्त हो गया है। हालांकि, मुझे यकीन नहीं है कि बाहरी सर्वर को जवाब देने में लंबा समय लगेगा तो क्या होगा। जब तक कर्ल समाप्त नहीं हो जाता तब तक PHP निम्नलिखित कोड के निष्पादन के साथ प्रतीक्षा करेगा?PHP: पृष्ठभूमि में कर्ल खत्म हो जाएगा, या सभी आगे स्क्रिप्ट निष्पादन ब्लॉक?

मैं वास्तव में इसका परीक्षण नहीं कर सकता क्योंकि मुझे नहीं पता कि धीमी प्रतिक्रिया "अनुकरण" कैसे करें। मुझे आशा है कि यह छद्म कोड मेरे सवाल का स्पष्ट करता है:

$ch = curl_init($some_remote_url); 
$fp = fopen($some_local_file, 'wb'); 
curl_setopt($ch, CURLOPT_FILE, $fp); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_exec($ch); // Let's say this takes 20 seconds until the other server responds 
curl_close($ch); 
fclose($fp); 
redirect($some_other_url); // Will this be executed instantly or only after 20 seconds? 

कारण है कि मैं इस बारे में सोच रहा हूँ कि मैं अपने उपयोगकर्ता मामले दूरस्थ सर्वर में 20 सेकंड के लिए एक "लोड हो रहा है" पृष्ठ को देखने के लिए नहीं करना चाहते धीरे-धीरे प्रतिक्रिया दे रहा था, इसलिए मुझे शायद पूरी प्रक्रिया को क्रॉन नौकरी में ले जाना पड़ेगा। उपयोगकर्ता को कर्लिंग के तुरंत परिणाम की आवश्यकता नहीं है, इसलिए जब प्रक्रिया समाप्त हो जाती है तो इससे कोई फर्क नहीं पड़ता।

+0

+1 अच्छा सवाल ... 20sec – Baba

उत्तर

4

कर्ल निष्पादन को अवरुद्ध करेगा। आप पृष्ठभूमि (अतुल्यकालिक रूप से) में फ़ाइल डाउनलोड करने के लिए, या तो एक क्रॉन निर्धारित कार्य का उपयोग करें, या इस प्रकार का आदेश exec चाहते हैं:

system("wget URL &"); 
+0

निश्चित रूप से के बाद जहाँ तक मुझे पता है, सिस्टम() या exec() का उपयोग नियमित रूप से curl जैसे सिंक्रोनस कार्यों से अलग नहीं होता है, लेकिन passthru() करता है। दुर्भाग्यवश सुरक्षा कारणों से, अधिकांश होस्ट किए गए सर्वरों पर इन सभी तीन कार्यों को अक्षम कर दिया गया है। – ddlab

0

मुझे नहीं पता कि यह स्क्रिप्ट निष्पादन को रोक देगा, लेकिन आप एक स्क्रिप्ट बना सकते हैं जो सीधे रिमोट कंप्यूटर पर आउटपुट प्रस्तुत करता है और फिर आप जिस कर्ल एक्शन को चाहते हैं उसे करने के लिए AJAX के माध्यम से दूसरी स्क्रिप्ट के माध्यम से शुरू होता है। अंत में यह एक प्रतिक्रिया वापस कर देगा और आपकी जेएस स्क्रिप्ट फिर रीडायरेक्ट करेगा, या आप क्या चाहते हैं।

बेशक यह केवल उन उपयोगकर्ताओं द्वारा काम करेगा जिनके पास जेएस सक्षम है, लेकिन केवल यह कहने के लिए: जिनके पास अपने ब्राउजर में जेएस सक्षम नहीं है, वे सामान्य रूप से वेब पर ब्राउज़ नहीं कर सकते हैं।

संबंधित मुद्दे