2012-05-30 2 views
0

Раньше я запускал кучу скриптов каждый как отдельное задание cron. Теперь я хотел бы запустить скрипт контроллера с одним заданием cron, а затем вызвать сценарии отдельно (и параллельно, все в одно и то же время), поэтому мне не нужно создавать новое задание cron каждый раз, когда я добавляю другой скрипт.Выполнение рабочих заданий Cron параллельно (PHP)

Я искал pcntl_fork(), но у нас его нет. Может ли fsockopen() сделать это?

Несколько вопросов:

  1. Я видел этот пример, http://phplens.com/phpeverywhere/?q=node/view/254, который использует fsockopen(). Это позволит мне запускать скрипты PHP параллельно? Обратите внимание, что скрипты не взаимодействуют, но я все равно хотел бы знать, если кто-либо из них вышел преждевременно с ошибкой.

  2. Во-вторых, скрипты, которыми я управляю, не доступны снаружи, они только внутренние. Сценарий ранее запускался следующим образом: php -f /path/to/my/script1.php. Это не путь, доступный в Интернете. Будет ли пример в # 1 работать с этим или только с веб-доступными путями ?.

Спасибо за любой совет, который вы можете предложить.

+1

Поскольку sockopen работает при подключении к серверу, если файлы не доступны в Интернете, вы не можете использовать его для доступа к ним. –

+0

подскажите - ожидайте, что сценарий с длинным сценарием может произойти сбой, и у вас есть план перезапустить его/восстановить. – goat

ответ

1

Вы можете использовать proc_open для запуска нескольких процессов, не дожидаясь завершения каждого процесса. У вас будет дескриптор процесса, вы можете завершить каждый процесс в любое время, и вы можете прочитать стандартный вывод каждого процесса.

Вы также можете связываться через трубы, которые не являются обязательными.

Передача 1-го парама php /your/path/to/script.php param1 "param2 x" означает запуск отдельного процесса PHP.

proc_open (see Example #1)

В конечном итоге вы хотите использовать бесконечное время цикла + USleep (или сон), чтобы избежать максить на CPU. Перерыв, когда все процессы закончатся, или после того, как вы их убили.

Редактировать: вы можете узнать, вышел ли процесс преждевременно.

Edit2: простой способ сделать вышеперечисленное popen

+0

Могу ли я также использовать exec() для параллельного запуска процессов? Если вы запустите его в фоновом режиме, это параллельно, не так ли? –

+0

Нет, exec ждет завершения процесса, и вы не контролируете его.Вы можете запустить один процесс, но не так много параллельно. –

+0

PHP.net говорит следующее: «Если программа запускается с этой функцией, чтобы она продолжала работать в фоновом режиме, выход программы должен быть перенаправлен в файл или другой выходной поток. заставляют PHP зависать, пока не закончится выполнение программы ». Так что я должен буду работать параллельно, не так ли? Но смогу ли я увидеть, когда все закончится? –

1

Пожалуйста, поправьте меня, если я ошибаюсь, но если я понимаю вещи правильно, решение Тибериу-Йонут Стан предложил означает, что начиная процессы с proc_open и ожидая их завершения, не будет выполняться как скрипт cron, но является частью запущенной программы/службы, верно?

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

Смежные вопросы