PHP脚本在45秒后超时

时间:2010-04-23 16:20:09

标签: php timeout

我正在对我的数据库运行一个巨大的导入(大约20万条记录),并且我的导入脚本超时时出现严重问题。我用我的手机作为秒表,发现每次通过它的时间恰好是45秒(内部服务器错误)......它一次只能做约200条记录,有时甚至更少。我扫描了我的phpinfo(),没有设置为45秒;所以,我对它为什么会这样做一无所知。

我的max_execution_time设置为5分钟,我的max_input_time设置为60秒。我也试过设置set_time_limit(0); ignore_user_abort(1);在我的页面顶部,但它不起作用。

注意我的错误文件:“脚本标头的过早结束”作为执行错误也可能会有所帮助。

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:15)

我尝试了此页面上的所有解决方案,当然,还是从命令行运行:

php -f filename.php
布伦特说这是明智之举。

但是如果你真的想要从你的浏览器运行一个脚本,在45秒内因500内部服务器错误(正如我在重建我的phpBB搜索索引时发现的那样)保持超时,那么这是一个很好的这可能是由mod_fcgid引起的。

我有一个Plesk VPS,我通过编辑文件来修复它

/etc/httpd/conf.d/fcgid.conf

具体来说,我改变了

FcgidIOTimeout 45

FcgidIOTimeout 3600

3600秒= 1小时。对于大多数人来说应该足够长,但如果需要可以向上调整。我看到一个例子在那里引用了7200秒。

最后,重新启动Apache以使新设置处于活动状态。

apachectl graceful
某人HTH。这已经困扰了我6个月了!

干杯,

答案 1 :(得分:0)

您很可能在服务器上达到了强制资源限制,特别是如果服务器不在您的控制之下。

假设它是某种类型的Linux服务器,您可以在命令行上使用ulimit -a查看资源限制。 ulimit -t还会向您显示cpu时间的限制。

如果你的cpu是有限的,你可能需要批量处理你的导入。

答案 2 :(得分:0)

首先,如果需要一段时间,您应该从命令行运行脚本。如果没有收到任何内容,您的浏览器至少会在2分钟后超时。

php -f filename.php

但是如果你需要从浏览器运行它,请在导入踢之前尝试添加标题(“Content-type:text / html”)。

如果您在共享主机上,那么当在一段时间后自动终止任何长时间运行的查询和/或脚本时,系统可能会受到限制。对于非Web运行脚本,通常会松开这些限制。因此,从命令行运行它会有所帮助。

答案 3 :(得分:0)

45秒可能是巧合 - 它可能是你达到内存限制所需的时间。增加内存限制将是这样的:

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

它也可能是超时的实际数据库连接..您使用的数据库服务器是什么? 对我来说,默认情况下,mssql在超过60秒后超时失败,“数据库上下文已更改”。要解决这个问题,你可以:

ini_set('mssql.timeout', 60 * 10); // 10 min

答案 4 :(得分:0)

First of all

max_input_time and set_time_limit(0)

will only work with VPS or dedicated servers . Instead of that you can follow some rules to your implementation like below

  1. First read the whole CSV file .
  2. Then grab only 10 entries (rows) or less and make a ajax calls to import in DB
  3. Try to call ajax every time with 10 entries and after that echo out something on browser . In this method your script will never timeout .
  4. Follow the same method untill the CSV rows are finished .
相关问题