前言:
在php开发过程中,我们需要定时执行某些任务(定时进程),或者一直执行某些任务(常驻进程)。我们如何在web端对这些任务进行管理和监控呢?也就是说如何实现任务调度功能。任务调度,java、python等都有一些成熟的方案。但是我们如何使用PHP实现任务调度呢?我们这里一起来讨论一下实现方案的思路,抛砖引玉一下,希望高手们也赐教一下你们的实现方案。
内容概要:
1、任务调度的大体思路
2、任务调度的详细方案
3、多台服务器任务调度的改进方案
一、任务调度的大体分析
我们先假设一个单台服务器的需求。有两个任务:
对于PHP来说,实现一个常驻进程,我们可以使用死循环实现,并且使用cli命令执行的方式启动。而定时任务我们可以借助 crontab 来进行管理,当然执行方式也是用cli命令执行方式。
这里插一句,使用linux中的curl一个网址的方式不如直接使用cli方式好,因为不用再走一次 web服务器 ( nginx 或 apache ),节省一些资源。
使用web的方式对任务进行管理,我们可以借助 shell ,加上crontab定时执行的方式来实现,即,在web管理端,将要执行的任务写到一个文件A中,运行一个常驻任务,发现A文件存在,就执行A所要求的任务,并将A文件改名后存储到其他地方。这样就能实现对任务的调度功能。
二、任务调度的详细方案
首先,我们在web中,对假设的两个任务先存储起来,我们存储的字段有:执行时间设置,任务标志,任务的shell文件(注意:shell文件可以在页面操作中生成,并赋予执行权限,并在这个shell文件中,我们可以控制常驻进程的个数)。并在页面设置一个更新任务的按钮,当用户点击这个按钮时,我们将两个任务写成crontab命令的方式存储到一个文件中,假设该文件叫cron.txt。
第二步,我们创建一个shell文件,并将该文件加入到crontab,可以设置每一分钟执行一次。假设文件名字叫做watch.sh,该文件的作用是,发现有cron.txt文件存在,就将cron.txt文件的内容写入到crontab中,并将cron.txt文件改名存储到其他地方。
以上两步实现了对任务的启动,常驻任务和定时任务都可以使用这种方式。
下面我们实现常驻任务的关闭和重启功能。
web页面发出常驻任务的停止命令,我们将该命令放到一个文件中,假设是stop.txt,在watch.sh中检查stop.txt文件是否存在,如果存在,关闭stop.txt文件中所要求的进程。
三、多台服务器任务调度的改进方案
以上是单台服务器的实现方案,对于多台服务器,我们可以将watch.sh部署到每一台服务器上,并将任务加载到crontab中,我们可以生成多个cron.txt文件的命名加上服务器的表示,比如server1_cron.txt,在具体每台服务器的watch.sh中进行识别,将属于本台服务器的cron.txt任务加载到crontab中。
同理,我们对于关闭任务的stop.txt文件也做同样的处理。
如此一来,我们可以在web页面中控制每个任务具体到那一台服务器上执行,或者指定到多台服务器上执行。
当然,我们还可以在watch.sh中加上进程资源占用数据的获取,并按照一定规则存储到某个文件中,web端按照规则读取文件内容,完成进程的监控功能。
以上方案均用到了文件的存储,所以,多台服务器需要用到分布式文件存储的服务。当然,我们也可以使用 redis 或者mysql等存储文件的内容。
这里只是一个思路,代码实现后我会发到 github 上。
关注、评论、点赞,转发,收藏,任选一种或多种,是您最大的支持和鼓励。
原创很辛苦,码字不容易,转载请注明出处:头条号|PHP在路上