php执行系统命令的四个函数shell_exec, exec, passthru, system分别的使用场景是什么?

php执行系统命令的四个函数shell_exec, exec, passthru, system分别的使用场景是什么?
百度了一下,感觉没理解到位。所以请大家再说说。

阅读 25.8k
3 个回答
  • shell_exec()

通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
也就是说, PHP先运行一个shell环境, 然后让shell进程运行你的命令, 并且把所有输出已字符串形式返回, 如果程序执行有错误或者程序没有任何输出, 则返回null.

  • exec()

string exec ( string $command [, array &$output [, int &$return_var ]] )
与 shell_exec() 不一样, exec不会创建shell进程, 可以理解是php进程直接创建一个子进程, 运行指定的命令, 返回值只返回命令的最后一行, 所有的返回已参数形式返回, 上面的 $output, 进程的退出代码以另外一个参数变量返回, 上面的 $return_var

  • passthru()

void passthru ( string $command [, int &$return_var ] )
与 exec() 类似, 唯一不同的是, 命令的所有输出返回内容都不再导入到 PHP 环境, 而是直接作为输出内容, 返回到浏览器的输出上, 等效是把所有返回内容直接 echo 输出.

  • system()

这个方法和 passthru() 类似, 但是 system() 方法会在程序的每行输出的时候执行一次缓存输出动作, 可以理解为, 只要外部程序输出一行, php 就会马上把内容推送到浏览器, 无论这个内容是否足够大. php通常为了输出效率, 都会有一个输出缓存, 会等到输出内容足够大之后, 再一次输出返回. system() 方法则强制输出内容立刻推送, 即使输出的内容只有一个字母. 如果客户端具有实时打印服务器的返回 http 内容流的能力, 就可以看到 system() 的实时推送效果.

可以执行操作系统的相关命令,感觉一个应用场景就是另起一个进程在后台来执行一些费时但无需前台展示结果的内容,有点类似计划任务,在简单的场景也可以代替队列。例如有文件abc.php,里面包含发送邮件相关,比较费时。而其它文件中处理完正常逻辑后想发送邮件,但又不想管邮件有没有成功,只要执行就是,那就可以:

//正常逻辑
...
//处理费时的
exec('php abc.php  > /dev/null &');
// 或者
exec('php abc.php | at now');
//继续走你
...

类似这种吧,以上仅仅是linux,且可能有权限问题或路径问题,至于windows可能还需要其它函数处理。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