【问题标题】:PHP Script TimeoutPHP 脚本超时
【发布时间】:2011-11-02 10:55:36
【问题描述】:

我有一个用于公告板系统的自定义脚本,它计算用户创建的线程数,并相应地更新列。这工作正常,但是对于 100,000 多个用户,它在第一次运行时会超时。

我尝试在查询前添加以下内容,但仍然超时(500 错误)。

set_time_limit(0);
ignore_user_abort(true);

附加:我在我的 vps 上使用这个脚本。

查询:

set_time_limit(0); 
ignore_user_abort(true);

$db->write_query("ALTER TABLE `".TABLE_PREFIX."users` ADD `numthreads` int(10) unsigned NOT NULL default '0'");

// load users into an array to count number of threads
$query = $db->simple_select("users", "uid");
while($user = $db->fetch_array($query))
{
    $users[$user['uid']] = $user;
}

foreach($users as $user)
{   
    $query = $db->simple_select("threads", "COUNT(tid) AS threads", "uid = '{$user['uid']}'");

    // get total number of threads
    $numthreads = intval($db->fetch_field($query, "threads"));

    $db->update_query("users", array("numthreads" => $numthreads), "uid = '{$user['uid']}'");
}

【问题讨论】:

  • 您是否尝试将代码放在脚本的开头?
  • 可以分享代码吗?你的数据库优化了吗?
  • 您是否可以提供任何信息,然后只是 500 错误(显示的一些文本会有所帮助)?您在共享环境中吗?
  • 我将用户的表设置为 InnoDB ......而且我在 VPS 上。至于 500 错误,没有太多错误文本,因为 Chrome 没有提供任何错误文本。
  • 您能分享这些问题吗?数据库/表结构?

标签: php mysql timeout


【解决方案1】:

使用这个:

ini_set('max_execution_time', 0);

代替:

set_time_limit(0); 
ignore_user_abort(true);

你也可以编辑php.ini:

max_execution_time = 60; //Maximum execution time of each script, in seconds
max_input_time = 60; //Maximum amount of time each script may spend parsing request data

希望这会有所帮助。

【讨论】:

  • 这也没有解决问题。
  • 查看更新。您是否尝试编辑 php.ini 中的最后两行。
【解决方案2】:

首先你应该分开你的 ALTER 语句。首先执行 ALTER,然后执行其余的操作。如果你有一张大桌子,改变桌子的时间可能会很昂贵。您可以使用 phpmyadmin 或通过 shell 手动运行它(更好,因为没有 php 超时)。这将使您能够不超时。

然后从脚本中删除 ALTER 并运行它。

然后使用:

$query = $db->simple_select("users", "uid");
while($user = $db->fetch_array($query))
{
    $query = $db->simple_select("threads", "COUNT(tid) AS threads", "uid = '{$user['uid']}'");

    $numthreads = intval($db->fetch_field($query, "threads"));
    $db->update_query("users", array("numthreads" => $numthreads), "uid = '{$user['uid']}'");
}

【讨论】:

  • 我更愿意在脚本中保留 ALTER 语句,因为这是我将与其他几个人共享的插件,所以他们基本上需要 ALTER 语句。
  • 它包含大约 110,000 条记录。
  • 当您执行脚本并获得超时时,ALTER 语句是否完成?还是您仍然拥有旧结构(没有 numthreads 列)?
  • ALTER 语句已完成...只是在尝试计算线程数并相应更新时超时。
  • 在建议的解决方案中查看我的评论。你在那里循环了两次,只需要一次。
【解决方案3】:

试试这个

ini_alter ("max_execution_time", 600000000);
$tmp = ini_get ( "max_execution_time" );
set_time_limit(600000000);

【讨论】:

  • 很遗憾,您建议的代码也不起作用......它仍然超时。
【解决方案4】:

人们无法更改最大执行时间的一个常见原因是他们的主机不允许他们这样做。确保发现他们没有阻止这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 2012-08-06
    相关资源
    最近更新 更多