दिलचस्प पोस्ट
एसक्यूएल सर्वर में एक चर में संग्रहीत कार्यप्रणाली का उत्पादन कैसे वापस करें दूसरे में एक सी स्रोत फ़ाइल भी शामिल है? एलएम () सूत्र में वेरिएबल्स के एक वेक्टर को पारित करना जावास्क्रिप्ट पॉपअप की पुष्टि करें हाँ, ठीक है और रद्द करने के बजाय कोई बटन नहीं है क्लोनिंग के बिना जीआईटी रेपो में फाइलें ब्राउज़ करें और प्रदर्शित करें पिक्सल को सपा में परिवर्तित करें MySQL: ग्रुप बाय में नहीं है मैं एक पायथन सबप्रोसेक्शन 'स्टडिन को कैसे लिखूं? R: बहुत सारे बिंदुओं के साथ स्कैटरप्लॉट क्यों मेरी jQuery: नहीं () चयनकर्ता सीएसएस में काम नहीं कर रहा है? Django लगातार डेटाबेस कनेक्शन मैं कैसे जांच सकता हूं कि जावा प्रोग्राम के इनपुट / आउटपुट स्ट्रीम एक टर्मिनल से जुड़े हैं? एमपीआई संचार लागत को मापने के लिए उपकरण आईओएस फ़ायरबेज पुश नोटिफिकेशन: फायरबेज उपयोगकर्ता के डिवाइस टोकन और नोटिफिकेशन भेजने के लिए कैसे करें बहु-आयामी को फ्लैट सरणी को कनवर्ट करें

पूर्ण यूआरएल का उपयोग करते समय PHP file_get_contents बहुत धीमा है

मैं एक स्क्रिप्ट के साथ काम कर रहा हूं (जो मैंने मूल रूप से नहीं बनाया है) जो एक HTML पृष्ठ से एक पीडीएफ फाइल उत्पन्न करता है समस्या यह है कि अब प्रक्रिया में 1-2 मिनट की तरह, बहुत लंबा समय लग रहा है। माना जाता है कि यह मूल रूप से ठीक काम कर रहा था, लेकिन पिछले कुछ हफ्तों के भीतर धीमा हो गया है।

स्क्रिप्ट php स्क्रिप्ट पर file_get_contents कॉल करता है, जो फिर परिणाम को सर्वर पर एक HTML फ़ाइल में आउटपुट करता है, और उस फ़ाइल पर पीडीएफ जनरेटर ऐप चलाता है।

मुझे लगता है कि file_get_contents कॉल को एक स्थानीय यूआरएल के बजाय एक स्थानीय पथ की बजाय समस्या से कम किया गया है।

जब मैं उपयोग करता हूँ

 $content = file_get_contents('test.txt'); 

यह लगभग तुरंत प्रक्रिया करता है हालांकि, अगर मैं पूर्ण यूआरएल का उपयोग करता हूँ

 $content = file_get_contents('http://example.com/test.txt'); 

यह प्रक्रिया 30-90 सेकंड से कहीं भी लेता है।

यह हमारे सर्वर तक सीमित नहीं है, यह किसी भी बाहरी यूआरएल तक पहुंचने में धीमी है, जैसे http://www.google.com मेरा मानना ​​है कि स्क्रिप्ट पूर्ण यूआरएल कहती है क्योंकि वहाँ क्वेरी स्ट्रिंग वेरिएबल हैं जो आवश्यक हैं जो काम नहीं करते अगर आप स्थानीय रूप से फ़ाइल को कॉल करते हैं।

मैंने भी fopen , readfile और curl की कोशिश की, और ये सभी इसी तरह धीमा थे। यह तय करने के लिए कहां पर विचार करें?

वेब के समाधान से एकत्रित समाधान "पूर्ण यूआरएल का उपयोग करते समय PHP file_get_contents बहुत धीमा है"

नोट: इसे PHP 5.6.14 में तय किया गया है। एक Connection: close हेडर अब स्वत: ही HTTP / 1.0 अनुरोधों के लिए भी भेजा जाएगा। 4b1dff6 देखें

