我有一个公告板系统的自定义脚本,用于计算用户所做的线程数,并相应地更新列。这样可以正常工作,但是有超过10万用户,第一次运行时会超时。
我尝试在查询之前添加以下内容,但它仍然超时(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']}'");
}
答案 0 :(得分:7)
使用此:
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
希望这有帮助。
答案 1 :(得分:6)
首先,您应该分开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']}'");
}
答案 2 :(得分:2)
试试这个
ini_alter ("max_execution_time", 600000000);
$tmp = ini_get ( "max_execution_time" );
set_time_limit(600000000);
答案 3 :(得分:0)
人们无法更改最长执行时间的一个常见原因是他们的主机不允许他们这样做。确保发现他们没有阻止这一点。