यह धीमा है क्योंकि file_get_contents()
पूरी फ़ाइल को $page
में पढ़ता है, PHP सामग्री को आउटपुट करने से पहले प्राप्त होने वाली फ़ाइल के लिए प्रतीक्षा करता है। तो आप क्या कर रहे हैं: सर्वर फ़ाइल पर पूरी फ़ाइल डाउनलोड करना, फिर इसे एक विशाल स्ट्रिंग के रूप में आउटपुट करना।
file_get_contents()
रिमोट फ़ाइल के स्ट्रीमिंग या हथियार को पकड़ने का समर्थन नहीं करता है। एक विकल्प है fsockopen()
के साथ कच्चे सॉकेट बनाना, HTTP अनुरोध करें, और एक लूप में प्रतिक्रिया पढ़ें, जैसा कि आप प्रत्येक खंड को पढ़ते हैं, इसे ब्राउज़र पर आउटपुट करते हैं। यह तेज़ होगा क्योंकि फ़ाइल स्ट्रीम हो जाएगी। मैनुअल से
उदाहरण:
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
header('Content-Type: audio/mpeg');
$out = "GET/HTTP/1.1\r\n";
$out .= "Host: www.example.com\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
वहाँ अभी भी सामग्री उपलब्ध है, जबकि, प्रत्येक यात्रा यह 128 बाइट्स पढ़ता है पर ऊपर पाशन जाता है और फिर ब्राउज़र के लिए यह आउटपुट। वही सिद्धांत जो आप कर रहे हैं उसके लिए काम करेगा। आपको यह सुनिश्चित करने की आवश्यकता होगी कि आप प्रतिक्रिया HTTP हेडर को आउटपुट नहीं करते हैं जो पहली कुछ पंक्तियां होंगी, क्योंकि चूंकि आप कच्चे अनुरोध कर रहे हैं, इसलिए आपको हेडर के साथ कच्ची प्रतिक्रिया मिल जाएगी। यदि आप प्रतिक्रिया शीर्षलेख आउटपुट करते हैं तो आप भ्रष्ट फ़ाइल के साथ समाप्त हो जाएंगे।
$ url स्थानीय पथ या http: // url है? – Intrepidd
@Intrepidd हां, इसके बारे में खेद है, एक दूरस्थ यूआरएल। – think123
फ़ाइल का आकार क्या है और इसे लाने में कितने सेकंड लगते हैं? एक दूसरे से विभाजित करें और आपको बैंडविड्थ मिलेगा। यदि यह अप्रत्याशित रूप से धीमा है, तो आप या दूरस्थ पक्ष को और भी चाहिए! –