如何在Linux和Windows环境中使用PHP执行Shell命令而无需等待结果(异步)

在许多情况下, 你宁愿使用控制台而不是UI来执行php脚本, 但是在某些情况下, 使用UI是触发操作的唯一方法。
可能你已经知道如何使用PHP执行bash任务, 但是如果你的任务太繁重且完成时间太长怎么办?没有人希望看到一个小时的进度条, 期望服务器发出答案……至少不会处理工作。
【如何在Linux和Windows环境中使用PHP执行Shell命令而无需等待结果(异步)】在这种情况下, 你将要忽略输出并让你的任务在后台运行。为了实现我们的目标, 我们需要在Windows中使用系统函数, 在ubuntu和linux中使用shell_exec函数。
shell_execute:通过shell执行命令, 并以字符串形式返回完整的输出(但在这种情况下将避免这样做)。
系统:执行外部程序并显示输出(在这种情况下都不显示)。
这两个函数都允许你使用命令行执行某些操作, 但是我们将使用简单的技巧来防止这些函数在每个平台上等待输出。
以下功能可让你在大多数情况下轻松完成操作:

< ?php/*** Executes a console command (like execute the command via putty) in* a linux environment or windows from php without await for the result.* * Useful for execute extense tasks.* * @param {String} $comando*/function executeAsyncShellCommand($comando = null){if(!$comando){throw new Exception("No command given"); }// If windows, elseif (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {system($comando." > NUL"); }else{shell_exec("/usr/bin/nohup ".$comando." > /dev/null 2> & 1 & "); }}

该函数期望将shell的输入作为第一个参数:
< ?phpexecuteAsyncShellCommand(`echo hello`);

重要说明:在某些Linux环境或Windows中, 你需要更改引号(“ ” 或” ” ), 否则命令将失败。
重要的是要知道在哪个平台上使用哪个命令, 并在该平台上重定向输出。对于Windows, 使用{command}> NUL, 对于Linux, Ubuntu / usr / bin / nohup {command here}> / dev / null 2> &1&将解决问题。
但是, 请注意, 此功能将像php bin / console do:something一样帮助你使用简单的命令, 如果你的命令使用复杂的结构或包含特殊字符, 则可能需要根据需要自己实现。
以下自写代码段通过php在Windows中使用系统功能和特殊字符(使用escapeshellcmd函数进行转义)在Windows中写入文件:
注意:escapeshellcmd会转义字符串中的任何字符, 这些字符可能会用于诱骗Shell命令执行任意命令。
< ?php$filecontent = escapeshellcmd("> something that could'nt work in the command line < Hello world! I'm going to s@y s?mething with weird characters"); $comando = `echo {$filecontent} > foo.txt`; if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {system($comando." > NUL"); }else{shell_exec("/usr/bin/nohup ".$comando." > /dev/null 2> & 1 & "); }

要考虑的提示
  • 在命令行中实时测试你的命令, 看看它是否可以单独工作, 如果可以, 那么它将与该功能一起工作。
  • 如果你需要执行长任务并且用户可能不想等待或查看进度, 则此方法非常有用。
  • 如果你使用该命令在PHP中执行另一个命令, 请记住要为函数和脚本提供更高的ini_set(‘ max_execution_time’ , seconds)执行时间, 因为默认时间限制为30秒。
  • system和shell_exec方法始终期望输出, 没有办法阻止它, 但是我们使用此技巧为每个平台重定向空输出。
玩得开心 !

    推荐阅读