2011-11-06 13 views
8

के लिए भेजने और प्रतीक्षा करने की आवश्यकता नहीं है, मुझे एक PHP कर्ल कॉन्फ़िगरेशन की आवश्यकता है ताकि मेरी स्क्रिप्ट अनुरोध भेज सके और API द्वारा भेजे गए उत्तरों को अनदेखा कर सके।PHP कर्ल को केवल

curl_setopt($ch,CURLOPT_URL,$url); 
curl_setopt($ch,CURLOPT_POST,count($fields)); 
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string); 
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); 
//curl_setopt($ch, CURLOPT_TIMEOUT_MS, 100); 
$result = curl_exec($ch); 
echo $result; 
curl_close ($ch); 

मैं जोड़ने की कोशिश की: // curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, झूठी); // curl_setopt ($ ch, CURLOPT_TIMEOUT_MS, 100);

लेकिन यह ठीक से काम नहीं कर रहा है और एपीआई वेबसर्वर अनुरोध प्राप्त नहीं कर रहा है।

इसका कारण यह है कि मैं एपीआई को बड़ी संख्या में अनुरोध भेज रहा हूं इसलिए मेरी स्क्रिप्ट बहुत धीमी है क्योंकि यह प्रत्येक अनुरोध के लिए प्रतीक्षा करती है।

किसी भी मदद की सराहना की जाती है।

उत्तर

6

`

public function cccc($test=1) { 
if($test==1) { 
    $url = 'http://examplesite.com/test/cccc/2'; 
    $curl = curl_init();     
    $post['test'] = 'test'; 
    curl_setopt($curl, CURLOPT_URL, $url); 
    curl_setopt ($curl, CURLOPT_POST, TRUE); 
    curl_setopt ($curl, CURLOPT_POSTFIELDS, $post); 

    curl_setopt($curl, CURLOPT_USERAGENT, 'api'); 
    curl_setopt($curl, CURLOPT_TIMEOUT, 1); 
    curl_setopt($curl, CURLOPT_HEADER, 0); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, false); 
    curl_setopt($curl, CURLOPT_FORBID_REUSE, true); 
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 1); 
    curl_setopt($curl, CURLOPT_DNS_CACHE_TIMEOUT, 10); 

    curl_setopt($curl, CURLOPT_FRESH_CONNECT, true); 

    $data = curl_exec($curl); 
    echo $data; 


    curl_close($curl); 
} else { 
    ob_end_clean(); 
    header("Connection: close\r\n"); 
    header("Content-Encoding: none\r\n"); 
    header("Content-Length: 1"); 
    ignore_user_abort(true); 

    sleep(10); 
    $this->db->query('UPDATE new_hook_memory SET new=new+1 WHERE id=1');  

    }} 

// परीक्षण

`

+20

क्या आप कोड में किसी भी कॉमेंट को जोड़ने में मध्य नहीं हैं? यह बेकार है। –

+1

बहुत बढ़िया, यह काम करता है, धन्यवाद! –

+0

यह काम करता है, लेकिन यदि आप बहुत छोटे टाइमआउट (मेरे मामले में 10 मिलीसेकंड) सेट करते हैं, तो अनुरोध पूरी तरह से भेजे जाने से पहले बाधित हो जाता है। –

0

आप कैसे बता सकते हैं कि अनुरोध सफल हुआ या नहीं? सर्वर को कम से कम स्थिति कोड को निर्धारित करने के लिए आपको इंतजार करना होगा। यदि विलंबता समस्या है, तो समानांतर में एकाधिक अनुरोध करने के लिए कर्ल मल्टी एपीआई देखें। एक बार स्टेटस कोड लौटाए जाने के बाद आपको लौटाए गए डेटा के रिसेप्शन को रद्द करने के लिए एक कॉलबैक फ़ंक्शन सेट करने में सक्षम होना चाहिए।

3

आप पृष्ठभूमि में wget चला सकते हैं यदि संभव हो तो देर से अब (exec का प्रयोग करके)

+0

यह समस्या का समाधान नहीं करता है। यह पृष्ठभूमि कर्ल के बराबर है, और अभी भी प्रतिक्रिया के लिए इंतजार कर रहे एक प्रक्रिया होगी, कम्प्यूटेशनल संसाधनों का उपभोग। – Bladt

2

थोड़ा लेकिन के लिए इस का हल कोई भी दिलचस्पी है कि CURLOPT_RETURNTRANSFER को सत्य पर सेट करने की आवश्यकता है, झूठी नहीं। इस तरह curl_exec फ़ंक्शन लौटने से पहले अनुरोध को पूरा करने के इंतजार के बजाय तुरंत एक मान देता है - यानी यह सिंक्रनाइज़ेशन के बजाय असीमित रूप से कार्य करता है।

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
+2

रेजा ने कुछ और पूछा – popas

+2

इस उत्तर में अभी भी 2 अंक हैं? –

+0

सही करने के लिए CURLOPT_RETURNTRANSFER को सेट करना सुनिश्चित करें कि अनुरोध को पूरा करने के लिए प्रतीक्षा करने के बजाय मुझे सीधे वापसी मूल्य मिल गया है। क्या ओपी ने क्या नहीं पूछा? – ljelewis

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