致命错误:超出30秒最大执行时间

468

我正在从在线资源下载JSON文件,当它运行通过循环时,出现以下错误:

致命错误:在C:\ wamp \ www \ temp \ fetch.php的第24行超出了30秒的最大执行时间


12
这似乎是一个重复的问题,类似于 Maximum execution time of 60 seconds exceeded。请在提问之前使用搜索功能,以免重复提问。请注意不要更改原始意思。 - Gordon
set_time_limit()函数和配置指令max_execution_time只影响脚本本身的执行时间。任何在脚本执行之外发生的活动所花费的时间,例如使用system()进行系统调用、流操作、数据库查询等,在确定脚本运行的最长时间时不予考虑。但在Windows上则不是这样。 - Jacob Sánchez
17个回答

818

优化你的代码

你需要优化你的代码并寻找错误。

例如,你可能会错误地创建一个无限循环。显然,在这种情况下增加执行时间是没有帮助的。

或者,如果你正在将接收到的数据存储在数据库中,有一些技术可以大大提高性能,比如使用事务或多插入查询。

审查你的代码,找出性能瓶颈并进行优化。

作为命令行运行

如果代码已经优化但不可避免地需要花费太长时间,考虑将其作为命令行脚本来执行,而不是作为网页调用。当从命令行调用时,PHP脚本不受时间限制的影响。

例如,你可以将这个JSON下载配置为定时任务,或者实现一些队列,当你的网页只创建一个只需几秒钟的任务时,后台进程将花费时间来下载、解析和存储JSON。

增加时间限制

作为最后的手段,你可以临时延长时间限制,可以使用以下方法之一:

ini_set('max_execution_time', '300'); //300 seconds = 5 minutes

或者

set_time_limit(300);

100
set_time_limit(300) 可以用于临时延长时间限制。 - Omn
1
这个设置只针对那个脚本吗?还是会影响在同一服务器上执行的其他所有脚本? - Nagendra Rao
1
@Rao 是的,这只适用于那个脚本。如果要应用于所有脚本,您需要在php.ini文件中进行更改。 如果您希望脚本永远运行或长时间运行,也可以使用set_time_limit(0);。 - Haseeb
34
ini_set('max_execution_time', 0); //没有限制该行代码的作用是设置 PHP 脚本的最大执行时间为无限制,也就是没有时间限制。 - Junaid Atari
3
我认为最佳实践是尽可能将此限制保持较低,同时允许一定量的额外缓冲区。出于安全原因,我不想完全关闭它。它应该被合理地设置。实际上,我将它设置为中等服务器压力下最长运行脚本完成时间的两倍。尽管如此,它仍然有可能失败。因此,最佳实践也是单独处理耗时脚本的超时问题。 - Hafenkranich
显示剩余7条评论

210

我遇到了同样的问题,并通过更改 php.inimax_execution_time 参数的值来解决它,像这样:

max_execution_time = 360      ; Maximum execution time of each script, in seconds (I CHANGED THIS VALUE)
max_input_time = 120          ; Maximum amount of time each script may spend parsing request data
;max_input_nesting_level = 64 ; Maximum input variable nesting level
memory_limit = 128M           ; Maximum amount of memory a script may consume (128MB by default)

希望这能帮到你。


1
由于某些原因,ini_set不起作用,但这肯定有帮助! - gabrjan
2
php.ini 可以在 /etc/php5/apache2/php.ini 找到.... 我正在使用 Ubuntu 13.04... - Enissay
我在安装Moodle时在WAMP上遇到了同样的问题,但通过配置php.ini文件解决了它。 - Muhammad Irfan
1
更改php.ini后需要重新启动Apache。 - spideringweb
[php7] - sudo nano /etc/php/7.0/apache2/php.ini[php7] - 使用sudo nano /etc/php/7.0/apache2/php.ini命令。 - Chris Lambrou

57

以上所有答案都是正确的,但我有一个简单的方法在某些情况下可以避免这种情况。

只需要在脚本开头放置这个命令:

set_time_limit(0);

18
这并不被推荐。 - I am the Most Stupid Person
2
关闭时间限制并不能防止无限循环,因此一定要设定一个(更大的)限制。 - bimlas
1
@IamtheMostStupidPerson 为什么不呢?如果你将其用作本地主机。 - Fernando Torres

26

在升级到 WordPress 4.0 时,我遇到了这个问题。默认情况下,WordPress将最大执行时间限制为30秒。

要覆盖默认设置,请将以下代码添加到您的 .htaccess 文件中,该文件位于您的 WordPress安装根目录 中。

php_value max_execution_time 300  //where 300 = 300 seconds = 5 minutes

请参见以下链接:https://www.wpbeginner.com/wp-tutorials/how-to-fix-fatal-error-maximum-execution-time-exceeded-in-wordpress/,了解如何解决WordPress中的“致命错误:超过最大执行时间”。 - ktaria

18

编辑 php.ini

查找此行:

max_execution_time

将它的值更改为300:

max_execution_time = 300

300 表示 HTTP 请求的执行时间为 5 分钟。


16

您的脚本正在超时。请查看set_time_limit()函数以增加执行时间。或者对脚本进行性能分析以使其运行更快 :)


1
@HarshaMV 他的意思是使用性能分析来确定脚本为什么运行缓慢,并优化代码以提高执行时间。这可能有用,也可能没有用,这取决于瓶颈是什么(CPU vs. 磁盘I/O vs. 网络)。 - Dan Bechard

13
如果上述方法都不起作用,那么请在你的脚本所在目录添加一个名为 .htaccess 的文件,并将以下内容放入其中。
<IfModule mod_php5.c>
php_value post_max_size 200M
php_value upload_max_filesize 200M
php_value memory_limit 300M
php_value max_execution_time 259200
php_value max_input_time 259200
php_value session.gc_maxlifetime 1200
</IfModule>

这是我解决问题的方式,ini_set('max_execution_time', 86400);set_time_limit(86400) 都没有解决我的问题,但是 .htaccess 方法解决了。


1
在我的情况下,它可以工作。谢谢你。将 M 替换为 G 以表示 GB。 - Web_Developer
1
如果在 PHP 7 上运行,只需将 mod_php5 更改为 mod_php7。 - Ricardo Ruiz Romero

10

我们可以通过3种不同的方式解决这个问题。

1) 使用php.ini文件

2) 使用.htaccess文件

3) 使用Wp-config.php文件(适用于WordPress)


5
展示解决问题的三种方法的例子将会是最有帮助的。 - Scott Fleming

9
您可以通过在脚本顶部添加以下代码,将限制设置为零来移除限制:

set restriction to zero

<?php ini_set('max_execution_time', '0'); ?>

8

要延长您的 max_execution_time,您可以使用 ini_setset_time_limit

// Set maximum execution time to 10 seconds this way
ini_set('max_execution_time', 10);
// or this way
set_time_limit(10);

但请注意,这两个函数重新开始计算脚本已经花费的执行时间

sleep(2);
ini_set('max_execution_time', 5);

register_shutdown_function(function(){
    var_dump(microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']);
});

for(;;);

//
// var_dump outputs float(7.1981489658356)
//

如果您想设置脚本运行的确切最长时间,那么您的命令必须是非常第一的。

这两个函数之间的区别是:

  • set_time_limit 不会返回成功或失败的信息,但在出错时会抛出警告。
  • ini_set 在成功时返回旧值,在失败时返回 false 而不带任何警告/错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接