произвожу выгрузку данных в бд сайта со стороннего ресурса.
Выгрузку необходимо производить периодически.
Бывает объем данных передается очень большой.
Алгоритм выгрузки следующий:
1. Запрос в API сервиса, записывает данные во временный файл на сервере. Далее работаем с файлом.
2. При успешном занесении каждого элемента в бд, элемент удаляется из массива данных файла.
3. вопрос: как прервать выполнение скрипта запущенного по крону на время, и после запустить дальше читать этот файл?
Если я выполню рекурсивный запуск импорта через exec каждые N шаг, поможет ли это?
Вы можете при завершении работы скрипта записывать текущее время в файл / БД. А при каждом запуске считывать это время, и если прошло достаточно, то запускаться, иначе выход. Если я правильно понял вопрос.
Если же скрипт должен просто притормозиться на какое-то время в течение исполнения, то sleep может помочь.
Тимур Калимуллин: если ваш скрипт устроен таким образом, что прерывание выполнения в любой момент не приведет к потере данных, то просто поставьте вначале set_time_limit, в противном случае высчитывайте время исполнения внутри скрипта через microtime()
Просто я не до конца понимаю, какой фактор означает, что выполнение скрипта в фоновом режиме началось заново.
При обращении через браузер все просто, выход из цикла, редирект, новый запуск скрипта. А вот с фоновым выполнением я не могу разобраться. При рекурсивном запуске скрипта он ни на секунду не останавливает свое выполнение. SLEEP тоже не помощник, т.к. он не прерывает работу скрипта, а наоборот удерживает.
Тимур Калимуллин: ну допустим вы ставите внутри скрипта set_time_limit(240); , а в кронтабе пишете, чтобы скрипт запускался каждые 5 минут. Таким образом скрипт будет точно простаивать по одной минуте.
А вообще при каждом новом запуске появляется новый процесс с этим скриптом. Поэтому точка входа и есть то, что скрипт запустился заново.
Exec может и вариант, но это рекурсия. А по поводу return - как вы поймете где его ставить? После каждой операции в скрипте будете проверять время выполнения? Это бред. В общем, странноватая у вас задачка. Неужели там такая огромная нагрузка? Установите тогда лимит на количество считываемых строк из файла таким , чтобы скрипт успевал допустим меньше, чем за 2 минуты. А расписание сделайте каждую минуту с проверкой на уже запущенный процесс для защиты от дубликата
FanatPHP: вы такой умный, но своего решения не написали. А перед тем как говорить "не надо" - расписали бы почему. У меня такой задачи тоже не возникало, и я не знаю зачем это надо. Но есл спрашивают - почему нельзя посоветовать варианты?
FanatPHP: на "ты" будете переходить на базаре, а тут не место тыкать и понтоваться. Есть что по делу - вперед. И откуда вам знать, кто что делал или не делал?)
FanatPHP: так же займут 5 минут, дело же не в этом. Не хочу получить fatal error из за ограничения по времени. Можно поставить set_time_limit 0 в крайнем случае. Но может есть способ лучше.