PHP定时任务Crontab结合CLI模式详解
从版本 4.3.0 开始,PHP 提供了一种新类型的 CLI SAPI(Server Application Programming Interface,服务端应用编程端口)支持,名为 CLI,意为 Command Line Interface,即命令行接口。
STDIN  标准输入设备
STDOUT 标准输出设备
STDERR 标准错误设备
<?php
fwrite(STDOUT,"Enter your name:");
$name = trim(fgets(STDIN));
fwrite(STDOUT,"Hello,$name!\n");
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php
Enter your name:jiqing
Hello,jiqing!
php在cli模式下接收参数有两种方法。
1.使用argv数组
例如:需要执行一个php,并传递三个参数(type=news, is_hot=1, limit=5)
cli.php
<?php
print_r($argv);
在命令行中执行
php cli.php news 1 100
输出:
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php news 1 100
Array
(
    [0] => cli.php
    [1] => news
    [2] => 1
    [3] => 100
)
缺点:
使用argv数组,可以按顺序获取传递的参数。但获取后,需要做一个对应处理,上例中需要把argv[1]对应type参数,argv[2]对应is_hot参数,argv[3]对应limit参数。而如果在传递的过程中,参数顺序写错,则会导致程序出错。
2.使用getopt方法
getopt 从命令行参数列表中获取选项
array getopt ( string $options [, array $longopts ] )
参数:
options
该字符串中的每个字符会被当做选项字符,匹配传入脚本的选项以单个连字符(-)开头。 比如,一个选项字符串 “x” 识别了一个选项 -x。 只允许 a-z、A-Z 和 0-9。
longopts
选项数组。此数组中的每个元素会被作为选项字符串,匹配了以两个连字符(–)传入到脚本的选项。 例如,长选项元素 “opt” 识别了一个选项 –opt。
options 可能包含了以下元素:
单独的字符(不接受值)
后面跟随冒号的字符(此选项需要值)
后面跟随两个冒号的字符(此选项的值可选)
选项的值是字符串后的第一个参数。它不介意值之前是否有空格。
options 和 longopts 的格式几乎是一样的,唯一的不同之处是 longopts 需要是选项的数组(每个元素为一个选项),而 options 需要一个字符串(每个字符是个选项)。
传值的分隔符可以使用空格或=。
可选项的值不接受空格作为分隔符,只能使用=作为分隔符。
返回值
此函数会返回选项/参数对,失败时返回 FALSE。
选项的解析会终止于找到的第一个非选项,之后的任何东西都会被丢弃。
使用options案例
a,b,c 为需要值
d 为可选值
e 为不接受值
cli.php
<?php
$param = getopt('a:b:c:d::e');
print_r($param);
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -a 1
Array
(
    [a] => 1
)
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -b 2
Array
(
    [b] => 2
)
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -c 3
Array
(
    [c] => 3
)
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -d 4
Array
(
    [d] =>
)
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -d=4
Array
(
    [d] => 4
)
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -e 5
Array
(
    [e] =>
)
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -e=5
Array
(
    [e] =>
)
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -a=1 -b 2 -c 3 -d=4 -e=5
Array
(
    [a] => 1
    [b] => 2
    [c] => 3
    [d] => 4
    [e] =>
)
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -a=1 -e 2 -c 3 -d=4 -e=5
Array
(
    [a] => 1
    [e] =>
)
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -a=1 -e 2 -c 3 -d=4
Array
(
    [a] => 1
    [e] =>
)
使用longopts案例
type,is_hot 为需要值
limit 为可选值
expire 为不接受值
cli.php
<?php
$longopt = array (
    'type:',
    'is_hot:',
    'limit::',
    'expire'
);
$param = getopt('',$longopt);
print_r($param);
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php -type news
Array
(
)
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php --type news
Array
(
    [type] => news
)
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php --is_hot 1
Array
(
    [is_hot] => 1
)
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php --is_hot=1
Array
(
    [is_hot] => 1
)
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php --limit 5
Array
(
    [limit] =>
)
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php --limit=5
Array
(
    [limit] => 5
)
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php cli.php --is_hot 1 --type news --expire 5 --limit=5
Array
(
    [is_hot] => 1
    [type] => news
    [expire] =>
)
使用argv数组传参数,方法简单,实现方便。参数的顺序不能错,参数获取后需要做对应处理。
使用getopt方法,可使用参数名,参数顺序可随意,比较规范。(建议使用)
另外附上php 执行的一些参数案例
php -f 运行指定文件
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php -f cli.php
hello,world!
这里的f可以省略。
php -r 直接运行PHP代码
jiqing@ubuntu:/home/wwwroot/default/codeLab/cli$ php -r "echo phpversion().PHP_EOL;"
5.6.31
其他常用命令
php -m 内置及Zend加载的模块
php -i 等价于 phpinfo()
php -i | grep php.ini 查看php配置文件加载路径
php –ini 同上
php -v 查看php版本
php –version 同上
php –re 查看是否安装相应的扩展 如 php –re gd
再附上tp框架中cli模式的使用
在index.php入口文件目录下,新建一个cron.php
<?php
if ($_ENV && $_ENV['PHP_ENV'] == 'test') {
    define('APP_DEBUG', true);
}
define('APP_NAME', 'Cron');
define('APP_PATH', '../Cron/');
define('MODE_NAME','cli');
define('APP_DEBUG',true);
// 加载框架入口文件
require("../ThinkPHP/ThinkPHP.php");
这里只要设置一下
define('MODE_NAME','cli');
就可以,且必须在命令行下执行了。
在Cron目录下新建一个TestAction.class.php,内容如下:
<?php
/**
 * Created by PhpStorm.
 * User: jiqing
 * Date: 18-4-18
 * Time: 下午3:11
 */
