Запуск параллельных процессов

Mocus

Guest
Запуск параллельных процессов

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

И надо, чтобы скрипт мог запускть другие скрипты. Но при этом чтобы он сам не ждал завершения работы дочерних скриптов, а продолжал работать.

И чтобы запуск каждого дочернего скрипта НЕ сопровождался открытием нового окна :) А всё это делалось на заднем фоне. Вроде для этого подходит команда перенаправления вывода вроде ">" ? Но она перенаправляет в файл ? А как чтобы в никуда ? Команда типа ">NULL" создаёт файл с именем "null" :) А если параллельно будет несколько скриптов работать ? Они будут за него драться :)

В общем, как мог объяснил проблему :) Кто что думает по этому поводу ?

Кстати, забыл... Обнаружил такой глюк - через сутки непрерывной работы php-скрипта у него СРЫВАЕТ БАШНЮ ! Начинает пороть какую-то ахинею. Никто не сталкивался ?
 

avatar

Guest
Re: Запуск параллельных процессов

Я так делаю:

PHP:
function run_bg_php($php_file, $args = "")
{
	if(! @file_exists($php_file) ) return false;
	ignore_user_abort(true);
		
	$path = dirname($php_file);
	$exe = basename($php_file);
	chdir($path);
	
    #Windows
	if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')
	{
		$php_cgi = @dirname(ini_get('extension_dir'))."/php.exe";
		pclose(popen( 'start "phpbg" "'.$php_cgi.'" -q '.escapeshellarg($exe)." ".escapeshellarg($args), "r"));
	}
	#UNIX
	else
	{
		$php_cgi = "/usr/bin/php";
		exec("./".$php_cgi.' -q '.escapeshellarg($exe." ".$args)." > /dev/null &");
	}
}

$php_file - полный путь до .php скрипта.
$php_cgi - должна содержать полный путь до бинарника PHP.
 

avatar

Guest
Re: Запуск параллельных процессов

А как чтобы в никуда ? Команда типа ">NULL" создаёт файл с именем "null"
И правильно делает, потому как nul надо написать ;)
 

Mocus

Guest
Что-то у меня не получилось... Эта функция не запускает параллельный процесс. И я не могу понять её смысл. Может кто-нибудь объяснит ? Вся соль, как я понял, в этой строке :
pclose(popen( 'start "phpbg" "'.$php_cgi.'" -q '.escapeshellarg($exe)." ".escapeshellarg($args), "r"));

Ну не понимаю я, как это должно работать :)

Допустим есть файл test.php с таким содержанием:
echo "Start\n";
//тут надо запустить скрипт sleep.php
echo "End";

А файл sleep.php содержит:
echo "Start Sleep\n";
sleep(60);
echo "End Sleep";

Ну как из test.php запустить sleep.php так, чтобы сам tesp.php продолжил работу ? В мануале написанно, что надо просто перенаправить вывод. Например exec("php sleep.php > nul"); Но он всё равно ждёт завершения его выполнения...
А про popen() и pclose() я вообще не понял...
 

Mocus

Guest
Блин... Ну неужели никто не знает ? Или этот раздел "не сильно" посещаемый ?
 

Mocus

Guest
Посидел я тут... подумал... поковырялся... и оно заработало !
pclose(popen( 'start "phpbg" /B php.exe -q test.php > test.txt', "r"));
где phpbg - название окна, /B - не создавать новое окно.
 
Сверху