【问题标题】:How to have a memory usage warning in PHP?如何在 PHP 中出现内存使用警告?
【发布时间】:2014-07-08 15:19:54
【问题描述】:

在 PHP 中,当脚本消耗超过 memory_limit 值时,脚本会因错误而停止。如何添加警告级别:如果我的脚本消耗超过 90Mb,我在日志文件中有警告,但脚本继续运行,如果消耗超过 128Mb,仍然会崩溃?

我对 PHP 扩展或 PHP C 代码一无所知,但只要我们自己构建了 PHP,我们甚至可以修补代码。

在 Zend/zend_alloc.c 我可以看到这个

if (segment_size < true_size || heap->real_size + segment_size > heap->limit) {

真的很容易在这之前添加一行并将已用内存与另一个限制进行比较,然后发出警告。

我可以在扩展程序中执行此操作,还是通过修补 PHP 代码来执行此操作?为什么这还不存在?这是个坏主意吗?这是否已经存在于某个地方?

为 MAX_EXECUTION_TIME 添加相同的警告似乎更加困难,因为我仍然不明白计时器的处理方式。

【问题讨论】:

    标签: php memory


    【解决方案1】:

    以下是我为您找到的一些有趣的问题/文章:

    1. This code shows a PHP way to catch a fatal error
    2. Safely catch a 'Allowed memory size exhausted' error in PHP

    基本上,您可以使用 PHP register_shutdown_function 在脚本退出或停止时运行函数。 error_get_last() 函数返回关于最后一个错误的信息,这将是致命的:

    ini_set('display_errors', false);
    
    error_reporting(-1);
    
    set_error_handler(function($code, $string, $file, $line){
            throw new ErrorException($string, null, $code, $file, $line);
        });
    
    register_shutdown_function(function(){
            $error = error_get_last();
            if(null !== $error)
            {
                echo 'Caught at shutdown';
            }
        });
    
    try
    {
        while(true)
        {
            $data .= str_repeat('#', PHP_INT_MAX);
        }
    }
    catch(\Exception $exception)
    {
        echo 'Caught in try/catch';
    }
    

    我不建议您只编辑 PHP C 代码。如果你不想这样做是 PHP 那么你真的应该做一个扩展。

    【讨论】:

    • 所以我手动修补 PHP 代码进行测试,并学习创建 PHP 扩展以更进一步。感谢您的“好方法”:-)
    【解决方案2】:

    您可以使用memory_get_usage() 在您的php 脚本中执行此操作。它实际上不在系统级别,您必须在脚本执行时多次调用它才能捕捉到您使用过多的时刻。

    【讨论】:

    • 好吧,我是一名开发人员,也是一名系统管理员,而且它不仅仅是“我的”代码,所以我想为整个服务器创建一个非致命警报。我正在尝试修补PHP代码,第一次并不容易。
    猜你喜欢
    • 2015-04-18
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 2019-04-30
    • 2012-03-23
    相关资源
    最近更新 更多