10

我有一个脚本,用于发送数据(大小约为 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 在启动时消耗更少的内存?

它会给我更多的记忆来处理我收到的数据。

4

4 回答 4

5

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

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

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

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

于 2013-10-19T09:05:20.800 回答
2

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

一个简单脚本的内存使用情况是多少

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

也试试

var_dump(get_defined_vars()); 

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

于 2014-03-19T06:32:45.510 回答
0

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

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

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

php_value memory_limit 128M
于 2014-03-19T16:51:02.903 回答
0

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

PHP 将不会设置 $_POST 变量。

于 2014-03-19T10:18:18.067 回答