Не ждите завершения процесса - PullRequest
1 голос
/ 26 сентября 2008

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

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

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

Ответы [ 7 ]

3 голосов
/ 26 сентября 2008

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

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

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

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

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

1 голос
/ 26 сентября 2008

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

0 голосов
/ 26 сентября 2008

http://php.net/pcntl_fork

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

0 голосов
/ 26 сентября 2008

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

system('php yourscript.php &');

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

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

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

0 голосов
/ 26 сентября 2008

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

0 голосов
/ 26 сентября 2008

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

0 голосов
/ 26 сентября 2008

использовать версию форка или потоков в php.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...