Я купил виртуальный хостинг, и они установили ограничение 30 секунд для выполнения файлов php. Мой скрипт запускается с использованием CRON и время его выполнения может занять более 30 секунд.
В основном в моем скрипте есть цикл foreach, который добавляет записи в БД.
foreach( $items as $item ) {
// prepare pdo query etc.
$db->execute();
}
Есть ли способ как-то опустить предел?
Как приостановить цикл после 20 секунд, а затем снова запустить или что-то еще?
Я не могу использовать set_time_limit()
Кстати.
Работа CRON выполняется только один раз в день.
Что вы можете сделать, это проверить, как долго скрипт работает в каждой итерации, и когда вы приближаетесь к максимальному времени выполнения, сохраните последнюю обработанную вами запись. Затем при следующем запуске нагнать и начать с этой конкретной записи. Это должно работать примерно так:
// place this at the very start of your script.
$start_time = microtime(true); // true is important, otherwise it'll return a string.
$max_execution_time = ini_get('max_execution_time');
// logic to retrieve the records, take the last processed record into account
// so in your query do something like WHERE id > last_record_processed
foreach( $items as $item ) {
// do something interesting with the item
$current_time = microtime(true);
if( ( $current_time - $start_time) > ( $max_execution_time - 5) ) {
$last_record_processed = $item;
// store the id or whatever somewhere;
break;
}
}
Вам нужно будет определить для себя, как лучше всего хранить последнюю обработанную запись, какой запас прочности вы хотите создать (сейчас: 5 секунд) и т. Д. И т. Д.
И чтобы это работало, вам нужно будет запускать cron каждый час или, может быть, даже более регулярно. В противном случае он будет обрабатывать часть ваших записей каждый день. Однако вы должны сначала проверить, продолжает ли он текущую партию или должен начинать сначала (что должно произойти, только если прошел день).
В вашем php-скрипте добавьте эту строку
ini_set ('max _ execution_time', -1);
Конечно, это работает, только если ваш хостинг-сервер позволяет.