Xpoint
   [напомнить пароль]

Как запустить внешний скрипт PHP

Метки: [без меток]
2009-06-18 19:33:43 [обр] b_evgeniy[досье]
Подскажите, какой функцией можно запустить внешний скрипт. Например запустив скрипт 111.php, он запустит скрипт 222.php, include & requier не подходят, так как надо чтобы файл 111.php, просто запустил скрипт и продлжил работать, а скрипт 222.php работал сам по себе, например обсчитывал базу данных.
спустя 5 часов [обр] b_evgeniy[досье]

решение нашел сам: просто через сокеты запускаешь скрипт, неважно даже на каком хосте он находится, получаешь заголовок ответа,и можно запускать следующий.

Например можно так.

$header= "GET /nf.php HTTP/1.0\r\n";
$header.= "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, */*\r\n";
$header.= "Accept-Language: ru\r\n";
$header.= "Content-Type: application/x-www-form-urlencoded\r\n";
$header.= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; (R1 1.5))\r\n";
$header.= "Host: ".$_SERVER['HTTP_HOST']."\r\n\r\n";

$sckt = fsockopen($_SERVER['HTTP_HOST'], 80);
fputs($sckt,$header);
$serv_answer = fgets($sckt,2048);
fclose($sckt);
echo $serv_answer;

спустя 6 часов [обр] Филипп Ткачев(20/112)[досье]
А разве приведенная вами конструкция не ждет завершения работы nf.php?
спустя 2 часа 31 минуту [обр] Александр Петров(2/4)[досье]
$handle = fopen('http://dfsdfsgfdg.ru/dfgdfg.php', "rb");
$contents = stream_get_contents($handle);
fclose($handle);
print $contents;
Как вариант
спустя 3 часа 37 минут [обр] Алексей Севрюков(162/1280)[досье]

Все вышеуказанные конструкции не будут работать правильно, т.к. они будут ждать завершения выполнения дочернего скрипта. И если он выполняется долго - ничего хорошего не получится.
Я решал такую же проблему на Perl и использовал fork + system("/usr/bin/perl script.pl &") + конструкции для отсоединения дочернего потока от родительского, чтобы его нечаянно не убило.
Отделением процесса занимался модуль perldoc Proc::Daemon, конкретно - метод Init.

Такой подход работает так как мне нужно - запускает внешний скрипт, который продолжает работать полностью автономно и ни от кого уже не зависит.

Уверен, что на PHP есть что-то похожее.

P.S. Только, возможно, fork в моей схеме совершенно лишний, но из-за принципа "работает — не трогай" я не лезу.

спустя 1 час 19 минут [обр] b_evgeniy[досье]

fgets($sckt,2048); ждет результата выполнения, но если его убрать то все работает нормально.

$sckt = fsockopen($_SERVER['HTTP_HOST'], 80);
fputs($sckt,$header);
sleep(1);
fclose($sckt);

спустя 3 часа 53 минуты [обр] Филипп Ткачев(20/112)[досье]
В php есть system(), exec(). Но насчет их асинхронного выполнения ничего не знаю. Надо провести опыты.
спустя 52 минуты [обр] Алексей Севрюков(162/1280)[досье]
b_evgeniy[досье] А сколько времени работает дочерний скрипт?
спустя 1 час 33 минуты [обр] Филипп Ткачев(20/112)[досье]
А мне интересно, какой смысл в параллельной работе 2х скриптов, если они не взаимодействуют между собой?
спустя 3 часа 29 минут [обр] b_evgeniy[досье]
Дочерний скрипт работает минуты 3, могу скинуть рабочий пример. А смысл в параллельной работе к примеру такой: есть база интернет магазина и управляющим скриптом нужно произвести с базой какие-то дейстия, запускаю скрипт адмим.php, в нем различные опции, грубо говоря нажал пуск и другой скрипт начал выполнять с базой какие-нибудь действия, нажал еще что-нибудь выполняются другие действия с базой, может даже различые базы и дочерних скрипта их обрабатывают. Ну или как-то по другому :)
спустя 10 часов [обр] Алексей Севрюков(162/1280)[досье]
b_evgeniy[досье] вот есть подозрение что при времени выполнении больше чем таймаут сервера - скрипт будет убиваться. Потому что как минимум его нужно запускать в системе, а не через http. Тем более если он находится на том же сервере что и запускающий скрипт.
спустя 11 часов [обр] Филипп Ткачев(20/112)[досье]
Powered by POEM™ Engine Copyright © 2002-2005