Поток приложений в Windows с использованием PHP - PullRequest
2 голосов
/ 18 мая 2011

Я делаю PHP-приложение, которое порождает дочерние процессы с параметрами, подробно описывающими, какую работу они должны выполнять. Более конкретно, дочерние процессы будут обрабатывать строки из большой базы данных MySQL, а родительское приложение будет подсчитывать строки и порождать ~ 50 процессов с диапазоном строк для обработки.

Мне нужен способ, чтобы родительский процесс знал, завершены ли дочерние процессы. Я сделал это приложение в Linux раньше, используя таблицу MySQL для дочерних процессов, чтобы зарегистрироваться. На этот раз я хочу сделать управление процессом независимым от MySQL (а теперь я в Windows).

Есть ли способ для родительского процесса PHP получить «дескриптор» дочернего процесса при его создании и наблюдать за его активностью?

Я надеюсь, что я ясно понимаю суть того, что я пытаюсь сделать. Будем благодарны за любые ответы и советы.

За исключением советов по использованию другого языка программирования - для обработки я использую множество библиотек PHP, а также пользовательские классы и функции

Ответы [ 3 ]

0 голосов
/ 18 мая 2011

Вы не можете раскошелиться в Windows, это простая истина.Разветвления Linux, потоки Windows.

Но я нашел это (многопоточность с php в windows - есть некоторые ресурсы):

Каков наилучший способ ветвления / потока в PHP на Win

0 голосов
/ 18 мая 2011

Однажды я создал небольшой образец, который запускает свои копии для некоторого теста производительности.Основной скрипт использовал proc_open () для вызова дочерних процессов.Таким образом, вы можете перенаправить вход и выход вашего скрипта в основной скрипт и обмениваться командами / данными.У меня больше нет источника этого сценария, но это грубая схема:

$fork = array();
$descriptorspec = array(
    0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
    1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
);
for ($i = 0; $i < 50; $i++){
    $fork[$i] = array('process' => NULL, 'pipes' => array());
    $fork[$i]['process'] = proc_open('php script.php', $descriptorspec, $fork[$i]['pipes']);
}
# Loop thru $fork, check feof of the pipes
# write commands, read data
# if all pipes return feof, proc_close($fork[$i]['process'] will return the returncode

Надеюсь, что-то из этого вам пригодится;)

0 голосов
/ 18 мая 2011

Вы могли бы упростить управление.

Запустите эти сценарии с параметром, чтобы они выполняли запрос с LIMIT param и разработали все, что вам нужно, на «кусочке» от общего количества.результат запроса

...