اجعل بيانات Curl كتابة البيانات عند تلقيها

StackOverflow https://stackoverflow.com/questions/1521241

  •  19-09-2019
  •  | 
  •  

سؤال

لدي رمز PHP التالي الذي وجدته هنا:

function download_xml()
{
    $url = 'http://tv.sygko.net/tv.xml';

    $ch = curl_init($url);
    $timeout = 5;

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

    $data = curl_exec($ch);

    echo("curl_exec was succesful"); //This never gets called

    curl_close($ch);
    return $data;
}

$my_file = 'tvdata.xml';
$handle = fopen($my_file, 'w');
$data = download_xml();
fwrite($handle, $data);

ما أحاول القيام به هو تنزيل XML على عنوان URL المحدد وحفظه على القرص. ومع ذلك، فإنه يتوقف مرة واحدة حوالي 80٪ الانتهاء ولا تصل أبدا إلى echo اتصل بعد curl_exec يتصل. لست متأكدا من السبب، لكنني أعتقد أن هذا لأنه ينفد من الذاكرة. لذلك أود أن أسأل ما إذا كان من الممكن جعل حليقة اكتب البيانات إلى الملف في كل مرة قمت بتنزيلها يقول 4 كيلو بايت. إذا لم يكن ذلك ممكنا، فهل يعرف أي شخص طريقة للحصول على ملف XML المخزن في عنوان URL الذي تم تنزيله وتخزينه على القرص الخاص بي باستخدام PHP؟

شكرا جزيلا لك، بن.

تحرير: هذا هو الرمز الآن، لا يعمل. يكتب البيانات إلى الملف ولكن لا يزال فقط حوالي 80٪ من المستند. ربما ليس لأنها تتجاوز الذاكرة ولكن بعض السبب الآخر؟ أنا حقا لا أصدق أنه من الصعب نسخ ملف من عنوان URL إلى القرص ...

    <?

$url = 'http://tv.sygko.net/tv.xml';
$my_file = fopen('tvdata.xml', 'w');

$ch = curl_init($url);
$timeout = 300;

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FILE, $my_file);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_BUFFERSIZE, 4096);

curl_exec($ch) OR die("Error in curl_exec()");

echo("got to after curl exec");

fclose($my_file);
curl_close($ch);

    ?>
هل كانت مفيدة؟

المحلول

يتم ضبط مهلاتك على 5 ثوان قد تكون قصيرة جدا اعتمادا على حجم ملف المستند. حاول زيادة ذلك إلى 10-15 فقط للتأكد من أنه يحتوي على ما يكفي من الوقت لإكمال عملية النقل.

نصائح أخرى

هنا يأتي مثال يعمل بالكامل:

public function saveFile($url, $dest) {

        if (!file_exists($dest))
                touch($dest);

        $file = fopen($dest, 'w');
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progressCallback');
        curl_setopt($ch, CURLOPT_BUFFERSIZE, (1024*1024*512));
        curl_setopt($ch, CURLOPT_NOPROGRESS, FALSE);
        curl_setopt($ch, CURLOPT_FAILONERROR, 1);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 15);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
        curl_setopt($ch, CURLOPT_FILE, $file);

        curl_exec($ch);
        curl_close($ch);

        fclose($file);
}
?>

السري يقع في مع إعداد Curlopt_Noprogress إلى False، ثم، سيجعل Curlopt_Buffersize تقرير رد الاتصال لكل بايت Curlopt_Bufferize التي تم الوصول إليها. القيمة الأصغر، كلما أشرحها ستؤدي إليها. يعتمد هذا أيضا على سرعة التنزيل الخاصة بك، وما إلى ذلك، لذلك لا تحسب ذلك للإبلاغ عن كل 8 ثوان، نظرا لأنها ستقدم بتقديم تقرير لكل بايت X تلقي / نقلها.

هناك خيار يسمى CurelopT_File الذي يسمح لك بتحديد ملف معالج يجب أن يكتب هذا الحلاقة. أنا متأكد من أنه سيفعل الشيء "الصحيح" و "الكتابة" كما يقرأ، وتجنب مشكلة الذاكرة الخاصة بك

$file = fopen('test.txt', 'w'); //<--------- file handler
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'http://example.com');
curl_setopt($ch, CURLOPT_FAILONERROR,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_FILE, $file);   //<------- this is your magic line
curl_exec($ch); 
curl_close($ch);
fclose($file);

curl_setopt the curlopt_file - الملف الذي يجب كتابته للنقل إليه. الافتراضي هو Stdout (نافذة المتصفح)

http://us2.php.net/manual/en/function.curl-setopt.php.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top