【问题标题】:Php memory usage using CLI verses Curl使用 CLI 和 Curl 的 PHP 内存使用情况
【发布时间】:2011-08-23 19:05:17
【问题描述】:

所以我尝试了两种不同的方式执行脚本:

1)

foreach($result_array as $arg){  
    exec("/usr/bin/php pathToScript firstArg $arg", $array);                
    echo "peak usage: " . memory_get_peak_usage() . "\n\r";  
}

结果:
高峰使用:5457324
高峰使用:7791212
PHP 致命错误:允许的内存大小为 33554432

2)

    foreach($result_array as $arg){
        curl_file_get_contents("website?query=$arg"); //just a cURL helper function
        echo "peak usage: " . memory_get_peak_usage() . "\n\r";
}

结果:
高峰使用:5241708
高峰使用:5241708
高峰使用:5241708
高峰使用:5241708
高峰使用:5241708
高峰使用:5241708
...你明白了

对于 exec() 使用内存或操作的方式,我一定是搞错了。我的印象是,当程序被分叉时,使用 exec(),调用脚本的内存需求不会受到影响......但是,情况似乎并非如此。

谁能解释一下这里发生了什么,以便我知道发生了什么?

【问题讨论】:

    标签: php memory-leaks exec memory-management command-line-interface


    【解决方案1】:

    CURL 版本不保存响应(curl_file_get_contents 的输出),但exec 版本是将内容附加到exec 的第二个参数$array

    http://us2.php.net/manual/en/function.exec.php

    如果存在输出参数,则指定的数组将被命令的每一行输出填充。此数组中不包含尾随空格,例如 \n。 注意,如果数组已经包含一些元素,exec() 将追加到数组的末尾。 如果您不希望该函数追加元素,请在传递之前调用数组上的 unset()执行()。

    发生的情况是每个响应都被附加到同一个数组中,从而使程序的内存使用量激增。

    【讨论】:

      【解决方案2】:

      curl 请求可能正在执行一个完整的 HTTP 请求,因此所请求的脚本正在作为某个完全独立的网络服务器进程的子进程运行。该子 PHP 进程的内存使用量将计入处理 curl 请求的 HTTP 进程,而不是您的脚本。

      【讨论】:

      • 是的,这很清楚......但我的问题并不是关于 cURL,而是关于 exec() 以及 exec() 调用的脚本是否会增加调用脚本的内存分配(我以前认为这是不可能的)。我想我误解了 exec() 是如何管理内存的,我希望有人能理顺我。
      猜你喜欢
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 2013-08-13
      • 2016-05-30
      相关资源
      最近更新 更多