php 怎么这么红

  最近 php(personal hypertext preprocessor) 似乎已经成了这一两年来 linux/unix 上最广为大家所使用的网页处理语言﹐它的方便、强大功能与 opensource 的特性使得它正逐渐侵蚀到传统 cgi 甚至是 microsoft asp(active server page)的市场﹐几乎各大网站征招人才莫不以会 php 作为基本条件。

  php 确实有这个资格可以这么红﹐原因有下面数点 :

  php 是 opensource 软件﹐完全免费﹐可以自由散布﹐因此吸引了极多的人来使用﹐也因为如此﹐吸引到了商业公司为其发展更好的引擎与最佳化软件(请参考 http://www.zend.com/)。

  php 本身非常简单易懂﹐浅显的指令语法﹐外加一些基本的对象导向处理能力﹐让新手足以在最短时间内学会。

  php 提供了相当多的功能﹐包含了数学处理、字符串处理、网络相关功能、各种数据库的支持、影像处理功能、有为数众多的发展者正为 php 发展各式各样的新功能﹐扩充性极佳。

  php 非常容易与 apache 相结合﹐作为 apache 的模块来使用﹐设定安装上相当简单﹐也因为 apache 目前已经占据了 web server 全球 60% 的市场﹐php 自然而然成为 apache 最佳搭配。

  不过﹐这次要讲的主题不是 php 在网页设计上的应用﹐而是 php 在 shell script 上的应用﹐一般所知的 shell script 大约就是 tcsh、bash、perl 或是 python 这几类语言﹐我所要谈的就是将 php 当成 shell script 来使用。

  php 执行档的安装

  一般 php 作为网页处理语言都是要编译成 apache 的模块﹐这里当然不么做﹐也因此编译起来很简单﹐只要以 root 的身分进行如下动作 :

  解开 php-3.0.xx.tar.gz

  cd php

  configure

  make

  编译完之后﹐在 php 目录下有一个可执行档﹐档名为 php﹐将它 copy 到 /usr/local/bin 下即可。注意﹐如果档案太大﹐可以使用 strip 指令将 php 的方式将不必要的信息去除﹐这样档案就会小得多了。

  第一个程序

  开始撰写我们的第一个 php shell script 程序﹐这个例子印出 “hello world !” :

  #!/usr/local/bin/php -q

  <?

  echo “hello, world !”;

  ?>

  注意到 php 原本是应用在网页应用的﹐因此它内定会送出 html 的 header﹐但是在此我们是要将 php 用作 shell script﹐”-q” 就是表示不要送出 header 的意思﹐你可以试试看不加上 -q 的显示结果。

  在这个例子中﹐/usr/local/bin/php 是表示要执行 /usr/local/bin/ 下的 php﹐因为我们刚才将它装在该处。echo 指令将 “hello, world !” 印出﹐其中的 “” 字符是换行字符。

  注意到在将这个程序存成档案后﹐须将其 chmod 成为可执行属性(chmod +x 文件名)﹐然后才能执行喔。

  进阶使用 i

  有时候我们需要在程序执行时﹐送进一些参数﹐比如说 ls 这个指令﹐后面可以加上 -l 参数﹐php shell script 一样也有支持这样的用法﹐有两个特殊的变量 : $argc 记录着后面送入参数的个数﹐$argv[] 数组参数存着的则是参数的内容。比如说我现在要设计一个算两个数字总和的程序 :

  #!/usr/local/bin/php -q

  <?

  $sum=0;

  $sum=$sum+$argv[1]+$argv[2];

  echo $sum;

  ?>

  假设将此程序命名为 sum.php3﹐则执行 sum.php3 1 2 按下 enter 则会印出 3。

  如果要算出不特定个数的参数和﹐那么就得要用到 $argc 这个特殊变量了 :

  #!/usr/local/bin/php -q

  <?

  $sum=0;

  for ($t=1;$t<=$argc;$t++)

  $sum=$sum+$argv[$t];

  echo $sum;

  ?>

  假设将此程序命名为 bigsum.php3﹐则执行 bigsum.php3 1 2 3 4 5 按下 enter 则会印出 15﹐执行 bigsum.php3 1 2 3 4 5 6 按下 enter 则会印出 21。

  有时候我们需要在程序执行中输入资料﹐但是 php 原本就是用于网页设计﹐而网页上的资料输入自然都是用 form 的方式来输入﹐所以这将 php 作为 shell script 时问题就来了﹐好在 php 有提供了开文件功能﹐而在 linux/uinx 之下﹐输入(input)这件事原本就可以用开档的方式来完成﹐我们要开启的是 /dev/stdin 这个设备档(stdin 是表示 standard input 的意思)﹐程序如下 :

  #!/usr/local/bin/php -q

  <?

  $fp=fopen(“/dev/stdin”,”r”);

  $inputstr=fgets($fp,100);

  fclose($fp);

  echo “\n———————-\n”;

  echo $inputstr;

  ?>

  其中的 fgets($fp,100) 是指从 $fp 这个档案(也就是 “/dev/stdin”)中读取出 100 个 byte 的资料﹐程序执行到这行便会停下来等待我们的输入﹐当我们输入完按下 enter 之后﹐程序就会将刚才我们输入的资料给印出来了。

  进阶使用 ii

  虽然已经可以处理输入﹐但是这样的功能显然还是太简单﹐无法应付更大的应用﹐比如说我需要一个功能是将一串资料流(data stream)中的 html 给去除﹐这时便需要完整地处理输出输入转向的能力﹐我们可以先设计程序如下 :

  #!/usr/local/bin/php -q

  <?

  $fp=fopen(“/dev/stdin”,”r”);

  while(!feof($fp)) {

  $c=fgetc($fp);

  $inputstr=$inputstr.$c;

  };

  fclose($fp);

  echo $inputstr;

  ?>

  假设将此程序命名为 filt.php3﹐如果你直接执行这个程序﹐它会一直等待你输入﹐直到你按下 ctrl+d 后才会将你的输入资料给印出﹐我们可以这么执行它 :

  more filt.php3 | filt.php3

  这样的做法是将 filt.php3 这个程序用 more 给秀出并转向给 filt.php3 这个程序﹐filt.php3 会不断接受资料(事实上就是 filt.php3 程序代码本身)﹐最后将其印出。

  我们可以在其中加上过滤 html 的功能 :

  #!/usr/local/bin/php -q

  <?

  $fp=fopen(“/dev/stdin”,”r”);

  while(!feof($fp)) {

  $c=fgetc($fp);

  $inputstr=$inputstr.$c;

  };

  fclose($fp);

  $inputstr=ereg_replace(“<([^<>]*)>”,””,$inputstr);

  echo $inputstr;

  ?>

  假设将此程序命名为 filt2.php3﹐如此一来便完成了过滤功能﹐不信请拿个 html 档来试试看 :

  more xxx.html | filt2.php3

  你便会看到删除了 html tag 的文件了。

  结论

  php 拿来当 shell script 事实上相当地好用﹐原因是 php 本身很好学﹐而且它又支持了各种数据库﹐当你已经经常拿 php 来设计你的网站之后﹐绝对不太喜欢再使用其它的 shell script 语言来处理其它必须非网页的部份﹐这时候拿 php 来当做 shell script 的好处就会显现出来了﹐你可以以一贯的方式来发展整个系统﹐而不必一下要用 php一下又用 perl/python 或是 c。

  国内的 php 风气已经相当兴盛﹐本站 linuxfab 便是完全以 php 搭配 mysql 发展起来的﹐事实上 php 的妙用还有很多﹐有机会日后再介绍﹐如果读者们需要 php 的相关信息﹐欢迎到本站上的 php 论坛 参与更多讨论。 (出处:viphot)