दिलचस्प पोस्ट
क्यों $ _REQUEST खाली है? मूल वर्ग को बदलने के बिना धारावाहिककरण के दौरान कुछ गुणों को छोड़कर Android अधिसूचना ध्वनि एक नया पैरामीटर के रूप में बाल इंटरफ़ेस के साथ विधि पैरामीटर ओवरराइड करें वाईफ़ाई नेटवर्क स्थिति परिवर्तन पर अधिसूचित कैसे किया जाए? कैस्परजेएस में तब () बयान में क्या लिपटे जाना चाहिए? सिंक / async फ़ंक्शंस के निष्पादन आदेश का निर्धारण कैसे करें? ऑब्जेक्टिव-सी में ऑब्जेक्ट का आकार जांचना बाइटरी फाइलों के बिना गिटग्नॉर जार के अंदर जार का संदर्भ Android, ListView IllegalStateException: "एडेप्टर की सामग्री बदल गई है लेकिन ListView को एक सूचना प्राप्त नहीं हुई" क्या मैं जीवनकाल का उपयोग कर जंग स्ट्रैक्ट्स बनाने के लिए करता हूं जो कि एक-दूसरे को चक्रीय रूप से संदर्भित करते हैं? मैं अपने .NET 3.5 वेब अनुप्रयोगों में ASP.NET AJAX नियंत्रण टूलकिट को कैसे स्थापित और उपयोग कर सकता हूं? कैसे कार्यान्वित करने के लिए किया RemyiveMemoryWarning? ओपनसीवी वीडियोकैपचर के लिए स्थायी फिक्स बहुत सारे डेटा.फ्रेम को मर्ज करना

पूर्ण यूआरएल का उपयोग करते समय 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 की कोशिश की, और ये सभी इसी तरह धीमा थे। यह तय करने के लिए कहां पर विचार करें?

Solutions Collecting From Web of "पूर्ण यूआरएल का उपयोग करते समय 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);