Вы можете использовать proc_open()
, stream_select()
и stream_set_blocking()
для достижения такого рода целей.
Если это звучит расплывчато, я собирался вставить сюда большой кусок кода, который я использовал в недавнем проекте, который сделал нечто подобное, но потом почувствовал, что это может помешать, а не помочь! В итоге, код работал так:
- cronjob вызывает cronjob_wrapper.php
- cronjob_wrapper.php создает новый класс Manager и затем вызывает start .
- Проверка метода запуска класса Manager, чтобы увидеть, сколько экземпляров запущено (поиск pid-файлов в определенном месте). Если оно меньше заданного максимального числа экземпляров, оно записывает свой собственный идентификатор процесса в файл pid и затем продолжает
- Класс управления создает экземпляр соответствующего класса кодировщика и вызывает для него exec .
- Метод exec использует proc_open, stream_select и stream_set_blocking для выполнения системной команды неблокирующим способом (в этом случае запуск ffmpeg - и это может занять довольно много времени!)
- Когда он, наконец, запустится, он очищает свой файл PID и выручает.
Теперь я расплывчато и неуверенно, потому что наши множественные экземпляры обрабатываются cronjob, а не PHP. Я пытался сделать очень многое из того, о чем вы говорите, и получил что-то очень хорошо работающее с pcntl_fork()
и друзьями, но в итоге я столкнулся с парой проблем (если я вспомню по крайней мере, один из них был ошибкой в PHP) и решил, что этот подход является гораздо более надежным способом достижения того же самого. YMMV.
Стоит взглянуть на эти функции, но с ними можно многого добиться. Хотя почему-то я не думаю, что PHP когда-либо станет предпочтительным языком программирования сокетов ...:)