




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PHP 为执行外部命令提供大量函数 其中包括 shell exec shell exec exec exec passthru passthru 和 system system 这些命令是相似的 但为您运行的外部程序提供不 同的界面 所有这些命令都衍生一个子进程 用于运行您指定的命令或脚本 并且每个子进程会在命令输出写到标准输出 stdoutstdout 时捕捉它们 shell exec shell exec shell exec shell exec 命令行实际上仅是反撇号 操作符的变体 如果您编写过 shell 或 Perl 脚本 您就知道可以在反撇号操作符内部捕捉其他命令的输出 例如 清单 1 显示了如何使用反撇号在当前目录中获取每个文本 txt 的单 词计数 清单清单 1 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 shell exec 中运行这个简单的命令 如清单 2 所示 并获取想要的结果 这里假设在同一个目录下有一些文本文件 清单清单 2 2 在在 shell exec shell exec 中运行相同的命令中运行相同的命令 在图 1 中可以看到 获得的结果与从 shell 脚本得到的一样 这是因为 shell exec shell exec 允许您通过 shell 运行外部程序 然后以字符串的形式返回结 果 图图 1 1 通过通过 shell exec shell exec 运行运行 shellshell 命令的结果命令的结果 注意 仅使用后撇号操作符也会得到相同的结果 如下所示 清单清单 3 3 仅使用后撇号操作符仅使用后撇号操作符 清单 4 给出了一种更加简单的方法 清单清单 4 4 更加简单的方法更加简单的方法 通过 UNIX 命令行和 shell 脚本能够完成很多东西 知道这点很重要 例如 您可以使用竖线将命令连接起来 您甚至可以使用操作符在其中创建 shell 脚 本 并且仅调用 shell 脚本 根据需要使用或不使用参数 例如 如果您仅希望计算该目录下的前 5 个文本文件的单词数 那么可以使用 竖线 将 wcwc 和 headhead 命令连接起来 另外 您还可以将输出结果放到 prepre 标记内部 让它能够更美观地呈现在 Web 浏览器中 如下所示 清单清单 5 5 更加复杂的更加复杂的 shellshell 命令命令 php results shell exec wc w txt head 5 echo results 图 2 演示了运行清单 5 的脚本得到的结果 图图 2 2 从从 shell exec shell exec 运行更复杂的运行更复杂的 shellshell 命令得到的结果命令得到的结果 在本文的后面部分 您将学习如何使用 PHP 为这些脚本传递参数 现在您可以 将它看作运行 shell 命令的一种方法 但要记住您只能看到标准输出 如果命 令或脚本出现错误 您将看不到标准的错误 stderrstderr 除非您通过竖线将它添 加到 stdoutstdout passthru passthru passthru passthru 允许您运行外部程序 并在屏幕上显示结果 您不需要使用 echoecho 或 returnreturn 来查看结果 它们会显示在浏览器上 您可以添加可选的参数 即 保存从外部程序返回的代码的变量 比如表示成功的 0 这为调试提供更好的 机制 在清单 6 中 我使用 passthru passthru 命令运行在前面小节运行的单词计数脚本 如您所见 我还添加一个包含返回代码的 returnval returnval 变量 清单清单 6 6 使用使用 passthru passthru 命令运行单词计数脚本命令运行单词计数脚本 php passthru wc w txt head 5 returnval echo returnval 注意 我不需要使用 echoecho 返回任何东西 结果会直接显示在屏幕上 如下所 示 图图 3 3 使用使用 returnreturn 代码运行代码运行 passthru passthru 命令的结果命令的结果 在清单 7 中 我通过删除脚本头部的 5 前面的短横线 引入一个小错误 清单清单 7 7 在单词计数脚本中引入一个错误在单词计数脚本中引入一个错误 php we introduce an error below removing from the head command passthru wc w txt head 5 returnval echo returnval 注意 脚本未能按照预期运行 您得到的是一个空白的屏幕 一条水平线和返 回值 1 如图 4 所示 这个返回代码通常表明发生了某些错误 如果能够测试 返回代码 查找和修复错误就容易多了 图图 4 4 使用使用 passthru passthru 时查看错误代码时查看错误代码 exec exec exec exec 命令与 shell exec shell exec 相似 不同之处是它返回输出的最后一行 并且 可选地用命令的完整输出和错误代码填充数组 清单 8 展示了当运行 exec exec 而不捕捉数据数组中的数据时发生的事情 清单清单 8 8 运行运行 exec exec 而不捕捉数据数组中的数据而不捕捉数据数组中的数据 为了捕捉数组中的结果 要将该数组的名称作为第二个参数添加到 exec exec 我 在清单 9 中执行了这个步骤 并以 data data 作为数组的名称 清单清单 9 9 从从 exec exec 捕捉数据数组的结果捕捉数据数组的结果 555 text1 txt 1 283 text2 txt 在捕捉数组中的结果之后 您可以对每行进行一些处理 例如 您可以在第一 个空格处进行划分 将分离的值存储在数据库表中 或对每个行应用特定的格 式或标记 system system 如清单 10 所示 system system 命令是一种混合体 它像 passthru passthru 一样直接输 出从外部程序接收到的任何东西 它还像 exec exec 一样返回最后一行 并使返 回代码可用 清单清单 10 10 system system 命令命令 一些例子 现在您已经了解如何使用这些 PHP 命令 但可能仍然有一些疑问 例如 什么 时候应该使用哪个命令 这完全由您的需求决定 大多数情况下 我使用 exec exec 命令和数据数组处理所有东西 或者对更简单 的命令使用 shell exec shell exec 尤其是不关心结果时 如果仅需返回一个 shell 脚本 我就使用 passthru passthru 通常 我在不同的场合中使用不同的函数 并且 有时它们是可以互换的 这完全取决于我的心情和要实现的目的 您可能提问的另一个问题是 它们的长处是什么 如果您没有头绪 或者 一个项目非常适合使用 shell 命令 但不知道如何使用 那么我在这里提供一 些见解 如果您正在编写一个提供各种备份或文件传输功能的应用程序 您可以选择使 用 shell exec shell exec 或这里提供的其他命令之一运行 rsyncrsync 支持的 shell 脚本 您可以编写 shell 脚本使其包含必要的 rsyncrsync 命令 然后使用 passthru passthru 根据用户的命令或 croncron 作业执行它 例如 一位用户在您的应用程序中有适当的权限 比如管理员权限 他想将 50 个 PDF 文件从一个服务器发送到另一个服务器 那么 该用户需要在应用 程序中导航到正确的位置 单击 TransferTransfer 选择需要发送的 PDF 然后单击 SubmitSubmit 在这个过程中 该表单应该有一个 PHP 脚本 它使用返回选项变量通 过 passthru passthru 运行 rsyncrsync 脚本 这样您就知道是否发生问题 如下所示 清单清单 11 11 通过通过 passthru passthru 运行运行 rsyncrsync 脚本的示例脚本的示例 PHPPHP 脚本脚本 如果您的应用程序需要列出进程或文件 或关于这些进程或文件的数据 您可 以使用本文总结的命令之一轻松实现这个目的 例如 一个简单的 grepgrep 命令 能够帮助您找到匹配特定搜索条件的文件 将它与 exec exec 命令一起使用可以 将结果保存到一个数组中 这允许您构建一个 HTML 表或表单 它们又进一步 允许您运行其他命令 到目前为止 我讨论了用户生成的事件 用户只要按下按钮或单击链接 PHP 就运行相应的脚本 您还可以将独立的 PHP 脚本和 croncron 或其他日程安排 程序一起使用 从而实现一些有趣的效果 例如 如果您一个备份脚本 您可 以通过 croncron 运行它 或者将它打包到 PHP 脚本后在运行 为什么要这样做 这似乎是多余的 不是吗 不是这样的 您需要这样考虑 您可以通过 exec exec 或 passthru passthru 运行备份脚本 然后根据返回代码执行一些行为 如果 出现错误 您可以将其记录到错误日志或数据库中 或发送一封警告电子邮件 如果脚本成功 您可以将原始的输出转储到数据库 例如 rsyncrsync 有一个详尽 verbose 模式 对随后诊断问题十分有用 安全 我们在这里简要讨论一下安全性 如果您接受用户输入并将信息传递到 shell 那么最好过滤用户输入 删除您认为有害的命令和不允许的内容 比如 sudosudo 作为超级用户运行 或 rmrm 删除 事实上 您可能不希望用户发送开 放的请求 而是让他们从列表中选择 例如 您运行一个接受文件列表作为参数的传输程序 您应该通过一系列复选 框列出
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 神经内科岗前培训体系
- 肿瘤放疗并发症及护理策略
- 武汉华夏理工学院《民族地区社会工作》2023-2024学年第一学期期末试卷
- 北京工商大学嘉华学院《商务谈判与推销技巧》2023-2024学年第一学期期末试卷
- 广州华立学院《医疗卫生法律法规》2023-2024学年第一学期期末试卷
- 珠海科技学院《和声学I》2023-2024学年第一学期期末试卷
- 深圳北理莫斯科大学《中华灯谜艺术及欣赏》2023-2024学年第一学期期末试卷
- 郑州大学《当代世界政治与经济》2023-2024学年第一学期期末试卷
- 齐齐哈尔大学《田间试验设计》2023-2024学年第一学期期末试卷
- 大连工业大学《桥梁结构非线性》2023-2024学年第一学期期末试卷
- 国开电大《钢结构(本)》阶段性学习测验1-4
- DB2102-T 0118-2024 工业三维零件模型数字化装配技术规范
- 公安网络安全培训
- 图书选品与陈列艺术研究-洞察分析
- 钢管支撑强度及稳定性验算
- DB22T 3053-2019 地理标志产品 乾安羊肉
- 旅拍运营方案
- DB11-T 584-2022 薄抹灰外墙外保温工程技术规程
- 国开 电大《政治学原理》形考测试一答案
- 电信运营商网络服务的创新发展
- 2022-2023学年安徽省阜阳市高一下学期期末教学质量统测数学试卷(解析版)
评论
0/150
提交评论