Как убедиться, что экземпляр PHP работает в фоновом режиме? - PullRequest
1 голос
/ 30 марта 2011

У меня есть тонна строк в MySQL.Я собираюсь выполнить пинг по ip в каждой из этих строк, поэтому я хотел бы разделить нагрузку.Я сделал скрипт, который запускает новый процесс для каждых 100 строк в базе данных.Проблема в том, что родительский сценарий, похоже, ожидает завершения каждого из дочерних сценариев, прежде чем приступить к следующему, что аннулирует всю цель.

Это код важной части родительского сценария

for($i = 0; $i < $children_num; $i++)
{
    $start = $bn["dots_pr_child"] * $i;

    exec("php pingrange.php $i $start $bn[dots_pr_child]");
}

Стоит отметить, что каждый из этих дочерних процессов запускается exec("ping") один раз для строки MySQL.Я думаю, что это часть проблемы.

Я опубликую дополнительную информацию и код по запросу.

Есть ли способ заставить экземпляр PHP работать в фоновом режиме, ина передний план продолжить?Предпочтительно родительский скрипт должен взять 0,0001 сек и вывести «Готово».В настоящее время он работает в течение 120 секунд.

Спасибо за любую помощь


Редактировать: Я пытался добавить & после процесса.Можно было бы подумать, что из-за этого функция exec вернется мгновенно, но нет.


Редактировать: попытка exec("php pingrange.php $i $start $bn[dots_pr_child] 2>&1 &"); без успеха


Редактирование: попытка exec("nohup php pingrange.php $i $start $bn[dots_pr_child] &"); без успеха

Ответы [ 5 ]

2 голосов
/ 30 марта 2011
exec("php pingrange.php $i $start $bn[dots_pr_child] > /dev/null 2>/dev/null & ");

должен делать работу в фоновом режиме.

0 голосов
/ 30 марта 2011

Просто добавьте > /dev/null 2>&1 & к вашей команде, у меня работает.

0 голосов
/ 30 марта 2011
<?php
passthru("/path/script >> /path/to/log_file.log 2>&1 &");
?>

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

0 голосов
/ 30 марта 2011

Хотя это может быть излишним для этой конкретной задачи, рассмотрим Gearman , очередь сообщений / работ, предназначенная именно для того, что вы делаете: отработка задач для рабочих. Он имеет всестороннюю поддержку PHP .

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

0 голосов
/ 30 марта 2011

Попробуйте nohup и амперсанд:

exec("nohup php pingrange.php $i $start $bn[dots_pr_child] &");

Статья Википедии на nohup дает довольно хорошее описание того, что она делает.

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