рабочий скрипт / очередь linux (php) - PullRequest
0 голосов
/ 21 августа 2009

Мне нужен бинарный файл / скрипт (php), который выполняет следующие действия.

Запуск n процесса X в фоновом режиме и ведение числа процессов.

Пример:

  • n = 50
  • изначально запущено 50 процессов
  • процесс завершается
  • 49 все еще работают
  • поэтому 1 следует запустить снова.

П.С .: Я опубликовал тот же вопрос на SV, что делает меня, вероятно, очень непопулярным.

Ответы [ 6 ]

1 голос
/ 26 августа 2009

Вот что-то в Perl, которое у меня есть в моей библиотеке (и, эй, давайте будем честными, я не собираюсь настраивать это в PHP только для того, чтобы дать вам кое-что работающее на этом языке в данный момент. можно копировать / вставлять).

#!/usr/bin/perl
use threads;
use Thread::Queue;

my @workers;
my $num_threads = shift;
my $dbname = shift;
my $queue = new Thread::Queue;

for (0..$num_threads-1) {
        $workers[$_] = new threads(\&worker);
                print "TEST!\n";
}

while ($_ = shift @ARGV) {
        $queue->enqueue($_);
}

sub worker() {
        while ($file = $queue->dequeue) {
                system ('./4parser.pl', $dbname, $file);
        }
}

for (0..$num_threads-1) { $queue->enqueue(undef); }
for (0..$num_threads-1) { $workers[$_]->join; }

Всякий раз, когда один из этих системных вызовов завершает свою работу, он перемещается по очереди. Да, и черт, если я знаю, почему я сделал 0..$numthreads вместо обычной my $i = 0; $i < ... идиомы, но я сделал это таким образом.

1 голос
/ 26 августа 2009

Вы пытались сделать PHP-демон раньше?

http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/

1 голос
/ 21 августа 2009

Я бы пошел в том направлении, которое предложил Андрес. Просто поместите что-то вроде этого вверху вашего файла pro.php ...

$this_file = __FILE__;
$final_count = 50;

$processes = `ps auwx | grep "php -f $this_file"`;
$processes = explode("\n", $processes);
if (count($processes)>$final_count+3) {
        exit;
}
//... Remaining code goes here
1 голос
/ 21 августа 2009

псевдокод:

for (i=1; i<=50; i++)
  myprocess
endfor

while true
  while ( $(ps --no-headers -C myprocess|wc -l) < 50 )
    myprocess
  endwhile
endwhile

Если вы переведете это на php и исправите его недостатки, он может просто делать то, что вы хотите.

1 голос
/ 21 августа 2009

Можете ли вы использовать crontab linux и записать в БД или подать номер текущего процесса ?. Если БД, то преимущество в том, что вы можете использовать для процедуры и блокировки таблицы, и записать номер процесса.

Но чтобы справиться с ситуацией, вы должны использовать & в конце вызова скрипта

# php-f pro.php &
0 голосов
/ 22 июня 2017

Я должен предложить решения. Оба выполняют дочернюю перезагрузку процесса при выходе, выполняют перезагрузку дочернего процесса по сигналу USR1, ждут выхода дочерних процессов на SIGTERM и так далее.

Первый основан на расширение php swoole . Это очень производительный, асинхронный, неблокирующий. Вот пример кода использования:

<?php
use Symfony\Component\Process\PhpExecutableFinder;

require_once __DIR__.'/../vendor/autoload.php';
$phpBin = (new PhpExecutableFinder)->find();
if (false === $phpBin) {
    throw new \LogicException('Php executable could not be found');
}
$daemon = new \App\Infra\Swoole\Daemon();

$daemon->addWorker(1, $phpBin, [__DIR__ . '/console', 'quartz:scheduler', '-vvv']);

$daemon->addWorker(3, $phpBin, [__DIR__ . '/console', 'enqueue:consume', '--setup-broker', '-vvv']);

$daemon->run();

Код демона здесь

Другой основан на Symfony библиотека процессов . Не требует никаких дополнительных расширений. Пример использования и код демона можно найти здесь

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