Запуск php скриптів у фоновому режимі, wisereport
Коли проект зростає, з'являються ресурсомісткі завдання обробки даних. Наприклад, розбір xlsx (Ексель) прайса для поновлення цін, або ресайз великий фотографії. Випадки можуть бути найрізноманітнішими, коли ми не хочемо, щоб користувач чекав, поки наш скрипт відпрацює.
У даній статті розповім, як можна запускати фонове виконання PHP скриптів. Слід зазначити, що без використання VPS (Virtual Private Server), тобто на звичайному шаред хостингу, такий спосіб не спрацює. Строго кажучи, диспетчер створювався під Linux, хоча не виключена коректна робота і на FreeBSD. Навіть швидше за все буде працювати теж.
У самому диспетчері нічого складного немає, він швидше має більше проблем з адміністрування. Давайте спочатку розберемо, з чого він складається з боку ОС, які використовуються команди:
ps -C php -o pid =, command =
Тут ми запитуємо список процесів з ім'ям php. Інші параметри впливають на відображення результатів, тобто ми хочемо бачити pid, і безпосередньо повну команду, включаючи параметри. Приклад виведення цієї команди:
12769 php /path/to/1.php /path/to/price.xlsx
Таким чином, ми перевіряємо, чи запущена вже таке завдання, і якщо запущена, то за замовчуванням повторний запуск не проводиться. Якщо все ж потрібно паралельно запустити ще один екземпляр з точно такими ж параметрами, можна це вказати явним способом.
php -d max_execution_time = 300 -f /pathto/1.php /pathto/price.xlsx> / dev / null 2> 1 echo $!
Тут ми запускаємо php, причому вказуємо максимальний час виконання в 300 секунд, щоб наші фонові процеси не перетворилися в нескінченні. Проста запобіжний захід, не більше. Далі йде шлях до скрипту, потім параметри, якщо є необхідність. Перенаправляємо висновок замість stdout в «чорну діру», 2> # 038; 1 означає, що ми так само надсилаємо висновок помилок туди ж. До речі, можна перенаправити в файл через >>, з метою дебаггінга. Але раджу налагоджувати скрипти перед тим як їх щапускать в тлі. Найголовніше, остання частина: # 038; йдемо в background і echo $! Якраз виводимо (повертаємо) PID щойно створеного процесу.
Це все, тепер сам код диспетчера і приклад використання: