Php 使cURL在接收数据时写入数据

Php 使cURL在接收数据时写入数据,php,curl,fwrite,Php,Curl,Fwrite,我发现了以下php代码: 我试图做的是在指定的url下载xml并将其保存到磁盘。但是,它在大约80%完成后停止,并且在curl\u exec调用之后永远不会到达echo调用。我不知道为什么,但我相信这是因为它的内存不足。因此,我想问一下,是否可以让curl在每次下载(比如4kb)时将数据写入文件。如果这是不可能的,有人知道如何使用php下载存储在url上的xml文件并将其存储在我的磁盘上吗 多谢各位, 本 编辑: 这是现在的代码,它不起作用。它将数据写入文件,但仍然只有文档的80%左右。也许不是

我发现了以下php代码:

我试图做的是在指定的url下载xml并将其保存到磁盘。但是,它在大约80%完成后停止,并且在
curl\u exec
调用之后永远不会到达
echo
调用。我不知道为什么,但我相信这是因为它的内存不足。因此,我想问一下,是否可以让curl在每次下载(比如4kb)时将数据写入文件。如果这是不可能的,有人知道如何使用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);

    ?>

curl\u setopt选择CURLOPT\u文件-传输应写入的文件。默认值为标准输出(浏览器窗口)


您的超时设置为5秒,这可能太短,具体取决于文档的文件大小。尝试将其增加到10-15,以确保有足够的时间完成传输。

有一个名为curelop_FILE的选项,允许您指定curl应该写入的文件处理程序。我很肯定它会做“正确”的事情,并在读的时候“写”,避免你们的记忆问题

$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);

$file=fopen('test.txt','w')// 下面是一个完全有效的示例:
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字节。

只是想知道:您是否知道cURL是否在接收数据时将数据写入文件,或者是否存在某种缓冲?即使我已经这样做了(请参阅第一篇文章中的代码,我编辑了它),它不起作用。我添加到我的原始文章中。这不起作用。代码甚至不执行,但我不知道错误在哪里。尝试1:添加“;”在fopen之后2:fc关闭文件,3:将超时时间增加到300秒左右,因为您链接的页面确实很大,只是看到“;”问题,我已经更新了代码。它仍然在同一个位置停止(大约80%在)我现在正在尝试运行超时为300的脚本。我将超时设置为300,但它仍在完全相同的位置停止。我一直在玩这个和其他可能性,但没有任何效果。我觉得难以置信,我无法从URL下载文件。尽管如此,感谢这里的所有答案。我会继续战斗,当然,如果ybody找到解决方案,请发布!当我找到解决方案时,我当然会将其发布在这里。
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);
}
?>