- RU.PHP ------------------------------------------------------------- RU.PHP -
Msg : #12089 [566]
От : Pavel Plesov 2:5051/1.33 09 января 05, 12:05
Кому : Dmitry Pljonkin 10 января 05, 21:20
Тема : exec() бэкграундом
-------------------------------------------------------------------------------
Hello, Dmitry!
Friday January 07 2005 00:48, Dmitry Pljonkin писал к All:
> Возникла необходимость скрипт запускать фоном, и что-то никак с этим
> не разберусь.
> В документации написано, что для этого надо перенаправить stdout и
> stderr в файл или еще куда-нибудь.
> Сделал так:
> exec("/usr/local/bin/php /mydir/myscript.php >/dev/null 2>/dev/null
> &");
> Вывод действительно давится, но основной скрипт все равно продолжает
> ждать завершения этого "дочернего" /mydir/myscript.php
> Это не смертельно, но и приятного мало. Как правильно надо сделать,
> чтобы основной скрипт заканчивал работу, не дожидаясь завершения
> работы дочерним?
Дело в том, что php ждет закрытия потока stdout этого процесса.
Под *nix могут спасти proc_*().
Более универсально - запуск через wrapper, который после запуска будет
закрывать stdout и далее запускать требуемую программу.
Hапример так:
==[wrapper.c]=================
#include
#include
#include
int main(int ac, char *av[]) {
if (ac < 2) {
fprintf(stderr, "Usage: %s string_to_exec\n", av[0]);
exit(0);
}
close(1);
system(av[1]);
return 0;
}
==============================
Компилировать:
cc -o wrapper wrapper.c
далее:
P.S. Более подробнее:
http://cvs.php.net/co.php/php-src/ext/standard/exec.c?r=1.111#60
VCWD_POPEN (в зависимости от условий компиляции) транслируется в popen или
popen_ex.
реализация popen_ex:
http://cvs.php.net/co.php/TSRM/tsrm_win32.c?r=1.26#171
wbr,
Pavel
---
* Origin: Trashwood station (2:5051/1.33)
При переходе по баннеру - скидка 25% на первый месяц обслуживания! При переходе по баннеру - скидка 25% на первый месяц обслуживания!