`
wangminshe89
  • 浏览: 665477 次
文章分类
社区版块
存档分类
最新评论

将PHP作为Shell脚本语言使用

 
阅读更多

PHP作为Shell脚本语言使用<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

可能很多人都想过使用PHP编写一些定时发信之类的程序,但是却没有办法定时执行PHP;一次去PHPBuilder的时候,发现了这一篇文章,于是想给大家翻译一下(同时做了一些修改),希望对大家有用。第一次翻译文章,不好请多多见谅。

----------------------------------------------------------------------------------

我们都知道,PHP是一种非常好的动态网页开发语言(速度飞快,开发周期短……)。但是只有很少数的人意识到PHP也可以很好的作为编写Shell脚本的语言,当PHP作为编写Shell脚本的语言时,他并没有Perl或者Bash那么强大,但是他却有着很好的优势,特别是对于我这种熟悉PHP但是不怎么熟悉Perl的人。要使用PHP作为Shell脚本语言,你必须将PHP作为二进制的CGI编译,而不是Apache模式;编译成为二进制CGI模式运行的PHP有一些安全性的问题,关于解决的方法可以参见PHP手册(http://www.php.net)。 一开始你可能会对于编写Shell脚本感到不适应,但是会慢慢好起来的:PHP作为一般的动态网页编写语言和作为Shell脚本语言的唯一不同就在于一个Shell脚本需要在第一行生命解释本脚本的程序路径:

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

我们在PHP执行文件后面加入了参数“-1”,这样子PHP就不会输出HTTPHeader(如果仍需要作为Web的动态网页,那么你需要自己使用header函数输出HTTPHeader)。当然,在Shell脚本的里面你还是需要使用PHP的开始和结束标记:

<?php 代码 ?>

现在让我们看一个例子,以便于更好的了解用PHP作为Shell脚本语言的使用:

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

<?php

print("Hello, world!/n");

?>

上面这个程序会简单的输出“Hello, world!”到显示器上。

一、传递Shell脚本运行参数给PHP

作为一个Shell脚本,经常会在运行程序时候加入一些参数,PHP作为Shell脚本时有一个内嵌的数组“$argv”,使用“$argv”数组可以很方便的读取Shell脚本运行时候的参数(“$argv[1]”对应的是第一个参数,“$argv[2]”对应的是第二个参数,依此类推)。比如下面这个程序:

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

<?php

$first_name = $argv[1];

$last_name = $argv[2];

printf("Hello, %s %s! How are you today?/n", $first_name, $last_name);

?>

上面的代码在运行的时候需要两个参数,分别是姓和名,比如这样子运行:

[dbrogdon@artemis dbrogdon]$ scriptname.ph Darrell Brogdon

Shell脚本在显示器上面会输出:

Hello, Darrell Brogdon! How are you today?

[dbrogdon@artemis dbrogdon]$

PHP作为动态网页编写语言的时候也含有“$argv”这个数组,不过和这里有一些不同:当PHP作为Shell脚本语言的时候“$argv[0]”对应的是脚本的文件名,而当用于动态网页编写的时候,“$argv[1]”对应的是QueryString的第一个参数。

二、编写一个具有交互式的Shell脚本:

如果一个Shell脚本仅仅是自己运行,失去了交互性,那么也没有什么意思了。当PHP用于Shell脚本的编写的时候,怎么读取用户输入的信息呢?很不幸的是PHP自身没有读取用户输入信息的函数或者方法,但是我们可以效仿其他语言编写一个读取用户输入信息的函数“read”:

<?php

function read() {

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

$input = fgets($fp, 255);

fclose($fp);

return $input;

}

?>

需要注意的是上面这个函数只能用于Unix系统(其他系统需要作相应的改变)。上面的函数会打开一个文件指针,然后读取一个不超过255字节的行(就是fgets的作用),然后会关闭文件指针,返回读取的信息。 现在我们可以使用函数“read”将我们前面编写的程序1修改一下,使他更加具有“交互性”了:

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

<?php

function read() {

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

$input = fgets($fp, 255);

fclose($fp);

return $input;

}

print("What is your first name? ");

$first_name = read();

print("What is your last name? ");

$last_name = read();

print("/nHello, $first_name $last_name! Nice to meet you!/n");

?>

将上面的程序保存下来,运行一下,你可能会看到一件预料之外的事情:最后一行的输入变成了三行!这是因为“read”函数返回的信息还包括了用户每一行的结尾换行符“/n”,保留到了姓和名中,要去掉结尾的换行符,需要把“read”函数修改一下:

<?php

function read() {

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

$input = fgets($fp, 255);

fclose($fp);

$input = chop($input); // 去除尾部空白

return $input;

}

?>

三、在其他语言编写的Shell脚本中包含PHP编写的Shell脚本:

有时候我们可能需要在其他语言编写的Shell脚本中包含PHP编写的Shell脚本。其实非常简单,下面是一个简单的例子:

#!/bin/bash

echo This is the Bash section of the code.

/usr/local/bin/php -q << EOF

<?php

print("This is the PHP section of the code/n");

?>

EOF

其实就是调用PHP来解析下面的代码,然后输出;那么,再试试下面的代码:

#!/bin/bash

echo This is the Bash section of the code.

/usr/local/bin/php -q << EOF

<?php

$myVar = 'PHP';

print("This is the $myVar section of the code/n");

?>

EOF

可以看出两次的代码唯一的不同就是第二次使用了一个变量“$myVar”,试试运行,PHP竟然给出出错的信息:“Parse error: parse error in - on line 2”!这是因为Bash中的变量也是“$myVar”,而Bash解析器先将变量给替换掉了,要想解决这个问题,你需要在每个PHP的变量前面加上“/”转义符,那么刚才的代码修改如下:

#!/bin/bash

echo This is the Bash section of the code.

/usr/local/bin/php -q << EOF

<?php

/$myVar = 'PHP';

print("This is the /$myVar section of the code/n");

?>

EOF

好了,现在你可以用PHP编写你自己的Shell脚本了,希望你一切顺利。如果有什么问题,可以去http://www.PHPBuilder.com或者http://www.zPHP.com上面讨论。

英文版地址:http://www.phpbuilder.com/columns/darrell20000319.php3

分享到:
评论

相关推荐

    Linux教程+ shell学习笔记 + Shell脚本常用命令+shell脚本100例资源合集

    shell脚本 是一种shell编写的脚本程序。 shell编程跟Java、PHP 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执 行的脚本解释器就可以了。 为什么要学习和使用shell? Shell属于内置的脚本 程序开发...

    PHP教程之PHP中shell脚本的使用方法分享

    作为命令语言,它交互式解释和执行用户输入...如果仅需返回一个 PHP shell脚本,我就使用 passthru&#40;&#41;。通常,我在不同的场合中使用不同的函数,并且有时它们是可以互换的。 这完全取决于我的心情和要实现的目的

    shell-常用脚本.rar

    shell常用脚本:http、httpd、jdk1.7、jdk1.8、ip-location、kafka、lamp、nginx、nodejs、openssl、python、php、prce8、redis、rvm、tomcat、zabbix、nvm。。。。。。。。。。等等,不在逐一赘述,可以下载使用

    Shell-脚本常用命令-文档.doc

    shell脚本 是一种shell编写的脚本程序。 shell编程跟Java、PHP 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执 行的脚本解释器就可以了。 为什么要学习和使用shell? Shell属于内置的脚本 程序开发的...

    Shell脚本编程30分钟入门(小结)

    被当成是一种脚本语言来设计,其运作方式与直译语言相当,由Unix shell扮演命令行解释器的角色,在读取shell脚本之后,依序运行其中的shell命令,之后输出结果。利用shell脚本可以进行系统管理,文件操作等。 示例 ...

    shell脚本作为保证PHP脚本不挂掉的守护进程实例分享

    检测完后生成SQL update原纪录3、为了防止PHP程序突然断掉,用shell脚本每隔1分钟检测,PHP挂掉了则重启我使用shell脚本作为守护进程的原因是,手机与邮箱的检测接口速度慢,不可能在1~2天将2000w用户检测完。...

    php脚本资料电子书籍

    将PHP作为Shell脚本语言使 经验积累,献给PHP爱好者!!! 漂亮但不安全的CTB论坛--CTB论坛再探 如何对PHP程序中的常见漏洞进行攻击(上) 如何对PHP程序中的常见漏洞进行攻击(下) 入侵服务器 搜索引擎技术核心揭...

    Shell脚本if else语句小结

    和Java、PHP等语言不一样,sh的流程控制不可为空,如: 代码如下: &lt;?php if (isset($_GET[“q”])) {  search(q); } else {  //do nothing } ?&gt; 在sh/bash里可不能这么写,如果else分支没有语句执行,就...

    实例说明js脚本语言和php脚本语言的区别

    js脚本语言和php脚本语言的区别是什么? 一句话: js是客户端脚本, 由浏览器执行。 php是服务端脚本, 由php服务执行, php脚本跟shell脚本(bash执行)颇为类似。 来看看js脚本, 写一个test.html文件, 其中内容...

    新版Linux Shell编程实训(全)20170518.docx

    Shell脚本语言与编译型语言的差异 17 Shell分类 18 Shell使用 19 项目一 初识Linux Shell 20 [学习目标] 20 任务1.1 构建开发环境 22 任务1.2 vi/vim编辑器 33 1.2.1 vim使用实例 34 1.2.2 vim按键说明 36 任务1.3 ...

    php-fpm开机自动启动Shell脚本

    网上有各种版本的php-fpm开机自动启动脚本, 其实你编译后源目录已经生成自动脚本。不用做任何修改即用。 cp {php-5.3.x-source-dir}/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm php-fpm开机自动启动脚本如下: ...

    shell 脚本安装PHP扩展的简单方法

    实例如下: #!/bin/bash #This script is to install PHP extensions #Author=steven ...#WriteTime=Sun Aug 14 23:32:18 CST ...PHP_HOME=/usr/local/webserver/php Extension_Install=mysql.so #Enter the extension d

    基于Smarty的PHP模板引擎设计源码

    文件类型包括424个PHP源代码文件、409个Smarty模板文件、244个GIT忽略文件、12个配置文件、6个TXT文档、4个Markdown文档、2个Plex文件、2个YAML文件、2个Shell脚本文件和1个GIT属性文件。该模板引擎支持PHP,并有助...

    shell脚本一键安装php7的实例(推荐)

    php_gz_file='/home/php/Downloads/source/php-7.0.0.tar.bz2' tar_dir='/home/php/Downloads/dst/' source_dir='php-7.0.0' cd $tar_dir rm -rf $source_dir echo '===start tar php ========' tar -jxvf $...

    让Linux下的cron以秒为单位执行shell脚本的3种方法

    需要用到Shell脚本每隔3秒钟去监控一个软件进程的运行状态,发现crond似乎只支持到分,不知道秒,怎么办呢? 第一种方法: 当然首先想到的是写一个触发的脚本,在触发脚本中使用死循环来解决此问题,如下: cat kick...

    快捷运维,代号kjyw,项目基于shell、python,运维脚本工具库,收集各类运维常用工具脚本.zip

    快捷运维,代号kjyw,项目基于shell、python,运维脚本工具库,收集各类运维常用工具脚本,实现快速安装nginx、mysql、php、redis、nagios、运维经常使用的脚本等等.... 软件开发设计:应用软件开发、系统软件开发、...

    《PHP5权威编程》

    第1章 PHP 5新特性 第2章 PHP 5基础语言 第3章 PHP 5面向对象语言 第4章 PHP 5高级面向...第16章 PHP Shell 脚本编程 附录A PEAR和PECL包索引 附录B phpDocumentor格式参考 附录C Zend Studio快速使用说明 索引 ……

    Shell脚本中实现更新PHP5

    我很迷恋 Shell,很喜欢看着字符在黑色的 Console 界面中跳跃着,奇怪的是,我居然没有因此成为一个 Linux/Unix 程序员,而只是个写 CGI 程序的倒霉蛋。大家都是怎么称呼 “PHP 程序员”的?对了——草根~ 嗯,在土...

    shell脚本联合PHP脚本采集网站的pv和alexa排名

    这是给朋友写的脚本,是做cdn方面的,经常遇见攻击,但是不能一遇见攻击就把域名给封杀,我们可以有选择的进行判断。 这个是php取值alexa值得: 代码如下: &lt;?php $yuming = $argv[1]; //获取 alaxe 排名 ...

Global site tag (gtag.js) - Google Analytics