मेरे पास फाइल_गेट_कंटेंट स्क्रिप्ट की धीमी गति के कारणों का पता लगाने में कठिन समय था I

वाइरहार्क के साथ इसका विश्लेषण करके, यह मुद्दा (मेरे मामले में और संभवतः आपका भी) था कि रिमोट वेब सर्वर 15 सेकंड तक की टीसीपी कनेक्शन बंद नहीं कर रहा था (अर्थात "रख-जिंदा")।

दरअसल, file_get_contents एक "कनेक्शन" HTTP हेडर नहीं भेजता है, इसलिए दूरस्थ वेब सर्वर डिफ़ॉल्ट रूप से समझता है कि यह एक जीवित रहने वाला कनेक्शन है और 15 सेकंड तक टीसीपी स्ट्रीम बंद नहीं करता है (यह मानक मान नहीं हो सकता है – निर्भर करता है सर्वर पर conf)।

एक सामान्य ब्राउज़र यह विचार करेगा कि पृष्ठ पूरी तरह से भरी हुई है अगर HTTP पेलोड लंबाई प्रतिक्रिया-सामग्री में निर्दिष्ट लंबाई तक पहुँचता है। File_get_contents ऐसा नहीं करता है और यह शर्म की बात है

उपाय

अतः, यदि आप समाधान जानना चाहते हैं, तो यहां यह है:

 $context = stream_context_create(array('http' => array('header'=>'Connection: close\r\n'))); file_get_contents("http://www.something.com/somepage.html",false,$context); 

यह बात केवल दूरदराज के वेब सर्वर को डाउनलोड बंद करने के लिए कनेक्शन को बंद करने के लिए बताने के लिए है क्योंकि फ़ाइल_गेट_कंटेंट सामग्री-लंबाई HTTP शीर्षलेख का उपयोग करके खुद को स्वयं करने के लिए पर्याप्त बुद्धिमान नहीं है।

मैं बाहरी सामग्री लाने के लिए कर्ल () का उपयोग करता हूं, क्योंकि यह file_get_contents विधि से बहुत तेज है निश्चित नहीं कि यह समस्या को हल करेगा, लेकिन एक शॉट के लायक है।

यह भी ध्यान रखें कि आपके सर्वर की गति फ़ाइल को पुनः प्राप्त करने के लिए आवश्यक समय पर प्रभाव पड़ेगी।

यहां उपयोग का एक उदाहरण है:

 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://example.com/test.txt'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); 

कभी-कभी, ऐसा इसलिए है क्योंकि DNS आपके सर्वर पर बहुत धीमा है, इसे आज़माएं:

बदलने के

 echo file_get_contents('http://www.google.com'); 

जैसा

 $context=stream_context_create(array('http' => array('header'=>"Host: www.google.com\r\n"))); echo file_get_contents('http://74.125.71.103', false, $context); 

मेरी भी यही समस्या थी,

केवल एक चीज जो मेरे लिए काम करती है वह $options सरणी में टाइमआउट सेट कर रहा है

 $options = array( 'http' => array( 'header' => implode($headers, "\r\n"), 'method' => 'POST', 'content' => '', 'timeout' => .5 ), ); 

क्या आप उस यूआरएल को सर्वर पर, कमांड लाइन से लाने की कोशिश कर सकते हैं? कर्ल या wget मन में आते हैं यदि वे सामान्य गति से यूआरएल को पुनः प्राप्त करते हैं, तो यह नेटवर्क की समस्या नहीं है और एपाचे / पीएचपी सेटअप में कुछ संभव है

 $context = stream_context_create(array('http' => array('header'=>'Connection: close\r\n'))); $string = file_get_contents("http://localhost/testcall/request.php",false,$context); 

समय: 50 9 76 एमएस (कुल 5 प्रयासों में avaerage समय)

 $ch = curl_init(); $timeout = 5; curl_setopt($ch, CURLOPT_URL, "http://localhost/testcall/request.php"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); echo $data = curl_exec($ch); curl_close($ch); 

