2

私はここで見つけた次の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);

私がやろうとしているのは、指定されたURLでxmlをダウンロードし、それをディスクに保存することです。echoただし、約80%が終了すると停止し、通話後に通話に到達することはありませんcurl_exec。理由はわかりませんが、メモリが不足しているためだと思います。したがって、ダウンロードするたびに、たとえば4kbのファイルにcurlにデータを書き込ませることができるかどうかを尋ねたいと思います。これが不可能な場合、phpを使用してダウンロードしてディスクに保存されたURLに保存されているxmlファイルを取得する方法を知っている人はいますか?

ベンさん、どうもありがとうございました。

編集:これは現在のコードですが、機能しません。データをファイルに書き込みますが、それでもドキュメントの約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);

    ?>
4

4 に答える 4

5

完全に機能する例を次に示します。

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_BUFFERSIZEバイトごとにコールバックレポートを作成します。値が小さいほど、報告される頻度が高くなります。これはダウンロード速度などにも依存します。受信/転送されたXバイトごとにレポートされるため、X秒ごとにレポートすることを期待しないでください。

于 2013-03-26T19:52:15.637 に答える
3

タイムアウトは5秒に設定されていますが、ドキュメントのファイルサイズによっては短すぎる場合があります。転送を完了するのに十分な時間を確保するために、10〜15に増やしてみてください。

于 2009-10-05T17:17:23.797 に答える
2

curlが書き込むファイルハンドラーを指定できる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);
于 2009-10-05T17:17:33.597 に答える
1

curl_setoptCURLOPT_FILE-転送が書き込まれるファイル。デフォルトはSTDOUT(ブラウザウィンドウ)です

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

于 2009-10-05T17:07:17.407 に答える