Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当PHP的时间和内存都不足时,不会引发致命错误。什么时候应该_Php_Apache_Memory_Memory Leaks_Out Of Memory - Fatal编程技术网

当PHP的时间和内存都不足时,不会引发致命错误。什么时候应该

当PHP的时间和内存都不足时,不会引发致命错误。什么时候应该,php,apache,memory,memory-leaks,out-of-memory,Php,Apache,Memory,Memory Leaks,Out Of Memory,我一直在研究如何提高应用程序的稳定性;允许它从致命错误中恢复。恢复方法是使用以下行捕获PHP注册的关闭函数register\u shutdown\u函数中的致命错误: $error = error_get_last(); 这将检索致命错误,例如内存不足、超时、未捕获的异常、未定义的函数等 然后,可以将错误记录到我们的错误记录器中,并将用户重定向到一个安全的错误页面,在那里他们可以导航到另一个页面。除以下情况外,这一切都可以很好地捕捉内存不足和超时错误: 注意:使用协同点火器框架 现在,如果表m

我一直在研究如何提高应用程序的稳定性;允许它从致命错误中恢复。恢复方法是使用以下行捕获PHP注册的关闭函数register\u shutdown\u函数中的致命错误:

$error = error_get_last();
这将检索致命错误,例如内存不足、超时、未捕获的异常、未定义的函数等

然后,可以将错误记录到我们的错误记录器中,并将用户重定向到一个安全的错误页面,在那里他们可以导航到另一个页面。除以下情况外,这一切都可以很好地捕捉内存不足和超时错误:

注意:使用协同点火器框架

现在,如果表massive_表有900万行,那么将需要一段时间才能将所有行抓取到PHP中。但是,应用程序崩溃而不报告错误

只有当查询结果大于内存限制并且超过PHP max_执行时间时,才会出现此问题

程序如下:

一旦查询被解析并通过MySQL驱动程序发送到,我就可以看到它在MySQL进程列表中运行。显然,在返回超过10秒的PHP超时值之前,选择900万行需要一段时间。我现在希望PHP抛出max_execution_time reated fatal error,但是PHP似乎仍然等待超过10秒。在代码崩溃后的短时间内,不会报告致命错误

如果max_execution_time足够高,它可以返回,那么我将得到一个内存不足的致命错误

如果内存限制足够高,但超出了时间限制,则我将正确地获得最大执行时间到达致命错误

只有当这两个条件都达到时,问题才会出现,这似乎只有在PHP与MySQL通信时才会出现

Apache错误日志中也没有添加任何内容


另一个让我认为可能是PHP/Apache中的bug的副作用是,在特定场景中,内存中的900万行或崩溃前的行数没有被清除。我需要重新启动Apache以清除我的RAM。我只是在我的电脑死机时才发现这一点,并注意到我所有的16GB内存都已分配完毕,无法清除。所以这里似乎有内存泄漏。

如果有任何用处。。。我不希望PHP在等待MySQL查询运行时超时。PHP很可能处于等待状态并检查时间。然后,当MySQL开始响应时,它突然启动并再次开始检查时间。当然,它很可能会注意到来自数据库连接的内存保留请求超过了可用内存,然后才注意到时间已过。我喜欢这是一个写得很好、很详细的问题。。。我不喜欢我完全不知道的事实:|@kainaw,有趣,但是那肯定会抛出内存错误,而不是哈哈@CD001,这让我笑了。是啊,这把我难住了,真是奇怪。敲响警钟的是,我电脑上的内存没有被刷新。我自己做了测试。作为参考,我和MariaDB在Fedora 20上。不过,我认为这可能是相关的。使用标准查询,我得到了一个似乎是分段错误的结果。没有错误。剧本刚刚结束。但是,如果我在异步模式下运行它们查询,我会得到一个正常的PHP超时。也许您可以在异步模式下运行查询。我还使用流模式一次提取一个结果,而不是等待整个批处理。
    ini_set('memory_limit', '512M');
    ini_set('max_execution_time', 10);

    $this->db->query('select * from massive_table');