php怎么定时任务管理,定时任务管理

本文介绍了如何配置一个可通过web访问控制的定时任务系统,强调了定制化定时任务、内存管理、并发控制和web访问控制的重要性。系统通过数据库驱动,支持分布式部署,并提供了内存优化策略和并发限制,适用于多种应用场景。
摘要由CSDN通过智能技术生成

可通过web访问控制的定时任务系统。

配置文件

第一步首先就是配置好schedule.ini文件。

为了能够交代清楚后面的逻辑,首先需要告知的是:定时任务的的子任务都是来源于数据库,

总共分为了三个数据表:scheduler_jobs、scheduler_vars、scheduler_tags。

jobs:定时任务

vars:变量配置

tags:标签配置

jobs的记录首先按照server_id分组,那么不同组可能会在不同的服务器执行。而不同的服务器

的工作目录、执行命令等可能又存在区别,所以通过vars配置变量去屏蔽不同的服务器之间的差异性。

因此在配置文件中需要指定这些区别。

; 基本配置模块,如pid文件、log文件路径、内存最大限制等。

[base]

; 此处省略,在demo中有

; 服务配置模块

;1对应的就是server_id=1的组别。

[server_1]

host = 127.0.0.1 ;线上最好不要写0.0.0.0和127.0.0.1,而是写真实的内网ip。

port = 3401 ;端口号,不同的组别端口号必须不同。

server = 1 ;最终DB的不同组可部署到不同服务器,为了屏蔽不同服务器

;之间的配置不同,通过`server`指定的变量替换jobs的占位符。

[server_2]

host = 127.0.0.1

port = 3402

server = 1

; DB模块

[db1]

; 此处省略,是DB连接的配置

第一件事情除了配置好配置文件之外,那就是初始化数据表。

文件在src/db/database.sql。

工作原理

通过第一步配置文件的介绍,基本上能够知道工作机制的大概。

在sched.demo中写好了一个shell,可以帮助我们快速启动服务。首先可执行

cp sched.demo sched 然后在vim sched。再执行sudo sh sched start启动进程。

如果在linux上,还可以执行sudo ln -s /path/to/sched /etc/init.d/,最后别忘了执行

sudo chmod +x /etc/init.d/sched。那么到这里以后就可以很方便的使用:

/sudo /etc/init.d/sched start server_id启动服务了。

注意:这里的server_id是jobs的字段server_id,即分组。是一个必要参数。

启动的流程大致如:

执行Process.php -> 加载配置文件 -> 初始化stream ->

( 接收web请求 -> 同步DB的数据 -> 启动子进程 -> 回收子进程 ) 这是一个循环的过程

后来再同步DB的数据这一步骤中,还增加了防止主进程意外退出时,立即重新启动主进程导致多个相同子进程并发的情况处理。每个任务可以配置最大并发数量,通过refcount记录目前已启动的子进程数。通过这两个数据的比较则可以控制单任务的最大并发数。

你可能已经注意到了,这个是基于内存管理的。那么既然是基于内存管理的,那么在内存的使用方面则需要特别注意。对于phper来说,写的最多的可能是业务方面的需求,不太会考虑到资源的回收。因为PHP是单进程的,执行结束后则自动回收资源。而在这里就不得不去多加考虑内存方面的优化了。我虽然没有写PHP常驻进程的经验,所以就从这里开始修炼。在内存回收方面,也是通过xdebug和长时间的内存使用日志跟踪,最终使主进程的内存使用稳定下来了。主要是从以下几点:

变量的回收

DB连接的关闭

输出缓冲的关闭

web客户端请求连接的关闭

子进程资源的回收

但是即使对内存的回收做到了极致(何况我还没有:),在某些情况下依然会发现内存在缓缓上升。这是为什么呢?原因可能是因为:

1)PHP是预先申请,然后自己内部分配。

2)数组申请完之后则不会再释放,这也就导致在数组变大时,即使已经将数组内的元素后来释放了,

但是该主进程占用的内存依然不会变小。

3)虽然通过top -p pid可观察到主进程共占用的内存,但是内部实际使用的会比这个小。

所以不必对内存的总占用太过担心,实际使用的内存稳定性很重要。但是默认主进程最大可使用的内存是1024M,

也可通过memory_limit在schedule.ini配置。以此来防止内存的溢出。

结合以上的理论,在本项目中可能导致内存增大的条件有:

子进程的数量上升

web访问的并发数

目前已逐步上线,更多的问题需要后续跟踪发现。

自认为的优点

通过絮絮叨叨的以上说明,现在可以说说它的优点了。

最大的优点:定制化的定时任务管理,可伸缩性很强。这种模式可以运用到其他的用途。

如除了定时任务之外,还写了一个监控系统guarder,也是通过这种模式运作。

除此之外,也可自己增加登入授权、IP白名单。如果有需要,还可以增加每个任务的功能说明及任务重跑时的额外参数等。定制化是这个项目的最大特性。

最大并行数量的控制。

web访问控制。

支持分布式服务。

本作品采用《CC 协议》,转载必须注明作者和本文链接

为什么使用PHP管理crontab 一般在定时任务较少的情况下,使用原生的crontab服务一般不会有什么问题,但当定时任务较多时就会产生如下问题: 文本形式的定时任务可读性很差,在没有任何注释的情况下,新人很难在不读源码的情况下了解定时任务的业务逻辑 在分布式的场景中,定时任务会散落到多台机器上,无法统一管理 定时任务的日志不能集中化管理,对定时任务的运行分析及故障排除比较麻烦 基于以上几点原因,我们迫切的需要一个可以集中化管理的、可配置的定时任务管理器 但自己开发一套分布式的定时任务系统何其复杂,所以作者采用crontab服务做辅助,使用php实现对定时任务的配置管理 使用php管理定时任务有哪些优势 定时任务可以不再是以文本方式的形式存在,可以存储在缓冲、数据库中,甚至你可以开发管理功能,在后台对定时任务进行编辑 定时任务的日志是可配置的,你可以按照业务需求,对日志进行差异化配置 使用方式如下: 编写一个任务管理器,可参考test/simple.php 将上述脚本添加到crontab中,一分钟执行一次 示例: <?php $crontab_config = [  'test_1' => [  'name' => '服务监控1',  'cmd' => 'php -v',  'output' => '/tmp/test.log',  'time' => '* * * * *'  ],  'single_test' => [  'name' => 'php -i',  'cmd' => 'php -i',  'output' => '/tmp/single_script.log',  'time' => [  '* * * * *',  '* * * * *',  ],  ], ];  $crontab_server = new \Jenner\Zebra\Crontab\Crontab($crontab_config); $crontab_server->start(); 工具短小,但很精悍 在分布式场景中,你可以把定时任务写入数据库中进行统一管理,你可以设定哪些定时任务是由哪些机器执行, 然后通过生成文本文件的方式发送到所有机器上,再由这些机器上的phpCrontab读取处理;从而实现分布式场景下的定时任务统一管理。 标签:Zebra
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值