class TestAction extends Action {
    public function hello() {
        echo "hello,world!".date('Y-m-d H:i:s').PHP_EOL;
    }
}
完了,就可以执行了。
jiqing@ubuntu:/home/wwwroot/default/5hao/mouse/Public$ php -f cron.php Test/hello
hello,world!2018-04-18 15:14:13
这里面可以写一些定时任务。使用crontab来定时执行,比如定时处理订单完成,定时分发佣金之类的,或者定时解锁宝箱啥的。
crontab -e 创建定时任务 crontab -l 查看定时任务
# m h  dom mon dow   command
#*/1 *  *   *   *     date >> ~/time.log
*/1 *  *   *   *      cd /home/wwwroot/default/5hao/mouse/Public && php -f cron.php Test/hello >> ~/phptime.log
这个任务的作用就是每隔一分钟执行一次Test下的hello方法,并将输出结果写入phptime.log文件中。
可以通过tail -f 进行监听,
jiqing@ubuntu:/home/wwwroot/default/5hao/mouse/Public$ tail -f ~/phptime.log
hello,world!2018-04-18 15:31:01
hello,world!2018-04-18 15:32:01
hello,world!2018-04-18 15:33:01
hello,world!2018-04-18 15:34:01
												
											PHP定时任务Crontab结合CLI模式详解的更多相关文章
- Extjs MVC开发模式详解
		
Extjs MVC开发模式详解 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开发模式, ...
 - JavaScript严格模式详解
		
转载自阮一峰的博客 Javascript 严格模式详解 作者: 阮一峰 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict m ...
 - HTTP协议头部与Keep-Alive模式详解
		
HTTP协议头部与Keep-Alive模式详解 .什么是Keep-Alive模式? 我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器 ...
 - (" use strict")Javascript 严格模式详解
		
Javascript 严格模式详解 转载别人的博客内容,浏览了一遍,没有全部吸收,先保存一下链接 http://www.ruanyifeng.com/blog/2013/01/javascript_s ...
 - Javascript设计模式之装饰者模式详解篇
		
一.前言: 装饰者模式(Decorator Pattern):在不改变原类和继承的情况下动态扩展对象功能,通过包装一个对象来实现一个新的具有原对象相同接口的新的对象. 装饰者模式的特点: 1. 在不改 ...
 - HTTP协议Keep-Alive模式详解
		
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp22 HTTP协议Keep-Alive模式详解 1.什么是Keep-Aliv ...
 - Java开源生鲜电商平台-盈利模式详解(源码可下载)
		
Java开源生鲜电商平台-盈利模式详解(源码可下载) 该平台提供一个联合买家与卖家的一个平台.(类似淘宝购物,这里指的是食材的购买.) 平台有以下的盈利模式:(类似的平台有美菜网,食材网等) 1. 订 ...
 - ext.js的mvc开发模式详解
		
ext.js的mvc开发模式详解和环境配置 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开 ...
 - Docker Kubernetes  Service 网络服务代理模式详解
		
Docker Kubernetes Service 网络服务代理模式详解 Service service是实现kubernetes网络通信的一个服务 主要功能:负载均衡.网络规则分布到具体pod 注 ...
 
随机推荐
- angularjs地址栏传参
			
1:路由定义参数 2.controller 3. 4.目标得到参数值
 - PowerDesigner之SQL表格设计
			
设计表格我觉得用PowerDesigner比起在SQL Server中设计表格简单快捷许多. 首先,我们新建一个Model(可以使用快捷键Ctrl + N) 在PowerDesigner中侧边栏有浮动 ...
 - Mongodb笔记(三)user && aggregate && mapReduce
			
版本:mongodb3.4. User: mongodb使用验证登录:默认不开启,mongod中使用--auth开启: mongod -port=3000 --auth : 基本方法: db.cr ...
 - spring mvc:文本框
			
采用:<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> ...
 - 装饰类——wpf
			
decorator:在元素“周围”设置外边框.背景或者二者. adorner:在已存在的Visual “之上”叠加Visual. AdornerDecorator:为可视化树中其下面的元素提供一个装 ...
 - Codeforces Round #448 (Div. 2)C. Square Subsets
			
可以用状压dp,也可以用线型基,但是状压dp没看台懂... 线型基的重要性质 性质一:最高位1的位置互不相同 性质二:任意一个可以用这些向量组合出的向量x,组合方式唯一 性质三:线性基的任意一个子集异 ...
 - How to Fix “ShellExecute failed (2): Is this command correct?” on Notepad++
			
Problem: When you click right-click->Edit with Notepad ++ and get the error “ShellExecute failed ...
 - 日志分析命令awk基础用法
			
awk awk是一个很好用的文本处理工具,相对于sed常用用作一整行的处理,awk则比较擅长将一行分成数个字段来处理.而在我们性能测试中,可以awk可以帮助我们造数,也可以帮助我们分析日志. 简单来说 ...
 - [置顶]
        【机器学习PAI实践三】雾霾成因分析
			
一.背景 如果要人们评选当今最受关注话题的top10榜单,雾霾一定能够入选.如今走在北京街头,随处可见带着厚厚口罩的人在埋头前行,雾霾天气不光影响了人们的出行和娱乐,对于人们的健康也有很大危害.本文通 ...
 - React Native探索(四)Flexbox布局详解
			
相关文章 React Native探索系列 前言 在Android开发中我们有很多种布局,比如LinearLayout和RelativeLayout,同样在React Native也有它的布局,这个布 ...