2015-02-06 5 views
10

काम करती है जब मैं कुछ यूआरएल के लिए PHP के कर्ल विधियों का उपयोग करने का प्रयास करता हूं, तो यह समय समाप्त हो जाता है। जब मैं एक ही यूआरएल के लिए कमांडलाइन का उपयोग करता हूं, तो यह ठीक काम करता है।PHP कर्ल विधियों का समय, लेकिन कमांड लाइन हमेशा

मैं एडब्ल्यूएस का उपयोग कर रहा हूं और एक t2.medium बॉक्स yum से php-55 अपाचे लाइब्रेरी चला रहा है।

function curl($url) { 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_VERBOSE, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_MAXREDIRS, 2); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Accept-Language: en-us' 
)); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); 
curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); 
$fh = fopen('/home/ec2-user/curllog', 'w'); 
curl_setopt($ch, CURLOPT_STDERR, $fh); 
$a = curl_exec($ch); 
curl_close($ch); 
fclose($fh); 
$headers = explode("\n",$a); 
var_dump($headers); 
var_dump($a); 
exit; 

     return $result; 
} 

तो यहाँ कॉल कि ठीक काम करता है::

यहाँ मेरी PHP कोड है

curl('http://www.google.com'); 

और यह गूगल के मुखपृष्ठ के लिए डेटा देता है।

हालांकि, मैं एक और यूआरएल की कोशिश:

curl('http://www.trulia.com/profile/agent-1391347/overview'); 

और मैं curllog में यह मिलता है:

curl -s www.trulia.com/profile/agent-1391347/overview 

यह:

