使用 CLI 与 Curl 的 PHP 内存使用情况

发布于 2024-12-01 10:26:49 字数 803 浏览 1 评论 0原文

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

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() 分叉程序时,调用脚本的内存要求不会受到影响......但是,情况似乎并非如此。

任何人都可以阐明这里发生的事情,以便我知道发生了什么事吗?

So I tried executing a script two different ways:

1)

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

results:
peak usage: 5457324
peak usage: 7791212
PHP Fatal error: Allowed memory size of 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";
}

results:
peak usage: 5241708
peak usage: 5241708
peak usage: 5241708
peak usage: 5241708
peak usage: 5241708
peak usage: 5241708
... you get the idea

I must be mistaken about either the way exec() uses memory, or operates. It was my impression that when the program is forked, using exec(), that the calling script's memory requirements wouldn't be effected... However, this seems to not be the case.

Can anyone shed some light on what is going on here so I know what's going on?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

埖埖迣鎅 2024-12-08 10:26:50

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

https://www.php.net/manual/en/function.exec.php

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

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

The CURL version isn't saving the response (the output of curl_file_get_contents), but the exec version is by appending the contents to exec's second parameter of $array:

https://www.php.net/manual/en/function.exec.php

If the output argument is present, then the specified array will be filled with every line of output from the command. Trailing whitespace, such as \n, is not included in this array. Note that if the array already contains some elements, exec() will append to the end of the array. If you do not want the function to append elements, call unset() on the array before passing it to exec().

What happens is every response gets appended to the same array, ballooning the memory usage of the program.

口干舌燥 2024-12-08 10:26:50

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

The curl request is probably doing a full-blown HTTP request, so the script being requested is being run as a child of some completely independent webserver process. The memory usage of that child PHP process will be counted against the HTTP process handling the curl request, not your script.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文