分析入口文件main.php
在分析之前,需要了解php cli模式下的编程
1.了解getopt函数,php手册地址:http://php.net/manual/zh/function.getopt.php
static private $help = <<<EOF 帮助信息:
Usage: /path/to/php main.php [options] -- [args...] -h [--help] 显示帮助信息
-p [--pid] 指定pid文件位置(默认pid文件保存在当前目录)
-s start 启动进程
-s stop 停止进程
-s restart 重启进程
-l [--log] log文件夹的位置
-c [--config] config文件的位置
-d [--daemon] 是否后台运行
-r [--reload] 重新载入配置文件
-m [--monitor] 监控进程是否在运行,如果在运行则不管,未运行则启动进程
--worker 开启worker
--tasktype task任务获取类型,[file|mysql] 默认是file
--checktime 默认精确对时(如果精确对时,程序则会延时到分钟开始0秒启动) 值为false则不精确对时 EOF;
/**
* 运行入口
*/
static public function run()
{
$opt = getopt(self::$options, self::$longopts);
self::spl_autoload_register();
self::params_h($opt);
self::params_d($opt);
self::params_p($opt);
self::params_l($opt);
self::params_c($opt);
self::params_r($opt);
self::params_worker($opt);
self::params_tasktype($opt);
self::params_checktime($opt);
$opt = self::params_m($opt);
self::params_s($opt);
}
如上,main.php 可以支持长短选项,以及接收参数
短选项是options 。该字符串中的每个字符会被当做选项字符,匹配传入脚本的选项以单个连字符(-)开头。 比如,一个选项字符串 "x" 识别了一个选项 -x。 只允许 a-z、A-Z 和 0-9。
长选项是longopts。此数组中的每个元素会被作为选项字符串,匹配了以两个连字符(--)传入到脚本的选项。 例如,长选项元素 "opt" 识别了一个选项 --opt。
这里有一个条件非常重要
- 单独的字符(不接受值)
- 后面跟随冒号的字符(此选项需要值)
- 后面跟随两个冒号的字符(此选项的值可选)
比如,我们试试看这个main.php -h 和 -s start 这里h是不带值的,s是可以带值的
<?php
$options = 's:h';
$xx = getopt($options);
var_dump($xx);
E:\FMS\trunk\swoole\study_swoole>php test.php -h
输出:
E:\FMS\trunk\swoole\study_swoole\test.php:4:
array(1) {
'h' =>
bool(false)
}
E:\FMS\trunk\swoole\study_swoole>php test.php -s reload
输出:
E:\FMS\trunk\swoole\study_swoole\test.php:4:
array(1) {
's' =>
string(6) "reload"
}
了解了,cli怎么获取参数,我们再去看下main.php 的run方法到底在执行什么逻辑
45行:self::spl_autoload_register();自己添加了自己支持的自动引入
46行:self::params_h($opt); 返回帮助信息,并且会直接die退出
[root@localhost crontab]# php main.php -h 帮助信息:
Usage: /path/to/php main.php [options] -- [args...] -h [--help] 显示帮助信息
-p [--pid] 指定pid文件位置(默认pid文件保存在当前目录)
-s start 启动进程
-s stop 停止进程
-s restart 重启进程
-l [--log] log文件夹的位置
-c [--config] config文件的位置
-d [--daemon] 是否后台运行
-r [--reload] 重新载入配置文件
-m [--monitor] 监控进程是否在运行,如果在运行则不管,未运行则启动进程
--worker 开启worker
--tasktype task任务获取类型,[file|mysql] 默认是file
--checktime 默认精确对时(如果精确对时,程序则会延时到分钟开始0秒启动) 值为false则不精确对时
47行:self::params_d($opt);//设置常量,Crontab::$daemon = true; 设置为守护进程
48行:self::params_p($opt);//设置pid文件的位置 ,如果-p不接入参数会默认保存在当前目录
if (empty(Crontab::$pid_file)) {
Crontab::$pid_file = ROOT_PATH . "/pid";
}
49行:self::params_l($opt);//设置日志文件放置位置,如果-l不写参数会默认保存在当前目录的logs文件夹
50行:self::params_c($opt);//设置config配置参数这里的配置参数太过于复杂,我也不认为有人会想输入这个参数,这里默认值是根目录下的config/crontab.php中
<?php
return array(
'taskid1' =>
array(
'taskname' => 'php -i', //任务名称
'rule' => '* * * * * *',//定时规则
"unique" => 1, //排他数量,如果已经有这么多任务在执行,即使到了下一次执行时间,也不执行
'execute' => 'Cmd',//命令处理类
'args' =>
array(
'cmd' => 'php -i',//命令
'ext' => '',//附加属性
),
),
'taskid2' =>
array(
'taskname' => 'test', //任务名称
'rule' => array("09:30","14:12:58","22:30:36","22:24:36"),
"unique" => 1, //排他数量,如果已经有这么多任务在执行,即使到了下一次执行时间,也不执行
"execute" =>"Gather",
'args' =>
array(
'cmd' => 'gather',//命令
'ext' => '',//附加属性
),
),
);
这里是配置任务的相关参数,注意这里有几个需要注意的,execute是需要执行的命令,unique排他数量,rule是规则
行51:self::params_r($opt);
这里会重新载入配置文件,会判断之前的pid文件是否存在,如果存在就会执行kill
swoole_process::kill($pid, 0)这句话是指的 $signo=0,可以检测进程是否存在,不会发送信号(swoole文档里面有说明,附传送门:https://wiki.swoole.com/wiki/page/219.html)
发送SIGUSR1命令 ,但是我再后面的测试过程中发现,这个指令并没有什么用,不即时
static public function params_r($opt)
{
if (isset($opt["r"]) || isset($opt["reload"])) {
$pid = @file_get_contents(Crontab::$pid_file);
if ($pid) {
if (swoole_process::kill($pid, 0)) {
swoole_process::kill($pid, SIGUSR1);
Main::log_write("对 {$pid} 发送了从新载入配置文件的信号");
exit;
}
}
Main::log_write("进程" . $pid . "不存在");
}
}
行52:self::params_worker($opt);Crontab::$worker = true;具体功能:设置开启工作进程,解释是:工厂要生成很多商品,将不同的商品流水线交给不同的工人进行生产处理
行53:self::params_tasktype($opt);//task任务获取类型,[file|mysql] 默认是file 这里其实看源码最起码从main.php是看不到此类限制,但是在include/loadtask/LoadTasks.class.php里面的构造方法里面有这种判断
行54:self::params_checktime($opt);//Crontab::$checktime = false;
行55:$opt = self::params_m($opt);//源码里面很清楚,检测进程是否存在,如果存在则重新设置参数数组,标示重启执行-s restart
行56:self::params_s($opt);//这里是核心方法,下节开始分析
分析入口文件main.php的更多相关文章
- Yii2 源码分析 入口文件执行流程
Yii2 源码分析 入口文件执行流程 1. 入口文件:web/index.php,第12行.(new yii\web\Application($config)->run()) 入口文件主要做4 ...
- 关于electron中入口文件main.js一些重要参数(持续更新maybe)
const {app, BrowserWindow} = require('electron') const path = require('path') let mainWindow functio ...
- Vue工程化入口文件main.js中Vue.config.productionTip = false含义
阻止启动生产消息,常用作指令.通俗理解为消息提示的环境配置. 阻止启动生产消息 這又是什麽意思? 看下效果 (1)Vue.config.productionTip = false (2)Vue.con ...
- Flutter实战视频-移动电商-02.Flutter实战建立项目和编写入口文件
02.Flutter实战建立项目和编写入口文件 创建项目: flutter create flutter_shop 创建完成之后呢,它会提示我们, 进入flutter_shop的目录,然后执行flut ...
- Thinkphp源码分析系列(一)–入口文件
正如官方文档上所介绍的,thinkphp使用单一入口,所有的请求都从默认的index.php文件进入.当然不是说一定非得从index.php进入,这应该取决于你的服务器配置,一般服务器都会有默认的首页 ...
- opencart 单入口文件简单分析
opencart 单入口文件简单分析 opencart是基于mvcl的商城系统,据说是一个外国有人单独开发.比较牛叉.但是又不大符合国人习惯,目前国内opencart社区也是不少. 简单分析了下单 ...
- CodeIgniter框架——源码分析之入口文件index.php
CodeIgniter框架的入口文件主要是配置开发环境,定义目录常量,加载CI的核心类core/CodeIgniter.php. 在index.php中,CI首先做的事情就是设置PHP的错误报告, ...
- node入口文件分析和目录初始化
1.需要安装的模块 npm install express npm install jade npm install mongoose npm install bower -g npm install ...
- laravel5.5入口文件分析
入口文件 public/index.php 1.加载composer的自动加载器 require __DIR__.'/../vendor/autoload.php'; 自动加载,不用再各种requir ...
随机推荐
- 100个常用的Linux命令——转载
1,echo “aa” > test.txt 和 echo “bb” >> test.txt //>将原文件清空,并且内容写入到文件中,>>将内容放到文件的尾部 2 ...
- Docker虚拟化平台
1.虚拟化技术的概念 1)虚拟化就是把物理资源转变为逻辑上可以管理的资源,以打破物理结构间的壁垒,让计算机的元件运行在虚拟的基础上,而不是真实的物理设备: 2)虚拟化技术可以将物理机硬件资源虚拟生成单 ...
- python基础学习Day10 函数形参的动态参数、*args **kwargs 命名空间 global 与 nonlocal
一.函数形参的动态参数 原因:为了拓展,对于实参数量不固定,故需要万能参数,即动态参数, *args **kwargs # def sum1(*args): # 在函数定义时,在*位置参数,聚合. ...
- python爬取股票信息
import requests from bs4 import BeautifulSoup import traceback import re def getHTMLText(url): try: ...
- 外购半成品回写PR时将同一供应商同一编码的PR合并数量回写
'); --PR 净需求 '); ---加上PR回写逻辑后 '); ---加上PR回写逻辑后 ') order by item; ---最终回写去SAP的数据 ) as LGORT ,'SAPRFC' ...
- metasploitable使用
DVWA默认的用户有5个,用户名密码如下(一个足以): admin/password gordonb/abc123 1337/charley pablo/letmein smithy/password
- Android笔记:Button
示例代码摘自<第一行代码> ButtonDemo.java的代码: public class ButtonDemo extends Activity { @Override protect ...
- 简单的jQ代码
简单的jQ代码 /* * Lazy Load - jQuery plugin for lazy loading images * * Copyright (c) 2007-2012 Mika Tuup ...
- 复杂链表的复制(python)
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...
- mybatis知识点(已掌握)
1.${} 和 #{} 的区别? ${} 直接显示传入数据,不能防止sql注入,一般用于传数据库对象(比如表名). #{} 传入数据被当成字符串,自动加上双引号,防止sql注入. 2.有哪些Execu ...