Не ждите завершения процесса.

У меня есть PHP-скрипт, который вызывается из задания cron каждую минуту. Этот скрипт берет некоторую информацию из базы данных, а затем вызывает другой скрипт PHP, используя Системную функцию (передавая ей некоторые параметры).

Это означает, что я могу запустить до 10 сценариев из этого «основного». И что бы я хотел сделать, так это то, что я бы назвал сценарий и продолжал выполнение основного скрипта, то есть не дожидался завершения системного вызова, а затем вызвал следующий.

Как это может быть сделано?

Solutions Collecting From Web of "Не ждите завершения процесса."

Вы можете использовать proc_open() , stream_select() и stream_set_blocking() совместно для достижения такого рода вещей.

Если это звучит расплывчато, я собираюсь вставить здесь большой кусок кода, который я использовал в недавнем проекте, который сделал что-то подобное, но потом почувствовал, что это может помешать, а не помочь! Таким образом, код работал следующим образом:

  1. cronjob вызывает cronjob_wrapper.php
  2. cronjob_wrapper.php создает новый класс диспетчера, а затем вызывает его запуск .
  3. Проверка метода запуска класса менеджера, чтобы узнать, сколько экземпляров запущено (ищет файлы pid в определенном месте). Если он меньше заданного максимального количества экземпляров, он записывает свой собственный идентификатор процесса в файл pid, а затем продолжает
  4. Управление классом создает экземпляр соответствующего класса Encoder и вызывает exec на нем.
  5. Метод exec использует proc_open, stream_select и stream_set_blocking для запуска системной команды неблокирующим способом (в этом случае работает ffmpeg – и может занять некоторое время!)
  6. Когда он наконец запускается, он очищает свой файл PID и освобождается.

Теперь причина, по которой я расплывчата и удобна в том, что наши многочисленные экземпляры здесь обрабатываются cronjob не PHP. Я пытался сделать то, о чем вы говорите, и что-то очень хорошо работает с pcntl_fork() и друзьями, но в конце я столкнулся с несколькими проблемами (если я помню, что хотя бы один из них был ошибкой в PHP) и решил, что этот подход был гораздо более солидным способом добиться того же. YMMV.

Хорошо стоит посмотреть на эти функции, но вы можете добиться многого с ними. Хотя почему-то я не думаю, что PHP когда-либо станет языком программирования сокетов выбора … 🙂

Если ваша ОС поддерживает его, вы можете использовать функцию pcntl_fork () для выключения дочерних процессов, которые родитель не ждет. Будьте осторожны, но легко создать слишком много дочерних процессов, особенно если они занимают больше времени, чем ожидалось!

Я не уверен, что PHP поддерживает потоки. Проверьте здесь .

Я думаю, что ответ будет очень похож на те, которые уже предусмотрены для асинхронных вызовов PHP .

http://php.net/pcntl_fork

Это только * NIX, но вы можете разветвлять свой скрипт с помощью расширения PCNTL.

используйте версию вилки или потоки php.

Вы можете запустить их в фоновом режиме:

 system('php yourscript.php &'); 

Вам просто нужно убедиться, что вы проверяете общее количество запущенных процессов. В общем, не очень элегантное решение. Вместо cron вы можете позволить одному сценарию работать навсегда, я думаю, что-то вроде этого:

 <?php while(true) { // do whatever needs to be done. } ?> 

Осторожно. PHP точно не известен как демона.