У меня есть обычная консольная (. * Exe) программа, которая принимает и выводит команды, используя стандартные I/O
, Я написал PHP-скрипт, который обрабатывает программу (с open_proc
так далее):
<?php
/*
scriptname: somemyscript.php
*/
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array('pipe', 'a')
);
$cwd = NULL;
$env = NULL;
$process = proc_open('someconsoleprogram.exe', $descriptorspec, $pipes, $cwd, $env);
if (is_resource($process)) {
stream_set_blocking($pipes[0], FALSE);
stream_set_blocking($pipes[1], FALSE);
while (true) {
$changed = $write = $pipes;if (@stream_select($changed, $write, $except = NULL, NULL) < 1)
continue;
foreach ($changed as $changed_stream) {
some code;
}
foreach ($write as $write_stream) {
some code;
}
}
}
fclose($pipes[0]);
fclose($pipes[1]);$return_value = proc_close($process);
}
Там нет никаких проблем. Но мне нужно, чтобы он работал как демон, поэтому я написал:
<?php
/*
scriptname: somemyscriptbgnd.php
*/
$cmd = 'php somemyscript.php';
execInBackground($cmd);
function execInBackground($cmd) {
if (substr(php_uname(), 0, 7) == "Windows"){
$handle = popen("start /B ". $cmd, 'r');
pclose($handle);
}
else {
exec($cmd . " > /dev/null &");
}
}
Поэтому, когда я бегу somemyscript.php
вручную работает нормально.
Однако когда я бегу somemyscriptbgnd.php
— somemyscript.php
работает в какой-то момент — простыми словами somemyscriptbgnd.php
закрывает как pclose
закрывает ручку
Вопрос в том what a problem that may be and how to launch somemyscript in background from another PHP script?
Нотабене Мне нужно, чтобы процесс запускался из скрипта — такие вещи, как cron и т. Д. Не подходят.
почему бы не использовать system (), то есть если вы работаете в Windows, но в основном решение вашей проблемы состоит в том, чтобы перенаправить вывод в dev / null, потому что в соответствии с руководством php, php_exec func не будет работать асинхронно, если его вывод не обрабатывается, поэтому наконец то
<?php exec("php 'yourscript.php' > /dev/null >/dev/null &"); ?>
nohup не является обязательным в зависимости от вашего кода / файла
Вы также можете попробовать для
'command' | at now
Надеюсь, ты получил это хорошо, брат.
Других решений пока нет …