Всем привет!
Есть 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 часов (запись в базу), а именно в конце создает такую нагрузку?