php system()shell_exec()挂起浏览器

Wor*_*rld 5 php shell-exec

可能重复:
PHP中的异步shell exec

我需要在后台运行一个java程序.

process.php包含

shell_exec("php php_cli.php")

php_cli.php包含

shell_exec("java -jar BiForce.jar settings.ini > log.txt");
Run Code Online (Sandbox Code Playgroud)

我使用ajax异步调用process.php

当我单击调用ajax函数的网页中的链接(用于运行process.php)时,webage显示"正在加载".当我同时点击其他链接时它没有响应.

java程序大约需要24小时才能完成执行,因此用户不会等到执行结束.

问题是浏览器继续加载,并且在单击链接时不会转到其他页面.

我也尝试过system(),但同样的问题....

非常感谢帮助.

Gre*_*reg 5

使用shell_exec等待命令挂起,这就是你的脚本正在做的事情.

如果您的命令没有任何等待时间,那么您的脚本也不会.

您可以从原始脚本调用另一个PHP脚本,而无需等待它挂断:

$processId = shell_exec(
    "nohup " .                          // Runs a command, ignoring hangup signals.
    "nice " .                           // "Adjusted niceness" :) Read nice --help
    "/usr/bin/php -c " .                // Path to your PHP executable.
    "/path/to/php.ini -f " .            // Path to your PHP config.
    "/var/www/php_cli.php " .           // Path to the script you want to execute.
    "action=generate > /process.log " . // Log file.
    "& echo $!"                         // Make sure it returns only the process id.
    );
Run Code Online (Sandbox Code Playgroud)

然后可以使用此命令检测脚本是否已完成:

exec('ps ' . $processId, $processState);
// exec returns the result of the command - but we need to store the process state.
// The third param is a referenced variable.

// First key in $processState is that it's running.
// Second key would be that it has exited.
if (count($processState) < 2) {
    // Process has ended.
}
Run Code Online (Sandbox Code Playgroud)


Lum*_*dil 2

您可以在显示的页面中调用该命令,但在末尾附加一个& :

shell_exec("java -jar BiForce.jar settings.ini > log.txt &");
Run Code Online (Sandbox Code Playgroud)

这样该进程就会在后台启动。

另外,不需要(除非由您的应用程序定义)创建一个 process.php ,它本身通过 shell exec 调用 php。您可以通过包含到另一个文件来归档相同的功能。