【问题标题】:PHP: curl writes to memory instead of giving a file streamPHP:curl 写入内存而不是提供文件流
【发布时间】:2012-01-15 00:45:51
【问题描述】:

关于这个基本的 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 上没有问题(php 5.2.17 $urltofile,即使 $urltofile 的大小为 2GB。 但在 server2 上还有 'php v5.2.17) 运行脚本时出现此错误:(error_log)

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

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

【问题讨论】:

  • 我猜这是输出缓冲相关的——特别是它在 server2 上启用但不是在 server1 上启用。请参阅this,更具体和更有可能的是this
  • 您是否在服务器 2 上启用了 php.ini 设置 output_bufferingzlib.output_compression,但在服务器 1 上没有启用?

标签: php memory curl


【解决方案1】:

那么 ma​​x_memory_size 在两台服务器上是否相同?另外,其他 ini 设置在服务器之间是否相同?

不管这些,你可以通过设置 CURLOPT_BUFFERSIZE 来强制 CURL 保持比 PHP 的 ma​​x_memory_size 更小的文件,但即便如此我也怀疑这是问题所在。 .. 如果您将远程文件读入一个变量,那么无论缓冲区大小如何,PHP 都会在尝试将整个远程文件存储在那里时耗尽内存。所以耗尽内存的不是缓冲区,而是远程文件的内容。

我敢打赌,如果你指定 CURLOPT_FILE,CURL 会以缓冲的方式将远程文件的内容写入磁盘,你将能够在两台服务器上下载文件而无需更改 max_memory_size

编辑:

我现在看到了 output_buffering 将在哪里与 curl 发挥作用,如果 CURLOPT_RETURNTRANSFER 未设置为 true,情况确实如此。这将是检查 OP 是否使用 _ob_start()_ 等的东西。某处;但如果确实启用了,这可能会导致问题。正如@DaveRandom 所建议的那样,很可能是 server2 上的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    相关资源
    最近更新 更多