个性化阅读
专注于IT技术分析

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

在许多情况下, 你宁愿使用控制台而不是UI来执行php脚本, 但是在某些情况下, 使用UI是触发操作的唯一方法。

可能你已经知道如何使用PHP执行bash任务, 但是如果你的任务太繁重且完成时间太长怎么办?没有人希望看到一个小时的进度条, 期望服务器发出答案……至少不会处理工作。

在这种情况下, 你将要忽略输出并让你的任务在后台运行。为了实现我们的目标, 我们需要在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, else
   if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
       system($comando." > NUL");
   }else{
       shell_exec("/usr/bin/nohup ".$comando." >/dev/null 2>&1 &");
   }
}

该函数期望将shell的输入作为第一个参数:

<?php
executeAsyncShellCommand(`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方法始终期望输出, 没有办法阻止它, 但是我们使用此技巧为每个平台重定向空输出。

玩得开心 !

赞(0)
未经允许不得转载:srcmini » 如何在Linux和Windows环境中使用PHP执行Shell命令而无需等待结果(异步)

评论 抢沙发

评论前必须登录!