PHP:curl写入内存而不是提供文件流

时间:2012-01-15 00:45:51

标签: php memory curl

关于这个基本的curlscipt(php):

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $urltofile);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 

curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
curl_exec ($ch);
curl_close ($ch);

php.ini max memory = 64MB

这个脚本可以解决你的问题om server1(php 5.2.17 $ urltofile,即使$ urltofile的大小为2GB。 但是在server2上也是'php v5.2.17)我在运行脚本时遇到这个错误:(error_log)

  

[日期] PHP致命错误:第x行上/home/user/public_html/test.php中允许的内存大小为134217728字节(试图分配xxxxxxx字节)

似乎在服务器2上,文件在输出之前完全写入内存,而server1流式传输文件,就像它应该的那样。

1 个答案:

答案 0 :(得分:0)

两台服务器上的 max_memory_size 是一样的吗?另外,其他 ini 设置在服务器上是否相同?

无论这些事情如何,您都可以通过设置 CURLOPT_BUFFERSIZE 来强制CURL维护比PHP的 max_memory_size 更小的文件,但即便如此,我怀疑这是问题所在。 ..如果您正在将远程文件读入变量,那么无论缓冲区大小如何,PHP都会占用内存,试图将整个远程文件存储在那里。所以它不是耗尽内存的缓冲区,而是远程文件的内容。

我敢打赌,如果您指定 CURLOPT_FILE ,CURL会以缓冲的方式将远程文件的内容写入磁盘,您可以在不更改 max_memory_size

编辑:

我现在看到output_buffering将在curl中发挥作用,如果 CURLOPT_RETURNTRANSFER 未设置为true,则确实如此。这将是检查OP是否正在使用_ob_start()_等的事情。某处;但如果确实启用了,那可能会导致问题。很可能在@DaveRandom建议的服务器2上就是这种情况。