php调用系统命令的函数的比较
了解命令的区别并进行直观的选择
这是一篇翻译文章,原作者通过表格的形式更加直观的展现出差异并进行选择
前言
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调用系统命令的函数的比较的更多相关文章
- python笔记之调用系统命令
python笔记之调用系统命令 目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数, ...
- python常用模块-调用系统命令模块(subprocess)
python常用模块-调用系统命令模块(subprocess) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. subproces基本上就是为了取代os.system和os.spaw ...
- Python 调用系统命令的模块 Subprocess
Python 调用系统命令的模块 Subprocess 有些时候需要调用系统内部的一些命令,或者给某个应用命令传不定参数时可以使用该模块. 初识 Subprocess 模块 Subprocess 模块 ...
- ASP.NET后台调用前台JS函数的三种常见方法
第一种:使用普通的添加控件中的Attributes属性进行调用 例如,像一般的普通的按钮:Button1.Attributes.Add("onclick","MyFun( ...
- unity中三种调用其他脚本函数的方法
第一种,被调用脚本函数为static类型,调用时直接用 脚本名.函数名()第二种,GameObject.Find("脚本所在的物体的名字").SendMessage(" ...
- MyEclipse调用Matlab打包函数
本文部分内容参考了http://www.360doc.com/content/15/1103/16/1180274_510463048.shtml 一.检查Java环境 对于已经装上JAVA环境的计算 ...
- C#调用Windows API函数截图
界面如下: 下面放了一个PictureBox 首先是声明函数: //这里是调用 Windows API函数来进行截图 //首先导入库文件 [System.Runtime.InteropServices ...
- [Effective JavaScript 笔记]第67条:绝不要同步地调用异步的回调函数
设想有downloadAsync函数的一种变种,它持有一个缓存(实现为一个Dict)来避免多次下载同一个文件.在文件已经被缓存的情况下,立即调用回调函数是最优选择. var cache=new Dic ...
- C# 使用 SAP NCO3.0 调用SAP RFC函数接口
最近使用C#调用SAP RFC函数,SAP提供了NCO3.0组件. 下载组件安装,之后引用“sapnco.dll”和“sapnco_utils.dll”两个文件. 在程序中 using SAP.Mid ...
随机推荐
- android 查看网络图片
public class MainActivity extends Activity { private EditText pathText; private ImageView imageView; ...
- python 读取文件时,精确的保留数据
import numpy as npimport pandas as pd point = pd.read_csv('waypoint21.csv') with pd.option_context(' ...
- sql developer 中文乱码解决办法
近日在fedora13中安装了oracle和sql developer,在英文环境下启动sql developer正常,可是切换到中文环境下就显示乱码.google了一下,确定是因为JDK不支持中文的 ...
- Update Vim to 8.0 in Ubuntu
add PPA sudo add-apt-repository ppa:jonathonf/vim Update and Install sudo apt-get update sudo apt-ge ...
- Django 与 Flask框架的比较
Django Django恐怕是最有代表性的Python框架了.它是一个遵循MMVC架构模式的开源框架.它的名字来自Django Reinhardt,一个法国作曲家和吉他演奏家,很多人认为他是历史上最 ...
- node快速起web服务器
首选,安装http-server模块 npm install http-server -g 在需要打开的静态页面的目录下,开启服务即可 http-server
- noi2019感想
不知道怎么想的,我现在已经没有心情写一篇完整的游记了. 发挥的是真的太差,Day1该切的T2没有切掉,想的时候漏了一个性质,便由100->45. Day1的时间全花在了T3上,结果想歪了,最后只 ...
- Nacos 常见问题及解决方法
Nacos 开源至今已有一年,在这一年里,得到了很多用户的支持和反馈.在与社区的交流中,我们发现有一些问题出现的频率比较高,为了能够让用户更快的解决问题,我们总结了这篇常见问题及解决方法,这篇文章后续 ...
- 【Flutter学习】组件通信(父子、兄弟)
一,概述 flutter一个重要的特性就是组件化.组件分为两种状态,一种是StatefulWidget有状态组件,一种是StatelessWidget无状态组件. 无状态组件不能更新状态,有状态组件具 ...
- Python基础教程(004)--Python的设计哲学
前言 Python已经成为了一门流行的编程语言. 知识点 1,优雅 2,明确 3,简单 Python开发者的哲学是:用一种方法,最好是只有一种方法来做一件事. 如果面临多种选择,Python开发者都会 ...