Вилка безопасно из PHP - PullRequest
       6

Вилка безопасно из PHP

0 голосов
/ 11 декабря 2010

С самого начала позвольте мне сказать, что я пытаюсь избежать использования pcntl_fork()

Для этого примера давайте представим, что я пытаюсь разветвить многие экземпляры приложения командной строки 'dig'. В действительности один и тот же скрипт будет использоваться для разных приложений командной строки.

Сейчас я использую php exec и добавляю & к команде, чтобы bash запускал ее в фоновом режиме.

Например,

exec("dig google.com &");
exec("dig yahoo.com &"); 

и так далее ...

Это успешно создает несколько процессов dig , работающих параллельно.

Проблема, с которой я столкнулся, заключается в том, что число процессов неуклонно растет до тех пор, пока система не выйдет из строя. По сути это вилочная бомба.

Я пытался бороться с этим, проверяя количество запущенных процессов, используя ps ax | wc -l
и только запуск больше, если он ниже X.

Eg (работает по петле)

if 80 processes are running, i'll launch another 20. 
if 70 processes are running, i'll launch another 30.

Проблема в том, что даже с этой проверкой число процессов продолжает расти до тех пор, пока система не выйдет из строя или не ударит по операционным системам max пользовательских процессов

Может кто-нибудь дать мне несколько советов о том, как я могу эффективно (массово) форкать, не изнасилуя все системные ресурсы? Я не понимаю, почему этот метод не работает.

Ответы [ 2 ]

1 голос
/ 12 декабря 2010

Поскольку у вас есть процесс управления, я предлагаю вам следить за созданными подпроцессами.Сохраните PID каждого запускаемого вами индекса:

$running[] = exec("process www.google.com &  echo $!");

Где $! вернет PID фонового процесса, добавив его в список в PHP.Затем в цикле управления просто перепроверьте, если процессы все еще активны:

do {
    foreach ($running as $i=>$pid) {
        if (!posix_getpgid($pid)) {
             unset($running[$i]);
             // restart
        }
}   }

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

0 голосов
/ 11 декабря 2010

Вы также можете использовать uptime для проверки загрузки системы.

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