Для простых многопоточных систем очень часто используют запуск в фоновом режиме. Запускают их примерно вот так:
php script.php &
И управление процессом от юзера уходит, отловить такой процесс из другого скрипта уже не получится. А если процесс выполняет какую то одну и ту же задачу с интервалом по крону, и нужно, чтобы при запуска нового процесса старый был убит? Поймать его можно аццкой смесью bash + php:
$killPid = exec("ps ux | awk '/script_name.php/ && !/awk/ {print $2}'");//находим пид процесса if($killPid)//если есть, киляем exec ("kill ".$killPid); exec('php script_name.php &');//запускаем новый
7 комментариев
Хороший способ, спасибо.
Недостаток этого способа — интерпретатор PHP запускает новый процесс, в котором еще и выполняет команды bash, что накладно по ресурсам
Интересный способ — нужно воспользоваться
Клёвая статья, обязательно её воспользуюсь!!!
А без bash способ есть (чисто средствами php)? А то на многих shared-хостингах из php bash не запустишь.
Без баша нет, т.к. пхп не имеет выхода на системный уровень при настройках по умолчанию
Без bash можно попробовать так:
1. Прописать флаг запущенного скрипта куда-либо (например в текстовый файл лога либо в БД).
2. При запуске скрипта (повторном) смотреть, не сброшен ли флаг. Ждать когда отработает первый процесс, либо просто выйти ничего не делая.
3. В коде скрипта предусмотреть прерывание его по тайм-ауту.
4. Задавать расписание crone таким образом, чтобы не перекрывался тайм-аут выполнения скрипта.
ПС: kill процесса скрипта чреват неприятностями неуправляемыми.