[[email protected] Node]$ cat ../curllog 
* Hostname was NOT found in DNS cache 
* Trying 23.0.160.99... 
* Connected to www.trulia.com (23.0.160.99) port 80 (#0) 
> GET /profile/agent-1391347/overview HTTP/1.1 
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 
Host: www.trulia.com 
Accept: */* 
Accept-Language: en-us 

* Operation timed out after 10002 milliseconds with 0 bytes received 
* Closing connection 0 

अगर मैं कमांड लाइन से इस चलाने तत्काल रिटर्न (1 सेकंड के भीतर) कोई आउटपुट के साथ। यह उम्मीद है। हालांकि जब मैं इसे चलाता हूं:

curl -sL www.trulia.com/profile/agent-1391347/overview 

यह पृष्ठ ठीक तरह से देता है, जैसा कि मैं चाहता हूं।

तो, मेरे कर्ल के साथ क्या गलत है?

curl 

cURL support => enabled 
cURL Information => 7.38.0 
Age => 3 
Features 
AsynchDNS => Yes 
CharConv => No 
Debug => No 
GSS-Negotiate => No 
IDN => Yes 
IPv6 => Yes 
krb4 => No 
Largefile => Yes 
libz => Yes 
NTLM => Yes 
NTLMWB => Yes 
SPNEGO => Yes 
SSL => Yes 
SSPI => No 
TLS-SRP => No 
Protocols => dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, ldaps, pop3, pop3s, rtsp, scp, sftp, smtp, smtps, telnet, tftp 
Host => x86_64-redhat-linux-gnu 
SSL Version => NSS/3.16.2 Basic ECC 
ZLib Version => 1.2.7 
libSSH Version => libssh2/1.4.2 
+0

क्या आप उसी मशीन से कमांड लाइन को PHP कोड के रूप में चला रहे हैं? यदि नहीं, तो आप कर्ल संस्करण की तुलना करना चाह सकते हैं। –

+0

टर्मिनल 'curl --version' का आउटपुट क्या है? और ' hanshenrik

+0

आईआरसी स्निपेट: https://i.imgur.com/bOwxcS3.png - ... और जिस व्यक्ति ने उत्तर दिया, वह लेखक है (lib-) curl – hanshenrik

उत्तर

4

निम्नलिखित लाइनों में टाइमआउट मूल्यों में वृद्धि का प्रयास करें::

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); 
curl_setopt($ch, CURLOPT_TIMEOUT, 10); 

उन सुंदर हैं

पीएचपी 5.5.20

यहाँ मेरी phpinfo से cURL बिट() है शॉर्ट टाइमआउट मान - CURLOPT_TIMEOUT विशेष रूप से पूरे निष्पादन समय को सीमित करता है, बड़े मान देने का प्रयास करें:

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); 
curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
+0

यह कमांड लाइन से तुरंत 1 सेकंड के नीचे चलाता है। मुझे सीएलआई पर 1 लेता है जो करने के लिए PHP में 10 सेकंड की आवश्यकता नहीं है। मैंने इसे डबल मानों के साथ आजमाया और यह अभी भी समय समाप्त हो गया। मैं एक अलग ईसी 2 उदाहरण पर भाग गया और यह पूरी तरह से काम किया। –

3

आप 2 चर

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); 
curl_setopt($ch, CURLOPT_TIMEOUT, 10); 

पहले एक है, CURLOPT_CONNECTTIMEOUT समय की अधिकतम राशि server`

के लिए कनेक्शन बनाने के लिए आप 0 के लिए यह सेट करके आप उसे निष्क्रिय कर सकते हैं की अनुमति दी है।

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); 

है कि लेकिन यह एक अच्छा तरीका नहीं है अगर आप एक उत्पादन वातावरण में हैं, क्योंकि यह समय समाप्त कभी नहीं होगा।

अब CURLOPT_TIMEOUT

से PHP Documentation

सेकंड की अधिकतम संख्या cURL कार्यों को निष्पादित करने की अनुमति के लिए।

कुछ उच्च मूल्य

curl_setopt($ch, CURLOPT_TIMEOUT, 20); // 20 Seconds. 
+0

मेरी विशेष समस्या, और मैं इस पर बक्षीस क्यों डालता हूं, टाइमआउट द्वारा उत्तर नहीं दिया जाता है। पोस्ट में पहले कथन को देखें - मुद्दा यह है कि यह केवल * कभी * * PHP से बुलाया जाता है, लेकिन कमांड लाइन से कभी नहीं कहा जाता है - यहां तक ​​कि जब भी एक ही यूआरएल पर इस्तेमाल किया जाता है। – alzee

+0

मैं अपने पीसी से मापता हूं, इसमें कर्ल कमांड के साथ 10+ सेकंड लगते हैं, अधिकांश समय डेटा स्थानांतरण पर उपयोग किया जाता है। तो इसका मतलब है कि हमने सीडीएन की गति सीमा को ट्रिगर किया (इस उदाहरण के लिए cloudfront.net द्वारा)। आपको यह समझना चाहिए कि गति सीमा को कैसे बाईपास करना है, या बस एक बड़ा CURLOPT_TIMEOUT – tangxinfa

7

के लिए सेट यह मैं अपने कार्य curl() जाँच की यह ठीक लग रहा है है। समारोह में कुछ भी बदलने की जरूरत नहीं है। क्या आप के रूप में यह पैरामीटर के रूप में परिवर्तित करने के लिए कोई जरूरत नहीं है करने के लिए बस URL पारित किया जाता है की आवश्यकता चाहिए HTTPS को HTTP

curl('http://www.trulia.com/profile/agent-1391347/overview');

कारण:

आप पहले से ही curl बताया SSL

सत्यापित नहीं करते के लिए

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

मुझे बताएं कि आपको किसी स्पष्टीकरण की आवश्यकता है या नहीं।

+0

आह सेट करें, सुरक्षा बंद करने की तरह कुछ भी नहीं! :-) – user499211

3

वर्बोज़ उत्पादन एक स्पष्ट टाइमआउट समस्या दिखाता है:

  • ऑपरेशन 10002 मिलीसेकेंड के बाद का समय समाप्त हो के साथ 0 बाइट्स

यह आपके नेटवर्क सेटअप के साथ एक समस्या का संकेत प्राप्त किया। इन्हें ढूंढना कठिन होता है, यह आपके अपने अंत में हो सकता है (उदा। वेबसर्वर या PHP निष्पादन योग्य के संदर्भ में) या दूसरे छोर पर। दोनों स्थानों को एक निश्चित विस्तार के लिए संभव है, हालांकि सर्वर दोनों अनुरोधों को स्वीकार करता है भले ही उनके पास अलग-अलग अनुरोध शीर्षलेख हों, इसलिए यह अधिक संभावना है कि यह निष्पादन संदर्भ संबंधित है जो आप आमतौर पर इसका वर्णन कैसे करते हैं।

जांचें कि क्या PHP के माध्यम से उन अनुरोधों को करने के संबंध में सुरक्षा और अन्य नेटवर्किंग परतों पर कोई प्रतिबंध है या नहीं। जैसे यदि आप सिस्टम प्रशासन और परेशानी-शूटिंग में नहीं हैं तो एक अलग सर्वर छवि आज़माएं। आपके प्रश्न में जो साझा किया जाता है, उससे यह कहना मुश्किल है कि आपका टाइमआउट वास्तव में क्या कारण बनता है।

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