Паралельный запуск нескольких скриптов

f0x555_

Новичок
Паралельный запуск нескольких скриптов

Суть проблемы вот в чем.
Из одного скрипта необходимо вызывать несколько других скриптов/программ. Для этого я использую функцию popen, которая открывает канал к входному/выходному потоку.
Например вот так:
$x=popen("php script2.php PARAMETERS","w");
pclose($x);

И так ещё несколько раз. Так вот по неизвестным мне причинам скрипт (который вызывает остальные) ожидает завершения работы каждого скрипта, после чего переходит к следующему.. Хотя по идее должен передав параметры перейти к следующему, не дожидаясь окончания работы текущего...
К примеру:
a - скрипт вызывающий остальные
a вызывает b, ждет пока тот закончит работу (хотя не должен этого делать..)
a вызывает с, ждет пока тот закончит работу
и т.д.


Буду благодарен если кто-либо покажет в чем здесь закралась ошибка..
 

f0x555_

Новичок
SiMM
нет, эта функция сюда совсем не подходит.
popen это единственная в PHP функция, которая позволяет работать с командной строкой не дожидаясь окончания выполнения команды ;)
возможно будут ещё предложения? может быть кто-нибудь сталкивался с похожей проблемой?
 

Mescalito

Новичок
f0x555_
"a вызывает b, ждет пока тот закончит работу (хотя не должен этого делать..)"

- должен, где ты прочитал, что нет ?

как вариант, есле тебе не нужен вывод от запускаемого скрипта, то попробуй запускать его в фон

php script2.php PARAMETERS 2>&1&
 

chisto_tolyan

Враг народа
popen это единственная в PHP функция, которая позволяет работать с командной строкой не дожидаясь окончания выполнения команды
заблуждаетесь, пхп глубоко пофиг какой функцией работать с командной строкой. Ответ уже дали выше
 

SiMM

Новичок
> нет, эта функция сюда совсем не подходит.
Вы бы ссылки-то смотрели, прежде чем пургу нести.
 

AzAlt

Новичок
запуск внешней программы и передача данных через stdin

А кто-нибудь решал проблему передачи на эти внешние скрипты данных без ожидания завершения?

exec() запускает команды фоном и идёт дальше, но позволяет передать только как параметры в команду на консоль.

popen(), proc_open() позволяют передавать любые данные через stdin, но не дают вызывающему скрипту работать дальше, пока вызванный не завершится :(

Вилы. Передача данных через дополнительный файл (записываем файл, в параметр передаём путь к нему, читаем) как-то совсем не нравится :(

Есть идеи? :)

-~{}~ 07.05.07 18:57:

Видимо, увы. Чтобы внешний скрипт был независим, у него должны быть фактически закрытые stdin-stdout. Оттого и вилы между popen и exec :(
 

Сергей Тарасов

Профессор
"идимо, увы. Чтобы внешний скрипт был независим, у него должны быть фактически закрытые stdin-stdout. Оттого и вилы между popen и exec"

1. Запуск скрипта в бекграунд ./script &
2. Перенаправление вывода > ./script > /dev/null &
3. Перенаправление потоков ввода/вывода

0 (стандвртный ввод, stdin), доступный для чтения. И два других -- 1 (stdout) и 2 (stderr), доступные для записи.

Например, 2>&1, означает временное перенаправление вывода, с устройства stderr на устройство stdout.

А уж какой функцией запускать - это в данном случае не важно.
В вашем случае проще всего использовать exec
 

AzAlt

Новичок
Спасибо, но как передать данные на stdin потомку? Т.е. реализовать то, что делает popen?
Запустить фоном через exec не проблема, я об этом писал.
 

Сергей Тарасов

Профессор
Автор оригинала: AzAlt
Спасибо, но как передать данные на stdin потомку? Т.е. реализовать то, что делает popen?
Запустить фоном через exec не проблема, я об этом писал.
Тогда не совсем понимаю, что нужно сделать... :( А разве "потомку" нельзя передать что-то через параметры командной строки?
 

AzAlt

Новичок
Сергей, Вы бы почитали вопрос что ли =)

Через popen можно легко передать потомку скажем, килобайт 10 сериализованных данных через stdin. Через параметры это делать как-то рискованно (как передать в UTF-8, к примеру? какие ограничения на размер?). Но popen заставляет вызывающий скрипт ждать завершения вызываемого. exec - всё наоборот.
 

AzAlt

Новичок
Если уж браться за форки, то проще контроллер на сях переписать :)
Это отдельная тема. Пока мне не удавалось с ними подружиться под ПХП безглючно.
 

bushart

Новичок
WMix, Ну вы сравнили. Пайпы - это нативный и низкоуровневый инструмент ОС. А база данных - это высокоуровневый элемент инфраструктуры. Не дай бог, конвейеры будут работать через таких монстров )))
 
Сверху