समय: 46679 एमएस (कुल 5 प्रयासों में avaerage समय)

नोट: request.php का उपयोग mysql डेटाबेस से कुछ डेटा लाने के लिए किया जाता है।

मेरे पास एपीआई द्वारा पारित एक बड़ा डेटा है, मैं डेटा को पढ़ने के लिए file_get_contents का उपयोग कर रहा हूं, लेकिन इसमें लगभग 60 सेकंड लग गए । हालांकि, KrisWebDev के समाधान का उपयोग कर इसे लगभग 25 सेकंड ले गए

 $context = stream_context_create(array('https' => array('header'=>'Connection: close\r\n'))); file_get_contents($url,false,$context); 

मैं कर्ल के साथ क्या विचार भी करता हूं कि आप अनुरोधों के "थ्रेड" कर सकते हैं इससे मुझे बेहद मदद मिली है क्योंकि मेरे पास PHP के संस्करण तक पहुंच नहीं है जो इस समय थ्रेडिंग की अनुमति देता है।

उदाहरण के लिए, मुझे file_get_contents का उपयोग कर रिमोट सर्वर से 7 छवियां मिल रही हैं और यह प्रत्येक अनुरोध के लिए 2-5 सेकंड ले रहा था। यह प्रक्रिया केवल प्रक्रिया में 30 सेकेंड या कुछ और जोड़ रही थी, जबकि उपयोगकर्ता पीडीएफ के लिए इंतजार कर रहा था।

यह सचमुच लगभग 1 छवि के लिए समय कम कर दिया। एक और उदाहरण, मैं 36 यूआरएल को उस समय की पुष्टि करता हूं जब कोई ऐसा करने से पहले लिया गया था मुझे लगता है आपको बात समझ में आ गयी है। 🙂

  $timeout = 30; $retTxfr = 1; $user = ''; $pass = ''; $master = curl_multi_init(); $node_count = count($curlList); $keys = array("url"); for ($i = 0; $i < $node_count; $i++) { foreach ($keys as $key) { if (empty($curlList[$i][$key])) continue; $ch[$i][$key] = curl_init($curlList[$i][$key]); curl_setopt($ch[$i][$key], CURLOPT_TIMEOUT, $timeout); // -- timeout after X seconds curl_setopt($ch[$i][$key], CURLOPT_RETURNTRANSFER, $retTxfr); curl_setopt($ch[$i][$key], CURLOPT_HTTPAUTH, CURLAUTH_ANY); curl_setopt($ch[$i][$key], CURLOPT_USERPWD, "{$user}:{$pass}"); curl_setopt($ch[$i][$key], CURLOPT_RETURNTRANSFER, true); curl_multi_add_handle($master, $ch[$i][$key]); } } // -- get all requests at once, finish when done or timeout met -- do { curl_multi_exec($master, $running); } while ($running > 0); 

फिर परिणामों की जांच करें:

  if ((int)curl_getinfo($ch[$i][$key], CURLINFO_HTTP_CODE) > 399 || empty($results[$i][$key])) { unset($results[$i][$key]); } else { $results[$i]["options"] = $curlList[$i]["options"]; } curl_multi_remove_handle($master, $ch[$i][$key]); curl_close($ch[$i][$key]); 

फिर बंद फाइल:

  curl_multi_close($master); 

मुझे पता है कि यह पुराना सवाल है लेकिन मुझे आज यह पता चला है और जवाब मेरे लिए काम नहीं करते। मैंने किसी को यह नहीं बताया कि आईपी प्रति अधिकतम कनेक्शन 1 पर सेट हो सकते हैं। इस तरह आप API अनुरोध कर रहे हैं और एपीआई एक और अनुरोध कर रहा है क्योंकि आप पूर्ण यूआरएल का उपयोग करते हैं। इसलिए डिस्क कार्य से सीधे लोड हो रहा है मेरे लिए एक समस्या तय की गई है:

 if (strpos($file->url, env('APP_URL')) === 0) { $url = substr($file->url, strlen(env('APP_URL'))); } else { $url = $file->url; } return file_get_contents($url);