宝哥软件园

详细介绍PHP命令行工具shell _ exec exec passthru system

编辑:宝哥软件园 来源:互联网 时间:2021-10-17

所有这些命令都会产生一个子进程来运行您指定的命令或脚本,并且每个子进程都会在命令输出被写入标准输出(stdout)时捕获它们。shell_exec() shell_exec()命令行实际上只是撇号(`)运算符的变体。如果您已经编写了一个shell或Perl脚本,您就知道可以在撇号操作符内部捕获其他命令的输出。例如,清单1显示了如何使用撇号来获取每个文本的字数(。txt)在当前目录中。清单1。计算带有反撇号的单词数。复制代码如下: #!/bin/sh _ number _ of _ words=` WC-w * . txt ` echo $ number _ of _ words #结果可能是: # 165 readme . txt 388 results . txt 588 summary . txt #等等.在PHP脚本中,您可以在shell_exec()中运行这个简单的命令,如清单2所示,并获得所需的结果。这里假设在同一个目录中有一些文本文件。清单2。在shell_exec()中运行相同的命令,复制如下代码:php $results=shell_exec('wc -w *)。txt’);echo $结果;如图1所示,获得的结果与从shell脚本中获得的结果相同。这是因为shell_exec()允许您通过shell运行外部程序,然后将结果作为字符串返回。1.通过shell_exec () PHP  命令行工具 shell  exec, exec, passthru, system  a669388d201eb3de运行shell命令的结果。

请注意,仅使用撇号运算符将获得相同的结果,如下所示。清单3。仅使用撇号运算符复制代码。代码如下:PHP $ results=` WC-w * . txt `;echo $结果;清单4显示了一个更简单的方法。清单4。复制代码更简单的方法如下:PHP echo ` WC-w * . txt `;重要的是要知道,许多事情可以通过UNIX命令行和shell脚本来完成。例如,您可以使用竖线来连接命令。您甚至可以使用操作符在其中创建shell脚本,并且只调用shell脚本(根据需要有或没有参数)。例如,如果您只想计算该目录中前五个文本文件的字数,可以使用竖线(|)连接wc和head命令。此外,您可以将输出放在pre标签中,这样它可以在Web浏览器中更美观地呈现,如下所示。清单5。为更复杂的shell命令复制代码。代码如下:php $results=shell_exec('wc -w *)。txt | head-5’);echo 'code lang='php ' '。$结果。/code ';图2展示了运行清单5中的脚本的结果。图2。从shell_exec () PHP  命令行工具 shell  exec, exec, passthru, system  f3a26409a75568a6运行更复杂的shell命令的结果。

在本文的后面,您将学习如何使用PHP为这些脚本传递参数。现在,您可以将其视为运行shell命令的一种方式,但请记住,您只能看到标准输出。如果命令或脚本中有错误,您将看不到标准错误(stderr),除非您通过竖线将其添加到stdout。Passthru() passthru()允许您运行外部程序并在屏幕上显示结果。您不需要使用echo或return来查看结果;它们显示在浏览器上。您可以添加一个可选参数,即保存从外部程序返回的代码的变量,如0表示成功,这为调试提供了更好的机制。在清单6中,我使用passthru()命令来运行我在前一节中运行的单词计数脚本。如您所见,我还添加了一个包含返回代码的$returnval变量。清单6。使用passthru()命令运行字数统计脚本。复制代码如下:php passthru('wc -w *)。txt | head -5 ',$ return val);回显“hr/”。$ returnval?请注意,我不需要使用echo来返回任何内容。结果直接显示在屏幕上,如下所示。图3。运行passthru()命令并返回代码PHP  命令行工具 shell  exec, exec, passthru, system  3cec849f89db6011的结果。

在清单7中,我通过删除脚本头中5之前的破折号(-)引入了一个小错误。清单7。在字数统计脚本中引入错误复制代码。代码如下:PHP//我们在下面介绍了一个错误(从head命令中移除)passthru('wc -w *)。txt | head 5 ',$ return val);回显“hr/”。$ returnval?请注意,脚本没有按预期运行。您得到的是一个空白屏幕、一条水平线和一个返回值1,如图4所示。该返回代码通常表示发生了一些错误。如果您可以测试返回代码,那么查找和修复错误会容易得多。图4。使用passthru () PHP  命令行工具 shell  exec, exec, passthru, system  9e8f40d55fd5196f时,请检查错误代码。

exec() exec()命令类似于shell_exec(),只是它返回输出的最后一行,并可选地用命令的完整输出和错误代码填充数组。清单8显示了当运行exec()而没有捕获数据数组中的数据时会发生什么。清单8。运行exec()而不捕获数据数组中的数据。代码是:php $results=exec('wc -w *)。txt | head-5’);echo $结果;#会只打印出最后一行或结果,即: #3847 myfile.txt?要捕获数组中的结果,请将数组的名称作为第二个参数添加到exec()。我在清单9中执行了这个步骤,并将数组命名为$data。清单9。从exec()捕获的数据数组的结果中复制代码。代码如下:php $results=exec('wc -w *)。txt | head -5 ',$ data);print _ r($ data);#会打印出数据数组: # Array([0]=555 text 1 . txt[1]=283 text 2 . txt)?在数组中捕获结果后,您可以对每一行进行一些处理。例如,您可以在第一个空间进行划分,将分隔的值存储在数据库表中,或者对每一行应用特定的格式或标记。System()如清单10所示,system()命令是一个混合命令。它直接输出从像passthru()这样的外部程序接收到的任何内容。它还像exec()一样返回最后一行,并使返回代码可用。清单10。system()命令复制代码如下:php系统(' wc -w *)。txt | head-5’);#会打印出: #123文件1.txt 332文件2.txt 444文件3 . txt #等等吗?一些例子现在你知道如何使用这些PHP命令,但可能仍然有一些问题。例如,我应该在什么时候使用哪个命令?这完全取决于你的需要。大多数时候,我使用exec()命令和数据数组来处理一切。或者使用shell_exec()来执行更简单的命令,尤其是在不关心结果的情况下。如果只需要返回一个shell脚本,我将使用passthru()。通常,我在不同的情况下使用不同的功能,有时它们是可以互换的。这完全取决于我的心情和我想要达到的目标。你可能会问的另一个问题是“他们的优势是什么?”。如果你没有头绪,或者如果一个项目非常适合使用shell命令,但是你不知道如何使用它们,那么我将在这里提供一些见解。如果您正在编写一个提供各种备份或文件传输功能的应用程序,您可以选择使用shell_exec()或这里提供的其他命令之一来运行rsync支持的shell脚本。您可以编写一个shell脚本来包含必要的rsync命令,然后使用passthru()根据用户的命令或cron作业来执行它。例如,用户在您的应用程序中有适当的权限(如管理员权限),他想从一台服务器向另一台服务器发送50个PDF文件。然后,用户需要导航到应用程序中的正确位置,单击传输,选择要发送的PDF,然后单击提交。在这个过程中,表单应该有一个PHP脚本,使用return选项变量通过passthru()运行rsync脚本,这样就可以知道是否有问题,如下所示。清单11。通过passthru()运行rsync脚本的示例PHP脚本复制代码如下。php passthru('xfer_rsync.sh ',$ return value);if ($returnvalue!=0){//我们有问题!//在此处添加错误代码}否则{//我们没事//重定向到其他页面}?如果您的应用程序需要列出进程或文件,或者关于这些进程或文件的数据,您可以通过使用本文中总结的命令之一来轻松完成。例如,一个简单的grep命令可以帮助您找到符合特定搜索条件的文件。它可以与exec()命令一起使用,将结果保存在数组中,这允许您构建一个HTML表或表单,进而允许您运行其他命令。到目前为止,我已经讨论了用户生成的事件——。只要用户按下一个按钮或者点击一个链接,PHP就会运行相应的脚本。

您还可以将独立的PHP脚本与cron或其他调度程序一起使用,以获得一些有趣的结果。例如,如果您有一个备份脚本,您可以通过cron运行它,或者将其打包成一个PHP脚本并运行它。你为什么要这么做?这似乎是多余的,不是吗?那不是真的。你需要考虑这个。您可以通过exec()或passthru()运行备份脚本,然后根据返回代码执行一些操作。如果发生错误,您可以将其记录在错误日志或数据库中,或者发送警告电子邮件。如果脚本成功,您可以将原始输出转储到数据库(例如,rsync具有详细模式,这对于以后诊断问题非常有用)。- .删除您认为有害的命令和内容,例如sudo(以超级用户身份运行)或rm(删除)。事实上,您可能不希望用户发送打开的请求,而是让他们从列表中选择。例如,如果您运行的传输程序接受文件列表作为参数,您应该通过一系列复选框列出所有文件。用户可以选择和取消选择文件,并通过单击提交激活rsync外壳脚本。用户不能自己输入文件或使用正则表达式。- .这些PHP命令包括shell_exec()、exec()、passthru()和system()。现在,你应该在自己的应用程序中实践所学。

更多资讯
游戏推荐
更多+