了解命令的区别并进行直观的选择
这是一篇翻译文章,原作者通过表格的形式更加直观的展现出差异并进行选择

前言

PHP有众多调用系统命令的函数,大致如下:

  • system()
  • exec()
  • passthru()
  • shell_exec()
  • ``

于是就想着总结一下它们的差异。本想着对照手册把它们的函数功能,参数,返回等都列出来,但是其实不利于直观看出差异来。谷歌上发现大多数人跟我想的一样,更侧重于函数功能的介绍。于是通过stack overflow,终于发现了满意的答案,虽然答案简短但是直观,于是准备翻译一下,原文地址:http://stackoverflow.com/questions/732832/php-exec-vs-system-vs-passthru#answer-39681338

原文翻译

先前的回答看起来有点疑惑、不完整(译注:其他回答通篇文字说明),因此以下表总结了区别:

Command Displays Output Can Get Output Gets Exit Code
system() Yes(text) Last line only Yes
passthru Yes(raw) No Yes
exec No Yes (array) Yes
shell_exec No Yes (string) No
backticks(``) No Yes (string) No
  • 'Displays Output'意味着它将输出流输出到浏览器(或者如果在命令行运行,就在命令行输出)
  • 'Can Get Output'意味着你可以获取到命令的输出并分配给PHP变量
  • 'The "exit code'是一个命令返回的特殊值(也叫做'返回状态'),'0'意味着成功,其他值通常是错误码

其他易混淆的注意事项:

  • shell_exec()和执行操作符(``)功能是一样的
  • 可以使用proc_open()和popen()交互式读/写数据流
  • 如你想要捕获、展示错误信息,命令增加'2>&1'
  • 使用escapeshellcmd()过滤可能包含问题字符的命令的参数
  • 如果exec传入$output变量存储输出,如果$output变量不为空,输出内容将会插入到$output变量中(译注:$output参数是引用传值的)。所以你可能首先要删除($output)。

翻译完。

附加内容:安全性

任何脚本都需要在安全的环境下执行,PHP提供了两个函数来保证执行系统命令的安全。

1.escapeshellcmd()-shell 元字符转义

说明:对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。反斜线()会在以下字符之前插入: #&;`|*?~<>^()[]{}$, \x0A 和 \xFF。 ' 和 " 仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及 % 都会被空格代替。

2.escapeshellarg()-把字符串转码为可以在 shell 命令里使用的参数

说明:将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。

php调用系统命令的函数的比较的更多相关文章

  1. python笔记之调用系统命令

    python笔记之调用系统命令 目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数, ...

  2. python常用模块-调用系统命令模块(subprocess)

    python常用模块-调用系统命令模块(subprocess) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. subproces基本上就是为了取代os.system和os.spaw ...

  3. Python 调用系统命令的模块 Subprocess

    Python 调用系统命令的模块 Subprocess 有些时候需要调用系统内部的一些命令,或者给某个应用命令传不定参数时可以使用该模块. 初识 Subprocess 模块 Subprocess 模块 ...

  4. ASP.NET后台调用前台JS函数的三种常见方法

    第一种:使用普通的添加控件中的Attributes属性进行调用 例如,像一般的普通的按钮:Button1.Attributes.Add("onclick","MyFun( ...

  5. unity中三种调用其他脚本函数的方法

    第一种,被调用脚本函数为static类型,调用时直接用  脚本名.函数名()第二种,GameObject.Find("脚本所在的物体的名字").SendMessage(" ...

  6. MyEclipse调用Matlab打包函数

    本文部分内容参考了http://www.360doc.com/content/15/1103/16/1180274_510463048.shtml 一.检查Java环境 对于已经装上JAVA环境的计算 ...

  7. C#调用Windows API函数截图

    界面如下: 下面放了一个PictureBox 首先是声明函数: //这里是调用 Windows API函数来进行截图 //首先导入库文件 [System.Runtime.InteropServices ...

  8. [Effective JavaScript 笔记]第67条:绝不要同步地调用异步的回调函数

    设想有downloadAsync函数的一种变种,它持有一个缓存(实现为一个Dict)来避免多次下载同一个文件.在文件已经被缓存的情况下,立即调用回调函数是最优选择. var cache=new Dic ...

  9. C# 使用 SAP NCO3.0 调用SAP RFC函数接口

    最近使用C#调用SAP RFC函数,SAP提供了NCO3.0组件. 下载组件安装,之后引用“sapnco.dll”和“sapnco_utils.dll”两个文件. 在程序中 using SAP.Mid ...

随机推荐

  1. HDU 3622 Bomb Game(2-sat)

    Bomb Game Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. 二维码相关---java生成二维码名片,而且自己主动保存到手机通讯录中...

    版权声明:本文为博主原创文章,未经博主credreamer 同意不得转载 违者追究法律责任. https://blog.csdn.net/lidew521/article/details/244418 ...

  3. vue中关于checkbox数据绑定v-model

    vue.js为开发者提供了很多便利的指令,其中v-model用于表单的数据绑定很常见, 下面是最常见的例子: <div id='myApp'>     <input type=&qu ...

  4. git pull的时候发生冲突的解决方法之“error: Your local changes to the following files would be overwritten by merge”

    今天在使用git pull 命令的时候发生了以下报错 目前git的报错提示已经相关友好了,可以直观的发现,这里可以通过commit的方式解决这个冲突问题,但还是想看看其他大佬是怎么解决这类问题的 在网 ...

  5. Ubuntu下安装chrome浏览器步骤

    进入 Ubuntu 18.04 桌面,按下 Ctrl + Alt + t 键盘组合键,启动终端. 也可以按下 Win 键(或叫 Super 键),在 Dash 的搜索框中输入 terminal 或“终 ...

  6. 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)

    常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数据,然后使用适合的视图展示详情数据. 如果网速很慢,代码发起一个HTTP请求后,就卡住不动了,直到十几秒后才拿到HTT ...

  7. nginx 反向代理服务

    目录 Nginx代理服务基本概述 Nginx代理服务常见模式 Nginx代理服务支持协议 Nginx反向代理配置语法 Nginx反向代理场景实践 配置代理实战 在lb01上安装nginx Nginx代 ...

  8. 解决VMwave下卡死的办法

    在VMwave路径下找到vmwave.log文件: 如上图所示:在资源监视器中找到name = vmwave-vmx.exe ,pid = 5940的进程,然后杀死.

  9. Python3.5-20190504-廖老师的2-if elif else continue break

    条件判断: if 条件1: 代码块 elif 条件2: 代码块 else 条件3: 代码块 brith = input("请输入出身年月:") if  brith > 200 ...

  10. js保留两位小数,自动补充零

    function returnFloat(value){  var value=Math.round(parseFloat(value)*100)/100;  var xsd=value.toStri ...