Skip to content

基于swoole,一个center管理多台agent,可横向扩展;可视化后台管理定时脚本,程序实现crontab功能,同时支持守护进程脚本(可多进程)和crontab风格的定时脚本

License

Notifications You must be signed in to change notification settings

forgottener/swoole-crontab-process

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

流程图

graph TD
      id((Center))
      id((Center))-- send -->Agent-1;
      Agent-1-- notify -->id((Center));
      Agent-1-- 执行 -->process-1-非daemon;
      process-1-非daemon-- 成功 -->Agent-1;
      process-1-非daemon-- 失败 -->Agent-1;
      Agent-1-- 执行 -->process-1-daemon;
      process-1-daemon-- 成功 -->Agent-1;
      process-1-daemon-- 失败 -->Agent-1;

image Agent可以横向扩展

实现原理

Center作为主大脑,有一个独立的管理后台, 对所有Agent进行分组,然后赋权限给相应的操作人员;

操作人员对相应的Agent填写执行脚本的规则,规则存在mysql:

字段 说明
gid 服务分组id
task_name 任务名
rule 执行规则
execute 执行命令
run_user 执行脚本的用户名(需要linux权限)

Center服务端是一个swoole server执行秒级定时器(可以做到毫秒级别),整合连接各个Agentswoole client,然后筛选匹配时间点脚本命令,一到点就发送任务给相应的Agent;

Agent执行原理

Agent需要起swoole server,实时与Center通信,一旦接收到执行命令,根据命令的规则(是否daemon、是否多进程、执行出错是否需要重新执行、执行完是否需要将执行输出结果传回Center)进行相应的exec指令

目前PHP项目的需求点

  1. 做到可后台配置新增、停止、删除定时任务命令;
  2. 监控定时任务是否在正常运行中;
  3. 支持自定义进程数及脚本执行时间,脚本是否daemon;

服务器权限问题

所有Agent服务器起的php swoole 服务需拥有sudo权限的用户拉起,某些脚本需要写文件之类的权限;

其他

不管是Center还是Agent,都需要有php+swoole环境,php最好是php7(搭配swoole性能爆表),php版本最低也要5.6以上

配置步骤

先进行后台管理网站配置

后台是基于onethink二开的: nginx配置:

server {
        #sitename    UnitedCron
        listen       80;
        server_name  local-cron.ddyc.com;
        root         /home/Code/unitedCron/webroot;
        error_log    /home/logs/vhost/local-cron.ddyc.com-error.log;
        access_log   /home/logs/vhost/local-cron.ddyc.com-access.log;
        autoindex    on;
        index        index.html index.htm index.php;

        location / {
                index index.html index.htm index.php;
                if (!-e $request_filename) {
                        rewrite  ^(.*)$  /index.php/$1  last;
                        break;
                }
        }

        location  ~ [^/]\.php(/|$) {
                fastcgi_split_path_info  ^(.+?\.php)(/.*)$;
                if (!-f $document_root$fastcgi_script_name) {
                        return 404;
                }
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                fastcgi_param  PATH_INFO        $fastcgi_path_info;
                fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
                include        fastcgi_params;
        }
}

域名和代码目录根据你自己的具体路径填写; 后台需要先导入数据库数据,数据文件在webroot/Data/united_cron.sql; 数据库的配置有2个地方,第一个是在:webroot/Application/Common/Conf/config.php39~45行,根据你自己的具体mysql连接修改; 第二个配置在webroot/Application/User/Conf/config.php18行:define('UC_DB_DSN', 'mysql://www:123456@192.168.56.102:3306/united_cron');; 登录后台:http://local-cron.ddyc.com/Admin 用户名:admin 密码:admin

swoole服务

开启center服务

core里的文件放到你的center服务器的某个文件夹下,确保你的center服务器已经安装了php环境,以及swoole扩展;

  1. 先修改配置core/init.php的内容:
<?php
define('ROOTPATH', __DIR__);
define('CENTER_IP', "192.168.56.102"); //主大脑的swoole服务端的ip
define('CENTER_PORT', 9502); //主大脑的swoole服务端的端口port
define('AGENT_PORT', 9501);  //这个配置是针对agent的swoole server port
define('MYSQL_HOST', "127.0.0.1");//数据库ip
define('MYSQL_PORT', 3306);//数据库端口
define('MYSQL_DB_NAME', "united_cron");//数据库库名
define('MYSQL_DB_USER', "www");//数据库用户名
define('MYSQL_DB_PWD', "123456");//数据库密码
require_once ROOTPATH . '/vendor/autoload.php';
//重定向PHP错误日志到logs目录
ini_set('error_log', ROOTPATH . '/storage/log/php_errors.log');
  1. 根据自身情况修改core/center.php的内容:
<?php
require_once __DIR__ . '/init.php';
use App\Lib\Swoole\CenterServer;
$config = [
    'daemonize' => 0,
    'worker_num' => 4,
    'task_worker_num' => 10,
    'max_request' => 0,
    'dispatch_mode' => 3,
    'log_file' => ROOTPATH .'/storage/log/swoole-center.log',
    'open_eof_split' => true,
    'package_eof' => "\r\n",
];
//创建Server对象,监听 127.0.0.1:9502端口
new CenterServer("0.0.0.0", CENTER_PORT, $config);

$configopen_eof_split,package_eof不要改动,注意一定要开启task_work_num,其他的都可以修改,之所以将daemonize设为0,是我个人推荐用supervisor来管理swoole的服务,可保证swoole服务进程一直开启,supervisor的配置可以参考我的文章:http://gaoboy.com/article/2293.html;

3.运行center.php: /path/to/php /path/to/core/center.php

开启agent服务
  1. 在agent服务器上拷贝core文件夹到某个位置,然后一样的,如果core/init.php在上一步中已经配置过了,那就不要动了,根据自身情况修改core/agent.php的内容:
<?php
require_once __DIR__ . '/init.php';
use App\Lib\Swoole\AgentServer;
$config = [
    'daemonize' => 0,
    'worker_num' => 4,
    'max_request' => 0,
    'dispatch_mode' => 3,
    'log_file' => ROOTPATH .'/storage/log/swoole-agent.log',
    'open_eof_split' => true,
    'package_eof' => "\r\n",
];
//创建Server对象,监听 127.0.0.1:9501端口
new AgentServer("0.0.0.0", AGENT_PORT, $config);

$configopen_eof_split,package_eof,'max_request' => 0最好不要改动,如果修改max_request的值,那么work进程会在接收设置的次数的请求后自动重启,导致agent的一些在跑的守护进程中断再重启;

2.运行agent.php /path/to/php /path/to/core/agent.php

About

基于swoole,一个center管理多台agent,可横向扩展;可视化后台管理定时脚本,程序实现crontab功能,同时支持守护进程脚本(可多进程)和crontab风格的定时脚本

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published