如何在输出10 MB数据时停止执行PHP脚本

时间:2015-01-16 21:32:02

标签: php apache

我有一台Apache服务器,出站传输限制为6 GB。在PHP脚本中,我意外地运行了一个输出大量数据的循环,并使用了几乎所有分配的带宽。

有没有办法可以限制每个请求只输出10 MB的数据然后杀死进程或让它运行但不输出任何其他内容,以避免将来出现此类问题?

以下是日志中有问题的请求:

xxx.xxx.xxx.204 - - [16/Jan/2015:16:10:01 +0100] "GET /ebok/ebok.php HTTP/1.1" 200 5368709120 "-" "Wget/1.13.4 (linux-gnu)"

我尝试过ini_set

<?php
ini_set('memory_limit', '1M');
$a = array();
for($x=1; $x<1000; $x++) {
    array_push($a, array('imie'=>'Pablo'.$x, 'nazwisko'=>'picasso'.$x,     'adres'=>'nowowiejska'.$x));
}
print_r($a);
exit;
?>

我收到消息:

Fatal error:  Allowed memory size of 1048576 bytes exhausted (tried to allocate 72 bytes) in /home/public_html/bench.php on line 5

但是在apache日志中它只需要10KB

xxx.xxx.xxx.134 - - [16/Jan/2015:23:25:50 +0100] "GET /bench.php HTTP/1.1" 200 11146 "-" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"

我做错了什么?

2 个答案:

答案 0 :(得分:0)

你基本上有几种使用带宽的不同来源。文本(例如javascript和php输出)可能包含相对较小的带宽。图像将占用更多空间,像电子书这样的文件每个请求占用的空间最多。

可能有一个设置可以应用于apache的httpd.conf文件,以限制每个请求的最大大小。我在几分钟的谷歌搜索中找不到它,但你可能有一些运气(或者这里有人知道实际的命令!)

您还可以在脚本顶部设置ob_start()并在脚本结束时endflush()之前查看输出缓冲区大小。如果它太大,你可以截断它。

答案 1 :(得分:0)

在将实际发送到客户端之前,您可以尝试缓冲输出并将其修剪为所需大小(10 MB)。

这是一种解决方法,但我认为它可行:

<?php
//start buffering output
ob_start();

echo 'Hello'; //echo something, string is buffered now, nothing is sent
var_dump(strlen(ob_get_contents()); // this should print int(5), as 5 bytes are in the string echoed

//get the buffered output, flush output buffer and stop buffering
$output = ob_get_flush();

//echo first 10 milion bytes (10 MB) = send it to the client
echo substr($output, 0, 1e7);

有关输出缓冲的详细信息,请参阅PHP文档中的ob_start()ob_get_flush()