php cli模式 性能,PHP CLI模式开发

PHP CLI模式开发不需要任何一种Web服务器(包括Apache或MS IIS等),这样,CLI可以运行在各种场合。

有两种方法可以运行PHP CLI脚本。

第一种方法是使用 # php /path/to/yourFile.php 调用PHP CLI解释器,并给脚本传递参数。这种方法要指定php解释器的路径。

第二种方法是首先运行chmod +x (UNIX/Linux环境),将该PHP文件置为可执行权限,然后在CLI脚本头部第一行加入声明(类似于#! /usr/bin/php 或 PHP CLI 解释器位置),接着在命令行直接执行。

一、从命令行上读取参数

如果想从命令行获取参数,CLI可以从 $_SERVER['argv'] 和 $_SERVER['argc'] 取得参数的值和参数个数。

我们建立一个文件,名字为 cliPHP1.php 脚本代码如下:

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

/**

* PHP CLI带有两个特殊的变量,专门用来达到这个目的:

* 一个是 $_SERVER['argv'] 变量,它通过命令行把传递给PHP脚本的参数保存为单独的数组元素;

* 另一是 $_SERVER['argc'] 变量,它用来保存$_SERVER['argv']数组里元素的个数。

*

*

* 运行效果:

* # /usr/local/php/bin/php ./cliPHP1.php aa bb cc

* Array

* (

* [0] => ./cliPHP1.php ---> 0 指当前脚本名称

* [1] => aa --------------> 1 第1个参数

* [2] => bb --------------> 2 第2个参数

* [3] => cc --------------> n 第n个参数

* )

* number: 4 -----------------> 参数数量

*

*/

ini_set('error_reporting', 'E_ALL & ~E_NOTICE'); //设置错误报告模式

$argv = $_SERVER['argv']; //获取参数(array 数组)

$argc = $_SERVER['argc']; //获取参数数量(integer 整数)

print_r($argv);

echo 'number: '.$argc;

echo "\r\n";

?>

二、处理I/O通道

PHP最初设计不是用于与用户直接的键盘输入或文本输出结合使用。了解这一设计是至关重要的,因为如果需要在命令行中执行任何操作,都必须能够与用户来回通信。

输入输出(I/O)通道这个思想来源于UNIX系统,UNIX系统提供3个文件句柄,用以从一个应用程序及用户终端发送和接收数据。

我们可以把一个脚本的输出重定向到一个文件,例如:

# php world.php > outputfile

如果是在UNIX系统下,也可以使用通道定向到另一个命令或应用程序中。例如:

# php world.php | sort

在PHP 5 CLI中,有一个文件流句柄,可以使用3个系统常量,分别为 STDIN、 STDOUT 和 STDERR。下面我们分别介绍。

(1) STDIN

STDIN 全称为 standard in 或 standard input 标准输入可以从终端取得任何数据。

(2) STDOUT

STDOUT 全称为 standard out 或 standard output 标准输出可以直接输出到屏幕(也可以输出到其他程序,使用STDIN取得),如果在PHP CLI模式里使用print或echo语句,则这些数据将发送到STDOUT。

(3) STDERR

STDERR 全称为 standard error 在默认情况下会直接发送至用户终端,当使用STDIN文件句柄从其他应用程序没有读取到数据时会生成一个“stdin.stderr”。

我们建立一个文件,名字为 cliPHP2.php 脚本代码如下:

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

/**

* 本例是一个CLI与用户交互脚本,让其输出用户名与年龄并输出

* 标准输出: fwrite(STDOUT,'请输出用户名:') //输出内容

* 标准输入: fgets(STDIN) //获取用户输入的内容

* 标准错误输出: fwrite(STDERR,'错误:xxxxx') //输出错误信息

*

* 运行效果:

* [root@zzx tmp]# /usr/local/php/bin/php /wwwroot/test/httpsqs/cliPHP.php

* Enter your name:

* Enter your name:zhangsan

* Enter your age:abc

* Notice: age must be an integer,try again!

* Enter your age:aaa

* Notice: age must be an integer,try again!

* Enter your age:22

* Hello zhangsan, your age is 22

*/

$name = '';

$age = '';

while(true){

fwrite(STDOUT,"Enter your name:"); //标准输出,等待用户输入用户名

$name = trim(fgets(STDIN)); //标准输入,立即获取用户名

if(!empty($name)){

break 1;

}

}

while(true){

fwrite(STDOUT,"Enter your age:");

$age = trim(fgets(STDIN));

if(empty($age)){

continue 1;

}

$matchNum = preg_match('/^\d+$/',$age); //验证整型,获取匹配次数

if($matchNum == 0){

fwrite(STDERR,"Notice: age must be an integer,try again!\r\n");

}else{

break 1;

}

}

//do something here...

$outStr = "Hello $name, your age is $age";

fwrite(STDOUT,$outStr);

echo "\n\n";

?>

三、用 nohup 后台运行CLI

如果正在运行一个进程,而且在退出账户时该进程还不会结束,即在系统后台或背景下运行,那么就可以使用nohup命令。该命令可以在退出账户之后继续运行相应的进程。

nohup在英文中就是不挂起的意思(no hang up)。该命令的一般形式为:

# nohup &

使用nohup命令提交作业,在默认情况下该作业的所有输出都被重定向到一个名为 nohup.out 的文件中,除非另外指定了输出文件:

# nohup /usr/local/php/bin/php ./scriptName.php >/tmp/log.txt & 将标准输出重定向到log.txt

# nohup /usr/local/php/bin/php ./scriptName.php >/tmp/log.txt >/tmp/err.txt & 将标准输出重定向到/tmp/log.txt 错误输出重定向到/tmp/err.txt

# nohup /usr/local/php/bin/php ./scriptName.php >/tmp/log.txt >& & 将标准输出重定向到/tmp/log.txt 然后再将标准错误输出重定向到标准输出,即:两者一起重定向到/tmp/log.txt

# nohup /usr/local/php/bin/php ./scriptName.php >/dev/null >& & 将标准输出和错误输出一起到重定向到/dev/null

这样,PHP CLI脚本执行后的结果将输出到log.txt中,我们可以使用tail命令动态查看内容:

# tail -f -n20 /tmp/log.txt

现在再来实现一个例子,是每隔10秒钟自动生成一个静态HTML文件,并一直执行下去。脚本代码如下:

脚本名称: cliPHP3.php

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

/**

* 本例是每隔10秒钟自动生成一个静态HTML文件,并一直执行下去

*/

while(true){

file_put_contents("/tmp/article_".time().".html",date('Y-m-d H:i:s'));

sleep(10); //10秒 (单位: 秒)

//usleep(1000000 * 0.5); //0.5秒(单位: 微秒 注: 1000000微秒=1秒)

}

?>

保存并且退出vi编辑器,然后赋予 genHTML.php 文件可执行权限,并执行(在Linux命令行下执行脚本建议写绝对路径,这是良好习惯):

# chmod 755 cliPHP3.php

# nohup /usr/local/php/bin/php /wwwroot/httpsqs/cliPHP3.php 1>/dev/null 2>&1 &

执行上述命令后出现如下提示:[2] 3300

在当前会话下,使用jobs命令可以查看所有后台运行的所有进程:

# jobs

[1]-  Running   nohup /usr/local/php/bin/php /wwwroot/httpsqs/usage_server.php > /opt/httpsqs/data/log.txt 2> /opt/httpsqs/data/err.txt &

[2]+  Running   nohup /usr/local/php/bin/php /wwwroot/httpsqs/cliPHP3.php > /dev/null 2>&1 &

如何终止CLI程序的后台运行呢?

使用 # ps aux 可查看当前系统所有进程,使用grep过滤选项即可,如下:

# ps aux | grep php

root      3227  0.1  1.6 106796  8408 pts/3    S    06:03   0:02 /usr/local/php/bin/php /wwwroot/httpsqs/usage_server.php

root      3300  0.0  1.5 106796  8080 pts/3    S    06:39   0:00 /usr/local/php/bin/php /wwwroot/httpsqs/cliPHP3.php

root      3312  0.0  0.1   5980   744 pts/4    S+   06:41   0:00 grep php

能够轻松找到 /wwwroot/httpsqs/cliPHP3.php 对应的PID为3300,使用kill命令杀死进程即可:

# kill 3300

PHP CLI模式开发(转)

PHP CLI模式开发不需要任何一种Web服务器(包括Apache或MS IIS等),这样,CLI可以运行在各种场合. 有两种方法可以运行PHP CLI脚本. 第一种方法是使用php -f /path ...

****CodeIgniter使用cli模式运行,把php作为shell编程

shell简介 在计算机科学中,Shell俗称壳(用来区别于核).而我们常说的shell简单理解就是一个命令行界面,它使得用户能与操作系统的内核进行交互操作. 常见的shell环境有:MS-DOS.B ...

phpstorm中使用xdebug配置cli模式的调试

这里略去xdebug的安装,安装很简单可以下载源码包,动态编译进去! 环境: Dev 服务器(IP:192.168.2.100),安装phpstorm,用来做开发任务! Server服务器(IP:19 ...

PHP之CLI模式

转载: http://www.cnblogs.com/zcy_soft/archive/2011/12/10/2283437.html 所有的PHP发行版,不论是编译自源代码的版本还是预创建的版本,都 ...

PHP CLI模式下的多进程应用

作者: Laruence(   ) 本文地址: http://www.laruence.com/2009/06/11/930.html 转载请注明出处 PHP在很多时候不适合做常驻的SHELL进程, ...

PHP CLI模式下的多进程应用分析

PHP在非常多时候不适合做常驻的SHELL进程, 他没有专门的gc例程, 也没有有效的内存管理途径. 所以假设用PHP做常驻SHELL, 你会常常被内存耗尽导致abort而unhappy 并且, 假设 ...

《连载 | 物联网框架ServerSuperIO教程》- 6.并发通讯模式开发及注意事项

1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 1.4种通讯模式机制.

《连载 | 物联网框架ServerSuperIO教程》- 7.自控通讯模式开发及注意事项

1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 1.4种通讯模式机制.

《连载 | 物联网框架ServerSuperIO教程》- 8.单例通讯模式开发及注意事项

1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 1.4种通讯模式机制.

随机推荐

对C语言中指针的一些新认识

学C语言这么久了,才发现指针不是想象中那么简单,当初根本就没理解指针怎么用! 变量--是由操作系统自动分配存储空间的    指针--手动分配存储空间或指向已有变量的地址 指针中的内容需要手动释放,而变 ...

Weka使用介绍

(转) http://baidutech.blog.51cto.com/4114344/1033714/ 1.简介 数据挖掘.机器学习这些字眼,在一些人看来,是门槛很高的东西.诚然,如果做算法实现甚至 ...

js操作textarea方法集合

PHP 文件上传类

FileUpload.;                $];                $_newname = date(,). :                             To ...

TCP/IP FTP/TFTP

引言 从一台计算机向另一台计算机传送文件是在连网或互联网环境中最常见的任务.而FTP和TFTP就是这样的协议. 关于文件传输协议FTP? 端口21使用服务TCP [FTP模型] FTP连接? 1.控制 ...

php根据用户输入单词,匹配相似单词

最近在使用一款app背单词的时候,会在某个单词下面,列出与之相类似的单词.于是我在想这个功能是如何做的,自己使用php版本,做了个简单的例子. 大致思路如下: 1.生成英文单词库,并将单词放置redi ...

C语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)

昨天周末给学妹讲了一些指针的知识,本来我对指针就是似懂非懂的状态,经过昨天一讲,我对指针的学习就更深刻了 果然给别人讲课也是学习的一个方法.加上最近复习数据结构,发现我的博客里没有链表的博文,所以趁这 ...

ABP 番外篇-菜单

public class LearningMpaAbpNavigationProvider : NavigationProvider { public override void SetNavigat ...

Alpha 冲刺 (4/10)

目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:冲刺4 团队部分 后敬甲 过去两天完成了哪些任务 文字描述 主页部分图标的替换 -拍照按钮的设计和测试 GitHub代码 ...

linux之软连接,硬连接篇

作业四: 1) 建立/etc/passwd的软连接文件,放在/tmp目录下 [root@localhost 桌面]# ln -s /etc/passwd/a.txt /tmp/aa.txt 2) 建立 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值