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


PHP: curl writes to memory instead of giving a file stream

关于这个基本的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最大内存=64MB

此脚本适用于server1(php5.2.17$urltofile,即使$urltoffile的大小为2GB)中的问题。但在server2上,也有php v5.2.17)我在运行脚本时收到以下错误:(error_log)

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

似乎在服务器2上,文件在输出之前已经完全写入内存,而服务器1则像它应该的那样对文件进行流式传输。

两台服务器上的max_memory_size是否相同?此外,其他ini设置在服务器之间是否相同?

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

我敢打赌,如果您指定CURLOPT_FILE,CURL将以缓冲方式将远程文件的内容写入磁盘,并且您将能够在不更改max_memory_size的情况下在两台服务器上取下该文件。

编辑:

我现在看到了output_braining在curl中的作用,如果CURLOPT_RETURNTTRANSFER没有设置为true,情况肯定会如此。这将是检查OP是否在某处使用_ob_start()_ et al;但如果真的启用了,这可能会造成问题。正如@DaveRandom所建议的,服务器2上很可能就是这种情况。