php cli模式学习(PHP命令行模式)


Posted in PHP onJune 03, 2013

php_cli模式简介

php-cli是php Command Line Interface的简称,如同它名字的意思,就是php在命令行运行的接口,区别于在Web服务器上运行的php环境(php-cgi, isapi等) 也就是说,php不单可以写前台网页,它还可以用来写后台的程序。 PHP的CLI shell脚本适用于所有的PHP优势,使创建要么支持脚本或系统甚至与GUI应用程序的服务端!——注:windows和linux下都支持php_cli模式

PHP-cli应用场景:

1.多线程应用
这方面的好处,引用鸟哥的话:

优点:
1. 使用多进程, 子进程结束以后, 内核会负责回收资源
2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程.
3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚.

php的多线程—没错就是php多线程应用,虽然大家都普遍认为php没有多线程(curl属于模拟多线程而不是真实的),但是在php_cli模式下的php彻底的是属于多线程。这个时候php属于linux的一个守护进程。 在本人之前写过的《PHP多线程批量采集下载美女图片(续)》的时候在采集程序里虽然使用curl来模拟多线程,但是在浏览器执行的时候也是会遇到执行超时或内存abort而导致程序中断,(要尝试几次才可以彻底成功),但是如果在php-cli模式下执行,你就会发现这个程序执行的很快,php多线程执行的优势被彻底表现出来了.

备注:这种多线程方式不是很成熟,不适合大规模的生成应用,偶尔使用还是可以的

2.定时执行php程序

之前本人总结关于《PHP定时执行计划任务》的三种方式,利用有一张就是利用linux的cron方式,那么这个方式是如何定时执行php程序?请看下文

3.开发桌面程序

你可以做您的Windows或Linux中使用PHP的图形用户界面(GUI)应用!所有你需要的是PHP的命令行接口和一包GTK。这将允许建立真正的便携式图形用户界面应用程序(呵呵,之前只是知道php可以做桌面程序,现在才知道是使用php_cli模式),并且不需要学习别的。

4.编写PHP的shell脚本
如果你不会bash shell或者Perl等的使用,但是你又需要一些脚本去执行的时候,怎么办?这个时候你完全可以使用你熟悉的php编写shell脚本,这个时候你是不是突然感觉PHP是不是太强大了!—?真正做到一种语言,到处开发!

PHP_CLI使用方法

win下面的执行方法:
假设php.exe 在D:xamppphp在dos命令在可以这个执行:

D:\xamppphpphp.exe D:\xampphtdocstest.php

就可以执行test.php这个文件了 。这里推荐win平台下xampp集成环境,真正比wamp强大N倍,这个集成包可以直接进入dos模式。

linux下php_cli使用
首先找到你安装php的路径,以我为例:

php cli模式学习(PHP命令行模式)

php安装在路径/usr/local/php/bin/php下

/usr/local/php/bin/php /usr/local/apache/htdocs/a.php

就可以执行a。php文件

PHP_CLI编程需知
如何检测环境支持php_cli模式?

<?php
//方法1
if (PHP_SAPI === 'cli')
{
   // ...
}
//方法2
if (php_sapi_name() === 'cli')
{
   // ...
}

PHP_ClI如何接收参数?
默认情况下/usr/local/php/bin/php接收参数是$argv,这个变量是固定的!在php文件中var_dump($argv);

得到下面结果:

php cli模式学习(PHP命令行模式)

可以写个简单的处理函数把这个方式转化为大家常用的GET/post的参数模式。

简单代码:

<?php 
function parseArgs($argv){ 
array_shift($argv); 
$out = array(); 
foreach ($argv as $arg){ 
if (substr($arg,0,2) == '--'){ 
$eqPos = strpos($arg,'='); 
if ($eqPos === false){ 
$key = substr($arg,2); 
$out[$key] = isset($out[$key]) ? $out[$key] : true; 
} else { 
$key = substr($arg,2,$eqPos-2); 
$out[$key] = substr($arg,$eqPos+1); 
} 
} else if (substr($arg,0,1) == '-'){ 
if (substr($arg,2,1) == '='){ 
$key = substr($arg,1,1); 
$out[$key] = substr($arg,3); 
} else { 
$chars = str_split(substr($arg,1)); 
foreach ($chars as $char){ 
$key = $char; 
$out[$key] = isset($out[$key]) ? $out[$key] : true; 
} 
} 
} else { 
$out[] = $arg; 
} 
} 
return $out; 
} 
var_dump($argv); 
var_dump(parseArgs($argv));exit;

