@doutaxe

Нагрузка на процессор в конце долгого PHP-скрипта?

Всем привет!
Есть php-скрипт-парсер, который выполняется в среднем 4-5 часов. Запускается в Cron c интервалом в 5 мин, но т.к. стоит защита от повторного запуска - то по сути следующая итерация запускается только после конца предыдущей и с этим проблем нет. Условная структура скрипта выглядит так:
<?php
// Защита от двойного запуска
$lock = fopen('/tmp/lock_file.lock', 'w');
if ( !($lock && flock($lock, LOCK_EX | LOCK_NB)) ) {
    exit( 'already running' );
}
 
// Коннект к БД
$sql = mysqli_connect('...', '...', '...', '...');
if ( !$sql ) die ("Error");
 
// Парсинг
foreach ($s1 as $k1)
{
    ...
foreach ($s2 as $k2)
{
    ...
foreach ($s3 as $k3)
{
    ...
foreach ($s4 as $k4)
{
    ...
}
foreach ($s5 as $k5)
{
    ...
foreach ($s6 as $k6)
{
    ...
foreach ($s7 as $k7)
{
    ...
}
$query = "INSERT INTO tabl1 (r1, r2, r3, r4, r5, r6, r7, r8) VALUES ('$k1', '$k2', '$k3', '$k4', '$k5', '$k6', '$k7', '$k8') ON DUPLICATE KEY UPDATE r5='$k5', r6='$k6', r7 = '$k7', r8='$k8'";
mysqli_query($sql, $query);
flush();
}
}
}
}
}
// Удаляем из БД все записи, которым больше 24 часов
$now_delete = date("Y-m-d H:i:s", time() - 86400);
$query_delete = "DELETE FROM tabl1 WHERE r8<'$now_delete'";
if (  mysqli_query($sql, $query_delete)  ) echo "Старые записи подчищены.<br>";
else echo "Старые записи не подчищены <br>";
 
mysqli_close( $sql );
?>


Проблема в том, что именно в конце выполнения скрипта (по прошествии 4-5 часов) создается большая нагрузка на процессор сервера (порядка 30 cpu). То, что нагрузка создается именно на исходе скрипта видно по статистике нагрузки от хостера (она разделена по часам). Нагрузка на MySQL околонулевая. Узнать больше, чем то, что нагрузка создается именно этим скриптом - в логах сервера нельзя. Изначально я грешил на последнюю операцию очистки БД, но убрав ее - ничего не изменилось. Почему может так получаться, что скрипт выполняет по сути одно и то же в цикле 5 часов (запись в базу), а именно в конце создает такую нагрузку?
  • Вопрос задан
  • 932 просмотра
Пригласить эксперта
Ответы на вопрос 2
402d
@402d
начинал с бейсика на УКНЦ в 1988
переписать логику.
Например первый скрипт делает s1 s3 циклы и готовит задачи . Условно получилась 1000.
Теперь второй скрипт запускается
каждую минуту и выполняет одну или более обработок (циклы s4 - s6)
можно даже в несколько потоков.
Ответ написан
Комментировать
Noizefan
@Noizefan
После каждой более-менее весомой операции писать в лог файл время её завершения и номер строки (образно говоря).
Это позволит понять, на каком конкретно этапе происходит торможение.
Далее останется лишь отладить ту самую операцию на более локальном случае и переписать её логику при необходимости.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы