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 相关文章推荐
在任意字符集下正常显示网页的方法一
Apr 01 PHP
Base64在线编码解码实现代码 演示与下载
Jan 08 PHP
php日期转时间戳,指定日期转换成时间戳
Jul 17 PHP
基于PHP中的常用函数回顾
Jul 11 PHP
php实现的漂亮分页方法
Apr 17 PHP
PHPThumb图片处理实例
May 03 PHP
ecshop后台编辑器替换成ueditor编辑器
Mar 03 PHP
PHP session文件独占锁引起阻塞问题解决方法
May 12 PHP
ThinkPHP开发框架函数详解:C方法
Aug 14 PHP
大家须知简单的php性能优化注意点
Jan 04 PHP
php 指定范围内多个随机数代码实例
Jul 18 PHP
php制作圆形用户头像的实例_自定义封装类源代码
Sep 18 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
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
2006/12/06 PHP
IIS下PHP的三种配置方式对比
2014/11/20 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
JS解密入门 最终变量劫持
2008/06/25 Javascript
JavaScript 基础篇之运算符、语句(二)
2012/04/07 Javascript
javascript针对DOM的应用分析(四)
2012/04/15 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
2013/02/06 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
网页右侧悬浮滚动在线qq客服代码示例
2014/04/28 Javascript
一个JavaScript获取元素当前高度的实例
2014/10/29 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
2016/02/23 Javascript
BootStrap 实现各种样式的进度条效果
2016/12/07 Javascript
js实现日历的简单算法
2017/01/24 Javascript
ie下js不执行的几种可能
2017/02/28 Javascript
JS实现带导航城市列表以及输入搜索功能
2018/01/04 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
vue上传图片到oss的方法示例(图片带有删除功能)
2018/09/27 Javascript
vue中使用elementUI组件手动上传图片功能
2019/12/13 Javascript
[00:20]TI9观赛名额抽取Ⅱ
2019/07/24 DOTA
详解如何使用Python编写vim插件
2017/11/28 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
详解TensorFlow查看ckpt中变量的几种方法
2018/06/19 Python
用Python逐行分析文件方法
2019/01/28 Python
django中ORM模型常用的字段的使用方法
2019/03/05 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
2020/02/28 Python
详解移动端html5页面长按实现高亮全选文本内容的兼容解决方案
2016/12/03 HTML / CSS
一套中级Java程序员笔试题
2015/01/14 面试题
平面设计自荐信
2013/10/07 职场文书
工商治理实习生的自我评价
2014/01/15 职场文书
电子商务系毕业生自荐信
2014/05/29 职场文书
学雷锋活动总结报告
2014/06/26 职场文书
国庆促销活动总结
2014/08/29 职场文书
普通党员对照检查材料
2014/09/24 职场文书
vue项目配置sass及引入外部scss文件
2022/04/14 Vue.js
css之clearfix的用法深入理解(必看篇)
2023/05/21 HTML / CSS