Задать вопрос

Поддерживать количество запущенных копий PHP скрипта?

Привет.

Есть очередь сообщений на memcacheQ. Надо поддерживать количество PHP скриптов, которое ее слушает, на определенном уровне, чтобы в любой момент времени их было не меньше N штук. Писать свой демон, который будет это делать (качественно) не охота, к тому же когда то я видел в комментариях на хабре ссылку на софтину, которую кто то сделал для этих же целей до меня.

Помогите найти, пожалуйста)
  • Вопрос задан
  • 3304 просмотра
Подписаться 4 Оценить Комментировать
Решения вопроса 1
la0
@la0
Проблема решается supervisord.org/. решение стабильное и рабочее.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
KEKSOV
@KEKSOV
Я бы воспользовался pcntl функциями. Если кратко, то код выглядит следующим образом (просто для пояснения идеи)

<?php

runDaemon(10);

function runDaemon( $aMaxWorkers )
{
    $i = 0;
    for ( ; $i < $aMaxWorkers; $i++ )
    {
        forkWorker( $i );
    }
    
    while ( ( $pid = pcntl_wait( $status ) ) != -1 )
    { 
        echo "Exit $pid\n";
        forkWorker( $i++ );
    }
}

function forkWorker( $aNumber )
{
    $pid = pcntl_fork(); 

    if ( $pid )
    {
        echo "Start #$aNumber, pid $pid\n";
        return;
    }
    
    // Делаем свою работу и выходим
    sleep(5);
    exit;
}

?>


Но у него есть один незначительный недостаток — он не работает pcntl_wait может не отловить одновременный выход двух работников и не запустит нужное число новых.

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

while(count($this->currentJobs)){
    echo "Waiting for current jobs to finish... \n";
    sleep(1);
}
Ответ написан
Комментировать
deadkrolik
@deadkrolik
Ответ написан
Комментировать
IlyaEvseev
@IlyaEvseev
Opensource geek
Велосипед:
#!/bin/bash
N=5
while : ; do
    n=$(pgrep -flc "php ...")
    while $n -le $N; do
        logger "Run $n/$N"
        php ...
        : $[n++]
    done
    sleep 60
done
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы