PHP popen каналы становятся нулевыми после одной итерации

Я пытаюсь сгенерировать 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 … этот код никогда не выполняется, даже если он должен.

Что происходит? Я слепой?

2

Решение

foreach работает с копией массива. Вам нужно ссылку $worker с помощью & изменить элементы исходного массива:

foreach($workers as &$worker) {

Альтернатива:

foreach($workers as $key => $worker) {
$workers[$key] = 'something';
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]