Тайм-аут сценария PHP - PullRequest
       0

Тайм-аут сценария PHP

3 голосов
/ 24 августа 2011

У меня есть собственный скрипт для системы досок объявлений, который подсчитывает количество созданных пользователем потоков и соответствующим образом обновляет столбец. Это работает нормально, однако для 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']}'");
}

Ответы [ 4 ]

7 голосов
/ 24 августа 2011

Используйте это:

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

Надеюсь, это поможет.

6 голосов
/ 24 августа 2011

Сначала вы должны отделить заявление ALTER. Сначала выполните ALTER, а затем сделайте все остальное. Изменение таблицы может быть дорогостоящим во времени, если у вас большой стол. Вы можете запустить его вручную, используя phpmyadmin или через оболочку (даже лучше, поскольку нет таймаута 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 голосов
/ 24 августа 2011

попробуйте

ini_alter ("max_execution_time", 600000000);
$tmp = ini_get ( "max_execution_time" );
set_time_limit(600000000);
0 голосов
/ 24 августа 2011

Общая причина того, что люди не могут изменить максимальное время выполнения, заключается в том, что их хост не позволяет им. Убедитесь, что они не блокируют это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...