Как замедлить время выполнения?
Как можно замедлить время скрипта ? 4 цикла проходит нормально, на 5 сервер уходит в защиту и скрипт выдает ошибку
1368
Fatal error: Uncaught Error: Call to a member function find() on boolean in C:OSPaneldomainsparsindex.php:27 Stack trace: #0 {main} thrown in C:OSPaneldomainsparsindex.php on line 27
<?php require_once('simple_html_dom.php'); //Библиотека для парсинга require_once('curl_query.php'); //парсинг require_once('model.php'); //функционал require('db.php'); //база даных //Запрос к базе $query = "SELECT * FROM seria"; $result = $mysql->query($query); //вытащить все из базы в массив while ($row = $result->fetch_assoc()) { $id[] = $row["id"]; $silka[] = $row["silka"]; $series[] = $row["series"]; }; $count = count($id); for($i = 0; $i < $count; $i++){ $html = curl_get($silka[$i]); //ссылка на сереал $dom = str_get_html($html); //парсить страницу $finds = $dom->find('.added-info'); foreach($finds as $find){ $tfind = trim($find->plaintext); if($series[$i] === $tfind){ echo $id[$i]; sleep(5); } else{ $sql = "UPDATE `seria` SET `series` = '$tfind' WHERE `seria`.`id` = $id[$i]"; $mysql->query($sql); message_to_telegram("Вышла новая серия".$series[$i].$silka[$i]); echo $id[$i]; }; }; }; |
<?php require_once('simple_html_dom.php'); //Библиотека для парсинга require_once('curl_query.php'); //парсинг require_once('model.php'); //функционал require('db.php'); //база даных //Запрос к базе $query = "SELECT * FROM seria"; $result = $mysql->query($query); //вытащить все из базы в массив while ($row = $result->fetch_assoc()) { $id[] = $row["id"]; $silka[] = $row["silka"]; $series[] = $row["series"]; }; $count = count($id); for($i = 0; $i < $count; $i++){ $html = curl_get($silka[$i]); //ссылка на сереал $dom = str_get_html($html); //парсить страницу $finds = $dom->find('.added-info'); foreach($finds as $find){ $tfind = trim($find->plaintext); if($series[$i] === $tfind){ echo $id[$i]; sleep(5); } else{ $sql = "UPDATE `seria` SET `series` = '$tfind' WHERE `seria`.`id` = $id[$i]"; $mysql->query($sql); message_to_telegram("Вышла новая серия".$series[$i].$silka[$i]); echo $id[$i]; }; }; };
Дополнительно:
Ответы:
usleep(250000)
пауза на четверть секунды
for ($i = 0; $i < $count; $i++) { sleep(5); // Я бы тут поигрался с sleep. // $html = curl_get($silka[$i]); // Ссылка на сериал // А вот тут я бы проверял, что запрос дошел. Можно кастомизировать, но в простом случае $stopAsking = false; $countRequests = 0; while (!$stopAsking) { try { $html = curl_get($silka[$i]); // Здесь в функции выбрасывайте исключение и ловите его с помощью https://www.php.net/manual/en/function.curl-error.php $stopAsking = true; } catch (Exception $e) { sleep(1); // Подвязать логику слипа на количество запросов $countRequests++; if ($countRequests > 5) { $stopAsking = true; // И прерывать действие части скрипта, которая делает запрос на сервер. } } } if ($countRequests > 5) { continue; } $dom = str_get_html($html); // Парсить страницу $finds = $dom->find('.added-info'); foreach ($finds as $find) { $tfind = trim($find->plaintext); if ($series[$i] === $tfind) { echo $id[$i]; sleep(5); // У вас это запускается только в случае, если будет finds. В принципе, sleep тут не нужен уже, так как выработаете с готовой страницей. Но, например, если $finds = $dom->find('.added-info'); - не будет, то следующий запрос будет моментален. } else { $sql = "UPDATE `seria` SET `series` = '$tfind' WHERE `seria`.`id` = $id[$i]"; $mysql->query($sql); message_to_telegram("Вышла новая серия" . $series[$i] . $silka[$i]); echo $id[$i]; } } } |
for ($i = 0; $i < $count; $i++) { sleep(5); // Я бы тут поигрался с sleep. // $html = curl_get($silka[$i]); // Ссылка на сериал // А вот тут я бы проверял, что запрос дошел. Можно кастомизировать, но в простом случае $stopAsking = false; $countRequests = 0; while (!$stopAsking) { try { $html = curl_get($silka[$i]); // Здесь в функции выбрасывайте исключение и ловите его с помощью https://www.php.net/manual/en/function.curl-error.php $stopAsking = true; } catch (Exception $e) { sleep(1); // Подвязать логику слипа на количество запросов $countRequests++; if ($countRequests > 5) { $stopAsking = true; // И прерывать действие части скрипта, которая делает запрос на сервер. } } } if ($countRequests > 5) { continue; } $dom = str_get_html($html); // Парсить страницу $finds = $dom->find('.added-info'); foreach ($finds as $find) { $tfind = trim($find->plaintext); if ($series[$i] === $tfind) { echo $id[$i]; sleep(5); // У вас это запускается только в случае, если будет finds. В принципе, sleep тут не нужен уже, так как выработаете с готовой страницей. Но, например, если $finds = $dom->find('.added-info'); - не будет, то следующий запрос будет моментален. } else { $sql = "UPDATE `seria` SET `series` = '$tfind' WHERE `seria`.`id` = $id[$i]"; $mysql->query($sql); message_to_telegram("Вышла новая серия" . $series[$i] . $silka[$i]); echo $id[$i]; } } }
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Существует несколько способов замедлить время выполнения определенной задачи. Один из способов - оптимизация кода. Это включает в себя использование эффективных алгоритмов, избегание избыточных операций, оптимизацию циклов и использование более быстрых структур данных.
Другой способ - параллельное выполнение задач. Это означает разделение задач на более мелкие части и выполнение их одновременно на нескольких ядрах процессора. Это может значительно ускорить выполнение задачи, особенно на многоядерных системах.
Также можно использовать кэширование результатов предыдущих вычислений. Если некоторые вычисления не зависят от входных данных и могут быть повторно использованы, их результаты можно сохранить и использовать при последующих вызовах функции.
Оптимизация ввода-вывода также может помочь замедлить время выполнения. Это может включать в себя использование более быстрых устройств хранения данных, минимизацию операций ввода-вывода и буферизацию данных.
Наконец, можно использовать профилирование кода для выявления узких мест и оптимизации их. Профилирование позволяет определить, какие части кода занимают больше всего времени, и сосредоточить усилия на их оптимизации.
В целом, замедление времени выполнения задачи требует комплексного подхода, который включает в себя оптимизацию кода, параллельное выполнение задач, кэширование результатов, оптимизацию ввода-вывода и использование профилирования. Каждая из этих стратегий может быть эффективна в зависимости от конкретной задачи и окружения, в котором она выполняется.