执行结果:

php cli模式学习(PHP命令行模式)

当然实现的方法不止一个,大家可以尝试其他方法实现!

例外关于php的cli还有很多参数可以加入:具体可以参考:http://php.net/manual/en/features.commandline.php

关于定时执行
cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业,周期性作业,比如备份数据 打开/etc/crontab,添加:

/usr/bin/php -f /data/htdocs/test.php

关于corntab的详细使用参考51cto专题:Linux计划任务——cron服务

本文参考资料
https://3water.com/article/1716.htm 
https://3water.com/article/37804.htm 
https://3water.com/article/37796.htm

附注:2012-06-16 增加php_cli编程需知等

PHP 相关文章推荐
Apache2 httpd.conf 中文版
Dec 06 PHP
使用PHP会话(Session)实现用户登陆功能
Jun 29 PHP
php不允许用户提交空表单(php空值判断)
Nov 12 PHP
PHP使用Pthread实现的多线程操作实例
Nov 14 PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
Nov 25 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
Jan 27 PHP
PHP编写的图片验证码类文件分享
Jun 06 PHP
php数据序列化测试实例详解
Aug 12 PHP
yii gridview实现时间段筛选功能
Aug 15 PHP
php之可变变量的实例详解
Sep 12 PHP
php 获取xml接口数据的处理方法
May 31 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
May 29 PHP
获取PHP警告错误信息的解决方法
Jun 03 #PHP
php cli 小技巧
Jun 03 #PHP
php中用加号与用array_merge合并数组的区别深入分析
Jun 03 #PHP
PHP在线生成二维码代码(google api)
Jun 03 #PHP
深入探讨:Nginx 502 Bad Gateway错误的解决方法
Jun 03 #PHP
深入php-fpm的两种进程管理模式详解
Jun 03 #PHP
PHP 异步执行方法,模拟多线程的应用分析
Jun 03 #PHP
You might like
php按字符无乱码截取中文的方法
2015/03/27 PHP
PHP实现根据图片色界在不同位置加水印的方法
2015/08/08 PHP
PHP implode()函数用法讲解
2019/03/08 PHP
JQuery 学习笔记 选择器之四
2009/07/23 Javascript
返回页面顶部top按钮通过锚点实现(自写)
2013/08/30 Javascript
jquery实现在页面加载的时自动为日期插件添加当前日期
2014/08/20 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
js基于cookie方式记住返回页面用法示例
2016/05/27 Javascript
jQuery图片切换动画特效
2016/11/02 Javascript
React-Native左右联动List的示例代码
2017/09/21 Javascript
Node.js的Koa实现JWT用户认证方法
2018/05/05 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
2018/07/07 Javascript
Vue computed 计算属性代码实例
2020/04/22 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
[01:24:51]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第二场
2014/05/26 DOTA
浅析Python编写函数装饰器
2016/03/18 Python
python使用arcpy.mapping模块批量出图
2017/03/06 Python
python数据结构之链表的实例讲解
2017/07/25 Python
Python中列表list以及list与数组array的相互转换实现方法
2017/09/22 Python
Vue的el-scrollbar实现自定义滚动
2018/05/29 Python
python中的二维列表实例详解
2018/06/19 Python
python实现批量解析邮件并下载附件
2018/06/19 Python
python生成带有表格的图片实例
2019/02/03 Python
使用python搭建服务器并实现Android端与之通信的方法
2019/06/28 Python
Python3基本输入与输出操作实例分析
2020/02/14 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
python使用正则表达式匹配txt特定字符串(有换行)
2020/12/09 Python
BLACKMORES澳洲官网:澳大利亚排名第一的保健品牌
2018/09/27 全球购物
职业规划书如何设计?
2014/01/09 职场文书
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
小学毕业典礼主持词
2014/03/27 职场文书
超市客服工作职责
2014/06/11 职场文书
2015年成本会计工作总结
2015/10/14 职场文书
导游词之山西关帝庙
2019/11/01 职场文书
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python
Opencv中cv2.floodFill算法的使用
2021/06/18 Python