Я пытаюсь сгенерировать 12 рабочих процессов для работы с различными частями моих данных, используя popen
в PHP под Windows. Вот мой код … он довольно общий.
<?php
set_time_limit(0);
$workers = array_fill(0, 12, null);
$currChunk = 56;
$working = true;
while($working == true) {
$working = false;
foreach($workers as $worker) {
if($worker == null) {
if($currChunk < 265) {
$worker = popen('C:\php\php.exe "C:\users\administrator\desktop\do one chunk.php" '.$currChunk, 'r');
echo("\r\nStarted a worker on chunk ".$currChunk);
$currChunk ++;
$working = true;
}
} else {
if(feof($worker)){
pclose($worker);
$worker = null;
echo("A worker finished!");
} else {
fread($worker, 1);
$working = true;
}
}
}
sleep(.01);
}
?>
Здесь происходит то, что сценарий просто постоянно запускает новых работников, пока не достигнет предела 265, а затем заканчивается. Он никогда не ждет, когда они действительно закончат.
я пробовал echo
значение $worker
после popen
и я получаю «Resource Instance ID #XXX», который говорит мне, что работает нормально.
Я также пытался echo
Я «здесь!» для else
раздел кода, который должен выполняться, если рабочий не установлен в null … этот код никогда не выполняется, даже если он должен.
Что происходит? Я слепой?
foreach
работает с копией массива. Вам нужно ссылку $worker
с помощью &
изменить элементы исходного массива:
foreach($workers as &$worker) {
Альтернатива:
foreach($workers as $key => $worker) {
$workers[$key] = 'something';
}
Других решений пока нет …