PHP也可以?成Shell Script


Posted in PHP onOctober 09, 2006

   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)

PHP 相关文章推荐
PHP base64+gzinflate压缩编码和解码代码
Oct 03 PHP
怎样去阅读一份php源代码
Aug 21 PHP
php数字转汉字代码(算法)
Oct 08 PHP
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
Dec 05 PHP
基于session_unset与session_destroy的区别详解
Jun 03 PHP
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
May 04 PHP
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
Jun 04 PHP
PHP中变量引用与变量销毁机制分析
Nov 15 PHP
PHP单例模式定义与使用实例详解
Feb 06 PHP
PHP文件类型检查及fileinfo模块安装使用详解
May 09 PHP
gearman中任务的优先级和返回状态实例分析
Feb 27 PHP
Laravel中如何轻松容易的输出完整的SQL语句
Jul 26 PHP
浅谈Windows下 PHP4.0与oracle 8的连接设置
Oct 09 #PHP
Oracle 常见问题解答
Oct 09 #PHP
第1次亲密接触PHP5(1)
Oct 09 #PHP
PHP 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
Oct 09 #PHP
文件上传类
Oct 09 #PHP
多文件上载系统完整版
Oct 09 #PHP
php中文件上传的安全问题
Oct 09 #PHP
You might like
php 格式化数字的时候注意数字的范围
2010/04/13 PHP
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
2010/10/19 PHP
phpadmin如何导入导出大数据文件及php.ini参数修改
2013/02/18 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
showModelessDialog()使用详解
2006/09/07 Javascript
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
jquery cookie的用法总结
2013/11/18 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
2015/12/03 Javascript
Web打印解决方案之证件套打的实现思路
2016/08/29 Javascript
jQuery ajax MD5实现用户注册即时验证功能
2016/10/11 Javascript
详解vue-cli中配置sass
2017/06/21 Javascript
纯js实现图片匀速淡入淡出效果
2017/08/22 Javascript
详解 vue.js用法和特性
2017/10/15 Javascript
jquery ajaxfileupload异步上传插件
2017/11/21 jQuery
JavaScript中的this基本问题实例小结
2020/03/09 Javascript
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
[44:41]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[59:59]EG vs IG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python操作MySQL数据库具体方法
2013/10/28 Python
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
Python的Django框架安装全攻略
2015/07/15 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
2017/11/14 Python
Python+matplotlib绘制不同大小和颜色散点图实例
2018/01/19 Python
基于Python 装饰器装饰类中的方法实例
2018/04/21 Python
Python线性拟合实现函数与用法示例
2018/12/13 Python
Python 3.8正式发布,来尝鲜这些新特性吧
2019/10/15 Python
Django 请求Request的具体使用方法
2019/11/11 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
Under Armour安德玛法国官网:美国高端运动科技品牌
2018/06/29 全球购物
房屋改造计划书
2014/01/10 职场文书
会计专业导师推荐信
2014/03/08 职场文书
高中生职业规划范文
2014/03/09 职场文书
小学班级口号
2014/06/09 职场文书
高二学年自我鉴定范文(2篇)
2014/09/26 职场文书
2016新年问候语大全
2015/11/11 职场文书