2010-04-23 69 views
5

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

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

注意到我的错误文件的内容如下:“脚本标题的提前结束”作为执行错误也许会有所帮助。

任何帮助,非常感谢。

+0

任何错误信息?你已经启用了error_reporting(-1),是吗? – Gordon 2010-04-23 16:27:39

+0

只是补充说,作为一个编辑,当你发布:) :)一个错误消息:“脚本头过早结束” – 2010-04-23 16:28:10

+0

[脚本头过早结束:index.php,mod \ _fcgid:在61秒内读取数据超时] (http://stackoverflow.com/questions/14488567/premature-end-of-script-headers-index-php-mod-fcgid-read-data-timeout-in-61-s) – kenorb 2016-04-06 21:29:10

回答

0

您很可能在服务器上实施了强制资源限制,特别是如果服务器没有完全控制您的服务器。

假设它是某种类型的Linux服务器,您可以在命令行上看到ulimit -a的资源限制。 ulimit -t也会告诉你只有CPU时间的限制。

如果您的cpu有限,您可能需要分批处理您的导入。

+0

我不认为它是一个资源限制...脚本正好在45秒内超时......如果它是内存类型的东西不会时间非常不一致? – 2010-04-23 16:39:11

+0

您可以对内存以外的其他内容设置限制,并且服务器主机通常会限制CPU时间以防止失控进程。在这种情况下,它将会非常接近极限。尝试'ulimit -t'并看看你得到了什么。 – zombat 2010-04-23 16:57:01

+0

@Dave:还有Apache的RLimitCPU:http://httpd.apache.org/docs/2.2/mod/core.html#rlimitcpu – 2010-04-23 19:42:34

0

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

php -f filename.php 

但是如果你需要从浏览器中运行它,尝试添加标题(“内容类型:text/html的”)的进口踢之前。

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

0

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

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

它也可能是实际的数据库连接超时..你使用的是什么数据库服务器? 对我来说,默认情况下,mssql超时60秒后会出现极其无用的错误,“数据库上下文已更改”。为了解决这个问题,你这样做:

ini_set('mssql.timeout', 60 * 10); // 10 min 
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个月了!

干杯,

丰富

+0

非常需要这个,非常感谢。 – DaveE 2011-07-21 22:06:08

+3

HTH =“希望这有助于” – AVProgrammer 2012-09-12 19:45:07

0

首先

max_input_time设置和 的set_time_limit(0)

将只与VPS或专用服务器上运行。而不是你可以遵循一些规则来实现你的实现,如下所示

  1. 首先读取整个CSV文件。
  2. 然后抓住仅有10项(行)或更低,并作出AJAX调用在DB
  3. 尝试导入每一次Ajax调用了10项,之后呼应了浏览器的东西。在这种方法中,你的脚本永远不会超时。
  4. 按照同样的方法直到CSV行完成。