Среда Демона/рабочего PHP

Если ваше приложение также работает в OpenShift, запустите oc get svc, чтобы найти имена каждого брокера. Обратите внимание, что эти имена доступны только внутри кластера OpenShift.

Например, если oc get svc возвращает:

> oc get svc
NAME                                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
my-cluster-kafka-0                    ClusterIP   172.30.210.241           9094/TCP                     109d
my-cluster-kafka-1                    ClusterIP   172.30.39.25             9094/TCP                     109d
my-cluster-kafka-2                    ClusterIP   172.30.93.193            9094/TCP                     109d

, вы можете получить доступ к kafka-0 с помощью my-cluster-kafka-0 или my-cluster-kafka-0..svc.cluster.local

Если ваше приложение работает за пределами OpenShift, пожалуйста, настройте стримзи внешних слушателей . Среди трех вариантов настройки внешних слушателей , NodePort может быть проще, если вы запускаете локальный OKD.

14
задан Sebastian 16 April 2012 в 14:55
поделиться

4 ответа

Вот некоторый код, который может быть полезен.

<?
define('WANT_PROCESSORS', 5);
define('PROCESSOR_EXECUTABLE', '/path/to/your/processor');
set_time_limit(0);
$cycles = 0;
$run = true;
$reload = false;
declare(ticks = 30);

function signal_handler($signal) {
    switch($signal) {
    case SIGTERM :
        global $run;
        $run = false;
        break;
    case SIGHUP  :
        global $reload;
        $reload = true;
        break;
    }   
}

pcntl_signal(SIGTERM, 'signal_handler');
pcntl_signal(SIGHUP, 'signal_handler');

function spawn_processor() {
    $pid = pcntl_fork();
    if($pid) {
        global $processors;
        $processors[] = $pid;
    } else {
        if(posix_setsid() == -1)
            die("Forked process could not detach from terminal\n");
        fclose(stdin);
        fclose(stdout);
        fclose(stderr);
        pcntl_exec(PROCESSOR_EXECUTABLE);
        die('Failed to fork ' . PROCESSOR_EXECUTABLE . "\n");
    }
}

function spawn_processors() {
    global $processors;
    if($processors)
        kill_processors();
    $processors = array();
    for($ix = 0; $ix < WANT_PROCESSORS; $ix++)
        spawn_processor();
}

function kill_processors() {
    global $processors;
    foreach($processors as $processor)
        posix_kill($processor, SIGTERM);
    foreach($processors as $processor)
        pcntl_waitpid($processor);
    unset($processors);
}

function check_processors() {
    global $processors;
    $valid = array();
    foreach($processors as $processor) {
        pcntl_waitpid($processor, $status, WNOHANG);
        if(posix_getsid($processor))
            $valid[] = $processor;
    }
    $processors = $valid;
    if(count($processors) > WANT_PROCESSORS) {
        for($ix = count($processors) - 1; $ix >= WANT_PROCESSORS; $ix--)
            posix_kill($processors[$ix], SIGTERM);
        for($ix = count($processors) - 1; $ix >= WANT_PROCESSORS; $ix--)
            pcntl_waitpid($processors[$ix]);
    } elseif(count($processors) < WANT_PROCESSORS) {
        for($ix = count($processors); $ix < WANT_PROCESSORS; $ix++)
            spawn_processor();
    }
}

spawn_processors();

while($run) {
    $cycles++;
    if($reload) {
        $reload = false;
        kill_processors();
        spawn_processors();
    } else {
        check_processors();
    }
    usleep(150000);
}
kill_processors();
pcntl_wait();
?>
12
ответ дан 1 December 2019 в 13:34
поделиться

Похоже, у вас уже есть MQ, работающий в системе * nix, и вы просто хотите управлять работниками

Очень простой способ сделать это - использовать экран GNU. Чтобы запустить 10 рабочих, вы можете использовать:

#!/bin/sh
for x in `seq 1 10` ; do
screen -dmS worker_$x php /path/to/script.php worker$x
end

Это запустит 10 рабочих в фоновом режиме, используя экраны с именем worker_1,2,3 и т. Д.

Вы можете присоединиться к экранам, выполнив screen -r worker_ и составить список запущенных работники с помощью screen -list.

Для получения дополнительной информации это руководство может быть полезным: http://www.kuro5hin.org/story/2004/3/9/16838/14935

Также попробуйте:

  • screen --help
  • man screen
  • или google .

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

4
ответ дан 1 December 2019 в 13:34
поделиться

Вам действительно нужно, чтобы он непрерывно работал?

Если вы хотите создавать новый процесс только по запросу, вы можете зарегистрировать его как службу в xinetd.

1
ответ дан 1 December 2019 в 13:34
поделиться

a pcntl plugin type server daemon for PHP

http://dev.pedemont.com/sonic/

1
ответ дан 1 December 2019 в 13:34
поделиться
Другие вопросы по тегам:

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