【问题标题】:Minimizing PHP memory usage at script start在脚本启动时最小化 PHP 内存使用
【发布时间】:2013-10-28 03:40:19
【问题描述】:

我有一个脚本,用于发送数据(大约 16MB 大小),我使用 php://input 读取。

$in = file_get_contents("php://input");

但是我遇到了内存限制问题,所以我使用memory_get_usage() 追踪它并意识到,脚本在启动时已经消耗了 47MB 内存(在发出任何命令之前)。

我的猜测是,这是由于 PHP 预先归档了全局变量。所以我正在寻找一种方法来取消这些设置,因为我只读取 php://input 流。

我试过了:

unset($GLOBALS);
unset($_SERVER);
unset($_GET);
unset($_POST);
unset($_FILES);
unset($_REQUEST);
unset($_ENV);
unset($_COOKIE);
unset($HTTP_RAW_POST_DATA);
unset($http_response_header);
unset($argc);
unset($argv);
gc_collect_cycles();

并将内存使用量从 47MB 减少到 31MB。

我还能做些什么,让 PHP 在启动时消耗更少的内存?

这会给我更多的内存来处理收到的数据。

【问题讨论】:

  • 我的 PHP 版本是 5.4.9
  • 您可以增加 php ini 文件中的 memory_limit。有趣的问题!
  • 我的提供商不会增加它。无论如何,我宁愿使用更少的内存,而不是仅仅增加限制。
  • 您能否详细说明每次更改后的收益是多少?我的意思是“在执行 unset($variable); 我得到 2 kb,在 unset($other_variable); 我得到 2MB 之后”。你有加载模块的关系吗? 47 MB​​ 是在您设置了一些变量之后,或者即使只有一个 memory_get_usage() 的空页面也是一样的?
  • 对 PatomaS 的评论,您确定您的内存占用不是 40 k 而不是 40 M?在我的盒子上,我正在阅读 memory_get_usage() 返回一个以 bytes 为单位的值。

标签: php memory


【解决方案1】:

有趣的是,您的脚本在启动时会占用如此多的内存。但我建议您修改您的程序,使其可以使用更少的内存。

$in = file_get_contents("php://input");

会将所有输入数据加载到内存中,这很糟糕。而是尝试读取内存中的几 KB 数据,对其进行处理,然后继续处理其余部分,直到您使用完所有数据。

您可以使用http://php.net/manual/en/function.stream-get-line.php

【讨论】:

【解决方案2】:

您的服务器上是否启用了 xDebug?它可以是另一个类似的扩展。 phpinfo() 会告诉你安装了哪些扩展。

像这样的简单脚本的内存使用量是多少

<?php 
echo memory_get_usage(false) . "\n";
echo memory_get_usage(true) . "\n";
echo "test\n";
?>

也试试

var_dump(get_defined_vars()); 

查看脚本中加载的所有变量。

【讨论】:

    【解决方案3】:

    使用Content-Type: application/json发送数据

    PHP 不会设置 $_POST 变量。

    【讨论】:

      【解决方案4】:

      如果您的配置和硬件允许,您可以在运行时增加内存限制:

      ini_set('memory_limit', '128M');
      

      或者通过.htaccess或者apache配置增加,如下:

      php_value memory_limit 128M
      

      【讨论】:

        猜你喜欢
        • 2021-02-12
        • 2010-12-05
        • 2013-12-31
        • 2022-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-08
        • 2011-04-03
        相关资源
        最近更新 更多