问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

菜鸟求助:PHP中调用系统命令为何有些命令总是失败

发布网友 发布时间:2022-04-30 00:29

我来回答

1个回答

热心网友 时间:2022-05-14 11:18

  PHP执行系统命令(简介及方法)
  在PHP中调用外部命令,可以用如下三种方法来实现:
  方法一:用PHP提供的专门函数(四个):
  PHP提供4个专门的执行外部命令的函数:exec(), system(), passthru(), shell_exec()
  1)exec()
  原型: string exec ( string $command [, array &$output [, int &$return_var ]] )
  说明: exec执行系统外部命令时不会输出结果,而是返回结果的最后一行。如果想得到结果,可以使用第二个参数,让其输出到指定的数组。此数组一个记录代表输出的一行。即如果输出结果有20行,则这个数组就有20条记录,所以如果需要反复输出调用不同系统外部命令的结果,最好在输出每一条系统外部命令结果时清空这个数组unset($output),以防混乱。第三个参数用来取得命令执行的状态码,通常执行成功都是返回0。
  <?php
  exec("dir",$output);
  print_r($output);
  ?>
  2)system()
  原型: string system ( string $command [, int &$return_var ] )
  说明: system和exec的区别在于,system在执行系统外部命令时,直接将结果输出到游览器,如果执行命令成功则返回true,否则返回false。第二个参数与exec第三个参数含义一样。
  <?php
  system("pwd");
  ?>
  3)passthru()
  原型: void passthru ( string $command [, int &$return_var ] )
  说明: passthru与system的区别,passthru直接将结果输出到游览器,不返回任何值,且其可以输出二进制,比如图像数据。第二个参数可选,是状态码。
  <?php
  header("Content-type:image/gif");
  passthru("/usr/bin/ppm2tiff /usr/share/tk8.4/demos/images/teapot.ppm");
  ?>
  4)shell_exec()
  原型: string shell_exec ( string $cmd )
  说明: 直接执行命令$cmd
  <?php
  $output = shell_exec('ls -lart');
  echo "<pre>$output</pre>";
  ?>
  方法二:反撇号
  原型: 反撇号`(和~在同一个键)执行系统外部命令
  说明: 在使用这种方法执行系统外部命令时,要确保shell_exec函数可用,否则是无法使用这种反撇号执行系统外部命令的。
  <?php
  echo `dir`;
  ?>
  方法三:用popen()函数打开进程
  原型: resource popen ( string $command , string $mode )
  说明: 能够和命令进行交互。之前介绍的方法只能简单地执行命令,却不能与命令交互。有时须向命令输入一些东西,如在增加系统用户时,要调用su来把当前用户换到root用户,而su命令必须要在命令行上输入root的密码。这种情况下,用之前提到的方法显然是不行的。
  popen( )函数打开一个进程管道来执行给定的命令,返回一个文件句柄,可以对它读和写。返回值和fopen()函数一样,返回一个文件指针。除非使用的是单一的模式打开(读or写),否则必须使用pclose()函数关闭。该指针可以被fgets(),fgetss(),fwrite()调用。出错时,返回FALSE。
  <?php
  error_reporting(E_ALL);
  /* Add redirection so we can get stderr. */
  $handle = popen('/path/to/executable 2>&1', 'r');
  echo "'$handle'; " . gettype($handle) . "\n";
  $read = fread($handle, 2096);
  echo $read;
  pclose($handle);
  ?>
  要考虑两个问题:安全性和超时
  1)安全性
  由于PHP基本是用于WEB程序开发的,所以安全性成了人们考虑的一个重要方面 。于是PHP的设计者们给PHP加了一个门:安全模式。如果运行在安全模式下,那么PHP脚本中将受 到如下四个方面的*:
  执行外部命令
  在打开文件时有些*
  连接MySQL数据库
  基于HTTP的认证
  在安全模式下,只有在特定目录中的外部程序才可以被执行,对其它程序的调用将被拒绝。这个目录可以在PhP.ini 文件中用safe_mode_exec_dir指令,或在编译PHP是加上--with-exec-dir选项来指定。
  当你使用这些函数来执行系统命令时,可以使用escapeshellcmd()和escapeshellarg()函数阻止用户恶意在系统上执行命令,escapeshellcmd()针对的是执行的系统命令,而escapeshellarg()针对的是执行系统命令的参数。这两个参数有点类似addslashes()的功能。
  2)超时
  当执行命令的返回结果非常庞大时,可以需要考虑将返回结果输出至其他文件,再另行读取文件,这样可以显著提高程序执行的效率。
  如果要执行的命令要花费很长的时间,那么应该把这个命令放到系统的后台去运行。但在默认情况下,象system()等函数要等到这个命令运行完才返回(实际上是在等命令的输出结果),这肯定会引起PHP脚本的超时。解决的办法是把命令的输出重定向到另外一个文件或流中,如:
  <?php
  system("/usr/local/bin/order_proc > /tmp/abc ");
  ?>
  但我调用的DOS命令需要几分钟的时间,而且为了批处理不能简单的把结果写入文件了事,要顺序执行以下的程序
  PHP设置了调用系统命令的时间*,如果调用命令超时,虽然这个命令还是会被执行完,但PHP没有得到返回值,被终止了(最可恨的是,不显示任何错误)
  修改php.ini并重启Apache以允许系统命令运行更长的时间
  max_execution_time = 600
  我的程序是后台运行的,逻辑OK就成了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
U盘更新专用需要电脑打开怎么让我的U盘和电脑文件夹同步更新啊_百度知 ... 为什么我的硬盘一打开就弹出对话框说选择打开方式. 倒霉的是右键也打... 磁盘右键是打开方式怎么办 我双机盘符总是打开 打开方式 让我选择,右健第一项是打开.不知道是中了... 罗技Lightspeed怎么用? 罗技无线鼠标怎么样?怎么连接电脑使用? 为什么不建议去融资公司上班 融资担保公司一般账务处理及所涉及的会计科目有哪些 月经期间可以游泳吗 经期能不能游泳 求xbox无线适配器二代驱动 使用php命令行无法运行php文件 PHP 递归函数若不满足条件则终止本函数的自调用,然后把目前流程的主控权交回给上一层函数来执行? 老头帮我买包烟的电影叫什么名字? 哪位大神有极品士兵之连队囧事高清百度云资源 30kg左右,哪个快递便宜 极品士兵之新兵报道一共几集? 极品士兵第1季为什么看不了 大佬有极品士兵之连队囧事(2019)年上映的由郭丰周等主演的免费高清百度云资源求分享 求《极品士兵之连队囧事(2019)》百度网盘高清资源在线观看,郭丰周主演的 让师长买烟的电视剧叫什么名字? 郭小明让师长买烟是什么电视剧里的? 哪位大佬能分享2019年郭丰周主演电视剧《极品士兵之连队囧事》免费百度网盘资源。 哪位大佬能分享2019年张恒宇执导电视剧《极品士兵之连队囧事》免费百度网盘资源。 极品士兵之连队囧事第二集时髦女是谁演的啊? 郭小明让师长买烟是什么电视剧? 极品士兵师长的扮演者 极品士兵第一季新兵报到多少集 极品士兵之连队囧事团长扮演者? 极品土兵的演员表发一下,有知道的吗?先谢谢了 用php写的一个判断语句,结果为何总是执行if里面。不执行else里面的语句... 如何禁止 PHP 执行某些系统命令 php for循环的退化形式诶什么条件不成立也可以循环 win10怎么卸载xbox无线接收器驱动 php if 命令问题 php命令行执行了PHP循环程序,然后退出登陆。下次连接的时候如关闭这个PH... php中带条件的插入语句,当满足这个条件时执行,不然执行另一条插入语句 PHP使用exec执行cmd命令成功后结果也出来了,但cmd.exe进程一直不结束... XBOX360无线手柄,插PC,每次开机,都要把适配器拨了再插上才能连上手柄,驱动试过好几个了都不行,求解 日本豆腐有一股臭味正常吗? 编了一段php代码,结果程序执行时总是跳过内嵌中的第一个if,想下大神请教下错误原因在哪。。 我在php中执行shell命令不成功,但是直接命令行执行可以。 xbox one1代无线适配器win7和win10都支持吗? 动漫女生壁纸闷骚 求这个动漫壁纸原图? 求好心人分享心动警报第二季免费在线观看资源 帅气学生喜欢离婚女老师女主叫易星言是啥电影? 李菲男演员参演哪些电视剧? 一周7日快速减肥食谱 组字开头的成语有哪些