可能重复:
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(),但同样的问题....
非常感谢帮助.
使用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)
您可以在显示的页面中调用该命令,但在末尾附加一个& :
shell_exec("java -jar BiForce.jar settings.ini > log.txt &");
Run Code Online (Sandbox Code Playgroud)
这样该进程就会在后台启动。
另外,不需要(除非由您的应用程序定义)创建一个 process.php ,它本身通过 shell exec 调用 php。您可以通过包含到另一个文件来归档相同的功能。