Я пробовал NUMEROUS методы, чтобы запустить фоновый php-скрипт из другого php-скрипта. Мне нужно создать zip-файл файлов базы данных для загрузки. Я настроил его для мгновенной загрузки для отдельных файлов, но если файлы нужно закрепить, я хочу запустить фоновый процесс, который отправит ссылку на zip-файл. Процесс работает, но исходный сценарий все еще ждет завершения процесса. Я пробовал следующие методы, и, как я уже сказал, они работают, но они не пойдут на задний план. Он заставил меня ждать более восьми минут для определенных случаев (большие файлы ZIP), и никто не будет ждать этого.PHP - фоновые команды Windows работают, но все еще ждут завершения фонового процесса
print `php -f zipfiles7.php | at now`;
$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("C:\wamp\bin\php\php5.4.3\php.exe -f C:/wamp/www/zipfiles7.php", 0, false);
$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("cmd /c C:\wamp\bin\php\php5.4.3\php.exe -f C:/wamp/www/zipfiles7.php", 3, false);
$exe = "C:\wamp\bin\php\php5.4.3\php.exe";
$args = "C:\wamp\www\zipfiles7.php";
pclose(popen("start \"bla\" \"" . $exe . "\" " . escapeshellarg($args), "r"));
$cmd = "php-win.exe zipfiles7.php";
$cmd = "start /B php-win.exe zipfiles7.php";
$PID = shell_exec("nohup $cmd > test.txt 2>&1");
exec("Psexec.exe -i -d php.exe zipfiles7.php");
$cmd = "C:\wamp\bin\php\php5.4.3\php-win.exe -f C:\wamp\www\zipfiles7.php";
function _exec($cmd)
{
$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run($cmd, 0,false);
echo $cmd;
return $oExec == 0 ? true : false;
}_exec("C:\wamp\bin\php\php5.4.3\php-win.exe -f C:\wamp\www\zipfiles7.php");
$cmd = "C:\wamp\bin\php\php5.4.3\php-win.exe -f C:\wamp\www\zipfiles7.php";
pclose(popen('start /B ' . $cmd, 'r'));
$cmd = "C:\wamp\bin\php\php5.4.3\php-win.exe -f C:\wamp\www\zipfiles7.php";
pclose(popen("start /B " . $cmd, "r"));
system("cmd /c php zipfiles7.php > test.txt 2>&1");
exec('psexec start /B -d php.exe zipfiles7.php > test.txt 2>&1');
exec('psexec -d php.exe zipfiles7.php > test.txt 2>&1');
exec('psexec -d php.exe zipfiles7.php');
$cmd = "C:\wamp\bin\php\php5.4.3\php-win.exe -f C:\wamp\www\zipfiles7.php";
exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, "test.txt", "php_error.log"));
pclose(popen('start /B php zipfiles7.php > test.txt 2>&1', 'r'));
pclose(popen("start /B C:\wamp\bin\php\php5.4.3\php-win.exe -f C:\wamp\www\zipfiles7.php", "r"));
shell_exec('start /B "C:\wamp\bin\php\php5.4.3\php.exe -f C:\wamp\www\zipfiles7.php > test.txt 2>&1"');
exec('START /B "C:\wamp\bin\php\php5.4.3\php.exe -f C:\wamp\www\zipfiles7.php"', $output);
passthru("start /B c:/wamp/bin/php/php5.4.3/php-win c:/wamp/www/zipfiles7.php > test.txt 2>&1");
exec("php.exe -f zipfiles7.php > test.txt 2>&1");
exec("php-win -f zipfiles7.php > /dell/null 2>/dev/null &", $output);
exec("start /B php zipfiles7.php > test.txt 2>&1");
exec("start php.exe -f zipfiles7.php > test.txt 2>&1");
$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("cmd /C C:\wamp\www\batch.bat", 0, false);
exec("CHP.exe C:\wamp\www\batch.bat > test.txt 2>&1");
exec("start /min php zipfiles7.php > test.txt 2>&1");
shell_exec('call "cmd /c batch.bat"');
batch.bat
@echo off
"start /B bg C:\wamp\bin\php\php5.4.3\php.exe -f C:\wamp\www\zipfiles7.php > test.txt"
Дополнительные методы пытались:
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("pipe", "r") // stderr is a file to write to
);
$cmd = "start /B php.exe zipfiles7.php";
$process = proc_open($cmd, $descriptorspec, $pipes, null, null);
if (is_resource($process))
{ ....
// buffer all upcoming output
ob_start();
// get the size of the output
$size = ob_get_length();
// send headers to tell the browser to close the connection
header("Content-Length: $size");
header('Connection: close');
// flush all output
ob_end_flush();
ob_flush();
flush();
// close current session
if (session_id()) session_write_close();
exec("start /B php zipfiles7.php > test.txt 2>&1");
или
shell_exec('psexec -s -d php.exe zipfiles7.php');
или
$runCommand = 'php -q zipfiles7.php';
$WshShell = new COM(“WScript.Shell”);
$oExec = $WshShell->Run($runCommand, 7, false);
Даже пытается JavaScript
function background(){
var url = "C:\wamp\www\zipfiles7.php";// No question mark needed
xmlReq=new XMLHttpRequest();
xmlReq.open("POST",url,true);
xmlReq.send();
console.log("done");
}
echo '<script type="text/javascript">', 'background();', '</script>';
или
function background(){
var str = "Success";
var url = "C:\wamp\www\zipfiles7.php";
xmlReq=new XMLHttpRequest();
xmlReq.open("POST",url,true);
xmlReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlReq.setRequestHeader("Content-length", str.length);
xmlReq.setRequestHeader("Connection", "close");
xmlReq.send();
console.log("done");
}
Даже Аякс не собирается на задний план!
function background()
{
$.ajax(
{
type: "POST",
url: "zipfiles7.php",
data: data, // data to send to above script page if any
cache: false,
success: function(response)
{
alert('Succes');
}
});
}
Пожалуйста, помогите мне понять, почему процесс не идет на задний план. Заранее спасибо.
Я попытался перенаправить вывод в файл, но он все еще висит. Я слышал смешанные отзывы об использовании exec с окнами. Некоторые говорят, что это не работает вообще, а некоторые не согласны. Но ни один из методов, которые я пытаюсь работать (с зависанием). – Monkeybutt
Тогда я не слишком уверен, что вызывает проблему. Если у вас есть доступ к среде разработки linux, вы можете увидеть, правильно ли работает ваш скрипт в среде linux? (или, если вы этого не сделаете, вы можете загрузить дистрибутив Linux и установить его) – echochamber
Я буду изучать тестирование в среде linux. И у меня нет доступа, так что спасибо за предложение создать свою собственную.Я попробовал 'exec (sprintf ('/ usr/bin/php ...' метод также без успеха. – Monkeybutt