2013-07-14 8 views
11

PHP कर्ल डाउनलोड के लिए अधिकतम आकार सीमा है। यानी हस्तांतरण एक निश्चित फ़ाइल सीमा तक पहुंचने पर छोड़ देगा?PHP आकार डाउनलोड करने के लिए अधिकतम आकार सीमा को सेट करने के लिए

curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
$data = curl_exec($ch); 

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

+0

क्या आप छवि आकार को बाइट्स या उसके आयामों में प्राप्त करने का प्रयास कर रहे हैं ?, कर्ल अभी भी फ़ाइल को पहले डाउनलोड करेगा। –

+0

मैं जानना चाहता था कि कर्ल द्वारा अधिकतम सीमा को डिफ़ॉल्ट रूप से लगाया गया है या नहीं। अगर कोई डाउनलोड खराब हो जाता है, तो डिस्क को चकित नहीं करना चाहते हैं। और क्या यह बदलने योग्य है, जैसे कि php.ini –

उत्तर

22

मेरे पास एक और जवाब है जो यहां पोस्टरिटी के लिए यहां जाने के लिए स्थिति को बेहतर बनाता है।

CURLOPT_WRITEFUNCTION इस के लिए अच्छा है, लेकिन CURLOPT_PROGRESSFUNCTION सबसे अच्छा है।

// We need progress updates to break the connection mid-way 
curl_setopt($cURL_Handle, CURLOPT_BUFFERSIZE, 128); // more progress info 
curl_setopt($cURL_Handle, CURLOPT_NOPROGRESS, false); 
curl_setopt($cURL_Handle, CURLOPT_PROGRESSFUNCTION, function(
    $DownloadSize, $Downloaded, $UploadSize, $Uploaded 
){ 
    // If $Downloaded exceeds 1KB, returning non-0 breaks the connection! 
    return ($Downloaded > (1 * 1024)) ? 1 : 0; 
}); 

ध्यान रखें कि भले ही PHP.net states^CURLOPT_PROGRESSFUNCTION के लिए:

एक कॉलबैक स्वीकार करने पांच पैरामीटर

मेरे स्थानीय परीक्षण चित्रित किया केवल चार (4) पैरामीटर1 (संभाल) के रूप में मौजूद नहीं है।

+0

php.net पृष्ठ के माध्यम से चला गया और इस तरह के समान कोड मिला। बस '// छोटे बफर अधिक प्रगति जानकारी/कॉलबैक curl_setopt ($ यह -> _ हैंडल, CURLOPT_BUFFERSIZE, 128);' –

+0

@SojanVJose राइट! आपको जो चाहिए, उसके लिए यह सबसे अच्छा तरीका है। यहां नमूना कोड में उल्लिखित विकल्प जोड़ा गया। – CodeAngry

+1

ने इसे विभिन्न फाइलों के साथ परीक्षण किया और ठीक काम करता है। इसे उत्तर में स्विच करने के रूप में, यह कोड अधिक उपयोगी है .. –

3

सर्वर रेंज हेडर का सम्मान नहीं करता है। जितना संभव हो सके उतना ही आप कनेक्शन को रद्द करना चाहते हैं जैसे ही आप चाहते हैं कि अधिक डेटा प्राप्त करें। उदाहरण:

<?php 
$curl_url = 'http://steamcommunity.com/id/edgen?xml=1'; 
$curl_handle = curl_init($curl_url); 

$data_string = ""; 
function write_function($handle, $data) { 
global $data_string; 
$data_string .= $data; 
if (strlen($data_string) > 1000) { 
    return 0; 
} 
else 
    return strlen($data); 
} 

curl_setopt ($curl_handle, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($curl_handle, CURLOPT_CONNECTTIMEOUT, 2); 
curl_setopt ($curl_handle, CURLOPT_WRITEFUNCTION, 'write_function'); 

curl_exec($curl_handle); 

echo $data_string; 

शायद अधिक सफाई से, आप http आवरण (यह भी कर्ल का प्रयोग करेंगे अगर यह --with-curlwrappers साथ संकलित किया गया था) इस्तेमाल कर सकते हैं। असल में आप एक लूप में फ्रेड कॉल करेंगे और फिर स्ट्रीम पर फ्लेज़ोज़ करेंगे जब आपको इच्छित डेटा से अधिक डेटा मिलेगा। Allow_url_fopen अक्षम होने पर आप ट्रांसपोर्ट स्ट्रीम का उपयोग भी कर सकते हैं (fsockopen के साथ स्ट्रीम खोलें, फॉपेन के बजाय स्ट्रीम करें और हेडर मैन्युअल रूप से भेजें)।

+0

के माध्यम से मैं क्या जानना चाहता था कि क्या कुछ ऐसा है जो वैश्विक स्तर पर नियंत्रित होता है, सर्वर से प्रत्येक PHP कर्ल डाउनलोड करता है। upload_max_filesize जैसे कुछ। कोडेंग्री जवाब देते हैं। धन्यवाद :) –

+0

धन्यवाद !!!यह एकमात्र उत्तर है जो मेरे लिए काम करता है – rikkitikkitumbo

2

वहाँ है। यह PHP स्मृति सीमा है, मुझे लगता है। के रूप में डाउनलोड स्मृति में किया जाता है ...

के रूप में वे आप मार्ग बदलने के लिए नदियों को cURL डाउनलोड की अनुमति देने लेकिन CURLOPT_FILE and CURLOPT_WRITEHEADER^ अपने मित्रों को कर रहे हैं। यह आपको tmpfile() अस्थायी धाराएं बनाने की अनुमति देता है (stream_get_meta_data() आपको फ़ाइल पथ देता है) और उन्हें डाउनलोड करें। और ड्राइव करने के लिए सीधे डाउनलोड करने से स्मृति सीमाएं बढ़ जाती हैं।

एक बार डाउनलोड पूर्ण होने के बाद, आप उन फ़ाइलों को पढ़ते हैं और जो भी आप चाहते हैं उन्हें करते हैं।

+0

हालांकि मैं जो करना चाहता हूं वह सिर्फ विपरीत है, PHP स्मृति सीमा मेरे मूल प्रश्न का उत्तर देती है। मैं सुरक्षा के लिए अपने सर्वर पर कर्ल अनुरोधों के अधिकतम डाउनलोड आकार की सीमा निर्धारित करना चाहता हूं। curl के लिए विशेष रूप से upload_max_filesize के समान कुछ की उम्मीद कर रहा था। –

+1

@SojanVJose 'CURLOPT_WRITEFUNCTION' के साथ @ DrZIZO के सुझाव का उपयोग करें। लेकिन सुनिश्चित करें कि जिस सीमा को आप सेट करने की आवश्यकता है वह बहुत बड़ी नहीं है। ऐसा करने का कोई विकल्प नहीं है लेकिन यदि आप 'CURLOPT_WRITEFUNCTION' का उपयोग करते हैं और एक सीमा तक पहुंचने तक बफर में जोड़ते रहें तो किया जा सकता है। – CodeAngry

+1

@ ड्रज़िज़ो कोड के साथ चला गया। लागू करना आसान लग रहा था और यह परिदृश्य उन सीमाओं से संबंधित है जो बहुत बड़े नहीं हैं। –

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