Сделано в Раскрутке

Архив эхоконференции RU.PHP

- 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% на первый месяц обслуживания!
Самый простой способ получить ROOT-доступ
При переходе по баннеру - скидка 25% на первый месяц обслуживания!