首页 后端开发 php教程 PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍_PHP教程

PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍_PHP教程

Jul 21, 2016 pm 03:24 PM
exec php shell system 介绍 使用 命令 命令行 工具 详细

所有这些命令都衍生一个子进程,用于运行您指定的命令或脚本,并且每个子进程会在命令输出写到标准输出 (stdout) 时捕捉它们。

shell_exec()

shell_exec() 命令行实际上仅是反撇号 (`) 操作符的变体。如果您编写过 shell 或 Perl 脚本,您就知道可以在反撇号操作符内部捕捉其他命令的输出。例如,清单 1 显示了如何使用反撇号在当前目录中获取每个文本(.txt)的单词计数。

清单 1. 使用反撇号计算单词数量

复制代码 代码如下:

#! /bin/sh
number_of_words=`wc -w *.txt`
echo $number_of_words

#result would be something like:
#165 readme.txt 388 results.txt 588 summary.txt
#and so on....

在您的 PHP 脚本中,您可以在 shell_exec() 中运行这个简单的命令,如清单 2 所示,并获取想要的结果。这里假设在同一个目录下有一些文本文件。

清单 2. 在 shell_exec() 中运行相同的命令
复制代码 代码如下:

$results = shell_exec('wc -w *.txt');
echo $results;
?>

在图 1 中可以看到,获得的结果与从 shell 脚本得到的一样。这是因为 shell_exec() 允许您通过 shell 运行外部程序,然后以字符串的形式返回结果。
图 1. 通过 shell_exec() 运行 shell 命令的结果
PHP 命令行工具 shell exec, exec, passthru, system a669388d201eb3de
注意,仅使用后撇号操作符也会得到相同的结果,如下所示。
清单 3. 仅使用后撇号操作符
复制代码 代码如下:

$results = `wc -w *.txt`;
echo $results;
?>

清单 4 给出了一种更加简单的方法。
清单 4. 更加简单的方法
复制代码 代码如下:

echo `wc -w *.txt`;
?>

通过 UNIX 命令行和 shell 脚本能够完成很多东西,知道这点很重要。例如,您可以使用竖线将命令连接起来。您甚至可以使用操作符在其中创建 shell 脚本,并且仅调用 shell 脚本(根据需要使用或不使用参数)。

例如,如果您仅希望计算该目录下的前 5 个文本文件的单词数,那么可以使用竖线 (|) 将 wc 和 head 命令连接起来。另外,您还可以将输出结果放到 pre 标记内部,让它能够更美观地呈现在 Web 浏览器中,如下所示。

清单 5. 更加复杂的 shell 命令
复制代码 代码如下:

$results = shell_exec('wc -w *.txt | head -5');
echo "".$results . "";
?>

图 2 演示了运行清单 5 的脚本得到的结果。
图 2. 从 shell_exec() 运行更复杂的 shell 命令得到的结果
PHP 命令行工具 shell exec, exec, passthru, system f3a26409a75568a6
在本文的后面部分,您将学习如何使用 PHP 为这些脚本传递参数。现在您可以将它看作运行 shell 命令的一种方法,但要记住您只能看到标准输出。如果命令或脚本出现错误,您将看不到标准的错误 (stderr),除非您通过竖线将它添加到 stdout。

passthru()

passthru() 允许您运行外部程序,并在屏幕上显示结果。您不需要使用 echo 或 return 来查看结果;它们会显示在浏览器上。您可以添加可选的参数,即保存从外部程序返回的代码的变量,比如表示成功的 0,这为调试提供更好的机制。

在清单 6 中,我使用 passthru() 命令运行在前面小节运行的单词计数脚本。如您所见,我还添加一个包含返回代码的 $returnval 变量。

清单 6. 使用 passthru() 命令运行单词计数脚本
复制代码 代码如下:

passthru('wc -w *.txt | head -5',$returnval);
echo "
".$returnval;
?>

注意,我不需要使用 echo 返回任何东西。结果会直接显示在屏幕上,如下所示。
图 3. 使用 return 代码运行 passthru() 命令的结果
PHP 命令行工具 shell exec, exec, passthru, system 3cec849f89db6011
在清单 7 中,我通过删除脚本头部的 5 前面的短横线 (-) 引入一个小错误。
清单 7. 在单词计数脚本中引入一个错误
复制代码 代码如下:

//we introduce an error below (removing - from the head command)

passthru('wc -w *.txt | head 5',$returnval);
echo "
".$returnval;
?>

注意,脚本未能按照预期运行。您得到的是一个空白的屏幕,一条水平线和返回值 1,如图 4 所示。这个返回代码通常表明发生了某些错误。如果能够测试返回代码,查找和修复错误就容易多了。
图 4. 使用 passthru() 时查看错误代码
PHP 命令行工具 shell exec, exec, passthru, system 9e8f40d55fd5196f
exec()
exec() 命令与 shell_exec() 相似,不同之处是它返回输出的最后一行,并且可选地用命令的完整输出和错误代码填充数组。清单 8 展示了当运行 exec() 而不捕捉数据数组中的数据时发生的事情。
清单 8. 运行 exec() 而不捕捉数据数组中的数据
复制代码 代码如下:

$results = exec('wc -w *.txt | head -5');
echo $results;
#would print out just the last line or results, i.e.:
#3847 myfile.txt
?>

为了捕捉数组中的结果,要将该数组的名称作为第二个参数添加到 exec()。我在清单 9 中执行了这个步骤,并以 $data 作为数组的名称。
清单 9. 从 exec() 捕捉数据数组的结果
复制代码 代码如下:

$results = exec('wc -w *.txt | head -5',$data);
print_r($data);
#would print out the data array:
#Array ( [0]=> 555 text1.txt [1] => 283 text2.txt)
?>

在捕捉数组中的结果之后,您可以对每行进行一些处理。例如,您可以在第一个空格处进行划分,将分离的值存储在数据库表中,或对每个行应用特定的格式或标记。
system()
如清单 10 所示,system() 命令是一种混合体。它像 passthru() 一样直接输出从外部程序接收到的任何东西。它还像 exec() 一样返回最后一行,并使返回代码可用。
清单 10. system() 命令
复制代码 代码如下:

system('wc -w *.txt | head -5');
#would print out:
#123 file1.txt 332 file2.txt 444 file3.txt
#and so on
?>

一些例子
现在您已经了解如何使用这些 PHP 命令,但可能仍然有一些疑问。例如,什么时候应该使用哪个命令?这完全由您的需求决定。
大多数情况下,我使用 exec() 命令和数据数组处理所有东西。或者对更简单的命令使用 shell_exec(),尤其是不关心结果时。如果仅需返回一个 shell 脚本,我就使用 passthru()。通常,我在不同的场合中使用不同的函数,并且有时它们是可以互换的。这完全取决于我的心情和要实现的目的。
您可能提问的另一个问题是 “它们的长处是什么?”。如果您没有头绪,或者一个项目非常适合使用 shell 命令,但不知道如何使用,那么我在这里提供一些见解。
如果您正在编写一个提供各种备份或文件传输功能的应用程序,您可以选择使用 shell_exec() 或这里提供的其他命令之一运行 rsync 支持的 shell 脚本。您可以编写 shell 脚本使其包含必要的 rsync 命令,然后使用 passthru() 根据用户的命令或 cron 作业执行它。
例如,一位用户在您的应用程序中有适当的权限(比如管理员权限),他想将 50 个 PDF 文件从一个服务器发送到另一个服务器。那么,该用户需要在应用程序中导航到正确的位置,单击 Transfer,选择需要发送的 PDF,然后单击 Submit。在这个过程中,该表单应该有一个 PHP 脚本,它使用返回选项变量通过 passthru() 运行 rsync 脚本,这样您就知道是否发生问题,如下所示。
清单 11. 通过 passthru() 运行 rsync 脚本的示例 PHP 脚本
复制代码 代码如下:

passthru('xfer_rsync.sh',$returnvalue);
if ($returnvalue != 0){
//we have a problem!
//add error code here
}else{
//we are okay
//redirect to some other page
}
?>

如果您的应用程序需要列出进程或文件,或关于这些进程或文件的数据,您可以使用本文总结的命令之一轻松实现这个目的。例如,一个简单的 grep 命令能够帮助您找到匹配特定搜索条件的文件。将它与 exec() 命令一起使用可以将结果保存到一个数组中,这允许您构建一个 HTML 表或表单,它们又进一步允许您运行其他命令。
到目前为止,我讨论了用户生成的事件 —— 用户只要按下按钮或单击链接,PHP 就运行相应的脚本。您还可以将独立的 PHP 脚本和 cron 或其他日程安排程序一起使用,从而实现一些有趣的效果。例如,如果您一个备份脚本,您可以通过 cron 运行它,或者将它打包到 PHP 脚本后在运行。为什么要这样做?这似乎是多余的,不是吗?不是这样的 —— 您需要这样考虑,您可以通过 exec() 或 passthru() 运行备份脚本,然后根据返回代码执行一些行为。如果出现错误,您可以将其记录到错误日志或数据库中,或发送一封警告电子邮件。如果脚本成功,您可以将原始的输出转储到数据库(例如,rsync 有一个详尽(verbose)模式,对随后诊断问题十分有用)。

--------------------------------------------------------------------------------
安全
我们在这里简要讨论一下安全性:如果您接受用户输入并将信息传递到 shell,那么最好过滤用户输入。删除您认为有害的命令和不允许的内容,比如 sudo(作为超级用户运行)或 rm(删除)。事实上,您可能不希望用户发送开放的请求,而是让他们从列表中选择。
例如,您运行一个接受文件列表作为参数的传输程序,您应该通过一系列复选框列出所有文件。用户可以选择和取消选择文件,并通过单击 Submit 激活 rsync shell 脚本。用户不能自己输入文件或使用正则表达式。

--------------------------------------------------------------------------------
结束语
在本文中,我演示了使用 PHP 命令运行 shell 脚本和其他命令的基础知识。这些 PHP 命令包括 shell_exec()、exec()、passthru() 和 system()。现在,您应该在自己的应用程序中实践学到的知识。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/324262.htmlTechArticle所有这些命令都衍生一个子进程,用于运行您指定的命令或脚本,并且每个子进程会在命令输出写到标准输出 (stdout) 时捕捉它们。 shell_ex...
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

meme币交易所排行榜 meme币主流交易所top10盘点 meme币交易所排行榜 meme币主流交易所top10盘点 Apr 22, 2025 am 09:57 AM

最适合交易Meme币的平台包括:1. 币安(Binance),全球最大,流动性高,低手续费;2. 欧意(OKX),高效交易引擎,支持多种Meme币;3. XBIT,去中心化,支持跨链交易;4. 雷迪姆(Solana DEX),低成本,结合Serum订单簿;5. PancakeSwap(BSC DEX),交易费用低,速度快;6. Orca(Solana DEX),用户体验优化;7. Coinbase,安全性高,适合新手;8. 火币(Huobi),亚洲知名,交易对丰富;9. DEXRabbit,智能

免费的看盘软件网站有哪些 币圈十大免费看行情软件排名 免费的看盘软件网站有哪些 币圈十大免费看行情软件排名 Apr 22, 2025 am 10:57 AM

币圈十大免费看行情软件排名前三分别是OKX、Binance和gate.io。 1. OKX提供简洁界面和实时数据,支持多种图表和市场分析。 2. Binance功能强大,数据准确,适合各种交易者。 3. gate.io以稳定性和全面性着称,适合长期和短线投资者。

币圈行情实时数据免费平台推荐前十名发布 币圈行情实时数据免费平台推荐前十名发布 Apr 22, 2025 am 08:12 AM

适合新手的加密货币数据平台有CoinMarketCap和非小号。1. CoinMarketCap提供全球加密货币实时价格、市值、交易量排名,适合新手与基础分析需求。2. 非小号提供中文友好界面,适合中文用户快速筛选低风险潜力项目。

十大数字虚拟货币app排行榜 币圈交易数字货币交易所排名前十 十大数字虚拟货币app排行榜 币圈交易数字货币交易所排名前十 Apr 22, 2025 pm 03:00 PM

十大数字虚拟货币app排行榜分别是:1. OKX,2. Binance,3. gate.io,4. Coinbase,5. Kraken,6. Huobi,7. KuCoin,8. Bitfinex,9. Bitstamp,10. Poloniex。这些交易所根据交易量、用户体验和安全性等因素评选,均提供多种数字货币交易服务和高效的交易体验。

靠谱好用的虚拟币交易所app推荐 币圈十大交易所排行榜最新 靠谱好用的虚拟币交易所app推荐 币圈十大交易所排行榜最新 Apr 22, 2025 pm 01:21 PM

靠谱好用的虚拟币交易所app是:1. Binance,2. OKX,3. Gate.io,4. Coinbase,5. Kraken,6. Huobi Global,7. Bitfinex,8. KuCoin,9. Bittrex,10. Poloniex。这些平台因其交易量、用户体验和安全性等因素被评选为最佳,均提供注册、验证、存款、提款和交易操作功能。

适合新手的数字货币交易App有哪些?一文了解币圈 适合新手的数字货币交易App有哪些?一文了解币圈 Apr 22, 2025 am 08:45 AM

选择适合新手的数字货币交易平台需考虑安全性、易用性、教育资源和费用透明度:1. 优先选择提供冷存储、双重验证和资产保险的平台;2. 界面简洁、操作清晰的App更适合新手;3. 平台应提供教程和市场分析等学习工具;4. 注意交易手续费和提现费等隐性成本。

数字货币交易app容易上手的推荐top10(025年最新排名) 数字货币交易app容易上手的推荐top10(025年最新排名) Apr 22, 2025 am 07:45 AM

gate.io(全球版)核心优势是界面极简,支持中文,法币交易流程直观;币安(简版)核心优势是全球交易量第一,简版模式仅保留现货交易;OKX(香港版)核心优势是界面简洁,支持粤语/普通话,衍生品交易门槛低;火币全球站(香港版)核心优势是老牌交易所,推出元宇宙交易终端;KuCoin(中文社区版)核心优势是支持800 币种,界面采用微信式交互;Kraken(香港版)核心优势是美国老牌交易所,持有香港SVF牌照,界面简洁;HashKey Exchange(香港持牌)核心优势是香港知名持牌交易所,支持法

2025数字货币交易平台有哪些 十大数字货币app最新排行榜 2025数字货币交易平台有哪些 十大数字货币app最新排行榜 Apr 22, 2025 pm 03:09 PM

十大虚拟币看盘平台app推荐:1. OKX,2. Binance,3. Gate.io,4. Huobi,5. Coinbase,6. Kraken,7. Bitfinex,8. KuCoin,9. Bybit,10. Bitstamp,这些平台提供实时行情、技术分析工具和用户友好的界面,帮助投资者进行有效的市场分析和交易决策。

See all articles