Параллельный запуск с popen. Проблема.

Статус
В этой теме нельзя размещать новые ответы.

elcaste

Постоялец
Регистрация
30 Ноя 2007
Сообщения
322
Реакции
175
Пытаюсь запустить параллельно несколько процессов. Все бы хорошо, но только скрипт ждет завершения предпоследнего запуска в цикле.

т.е. запускаю:
Код:
<?php
  for ($i=0;$i<3;$i++){
      $handle = popen('cd /usr/local/www/apache22/data/launcher; /usr/local/bin/php ./some.php '.$i, "w");
  }
?>

он по циклу запускает:

some.php:
Код:
<?php
$fp = fopen('test'.$argv[1], "a");
for ($i=0;$i<10;$i++){
    fwrite($fp, 1);
    sleep(60);
}
?>

Результат: создается test0, test1 и все, ждет пока закончится цикл записи в test1 и только после этого начинает писАть в test2...
Причем, если запускаю первый скрипт из дебаггера, то все нормально: он запускает три процесса и помирает.

Что не так делаю?


ЗЫ: pcntl использовать не могу, на хостинге отсутствует.
 
Может попробовать & в конце командной строки запуска добавить?
 
если на *никсах то можешь чтот подобное попробовать (я не тестировал, просто накинул пару строк с памяти)
Код:
<?php

define("PROCESS_COUNT", 3);
for($i=0; $i<PROCESS_COUNT; ++$i)
{
    if(($pid = pcntl_fork()) == 0)
    {
        exit(child_main($i));
    }
}

function child_main($param)
{
    $fp = fopen('test'.$param, "a");
    for ($i=0;$i<10;$i++){
        fwrite($fp, 1);
        sleep(60);
    }
    return 1;
}

?>
 
если на *никсах то можешь чтот подобное попробовать (я не тестировал, просто накинул пару строк с памяти)
Код:
<?php

define("PROCESS_COUNT", 3);
for($i=0; $i<PROCESS_COUNT; ++$i)
{
    if(($pid = pcntl_fork()) == 0)
    {
        exit(child_main($i));
    }
}

function child_main($param)
{
    $fp = fopen('test'.$param, "a");
    for ($i=0;$i<10;$i++){
        fwrite($fp, 1);
        sleep(60);
    }
    return 1;
}

?>

Я бы с удовольствием "пофоркал", но

ЗЫ: pcntl использовать не могу, на хостинге отсутствует.
:)

Добавлено через 10 минут
Может попробовать & в конце командной строки запуска добавить?

Помогло. Еще и по разным указателям раскидал, теперь все отлично. Спасибо.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху