位置: 编程技术 - 正文

如何使用纯PHP实现定时器任务(Timer)(php做)

编辑:rootadmin

推荐整理分享如何使用纯PHP实现定时器任务(Timer)(php做),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php使用方法,php使用教程,php实用教程,php用什么写,怎么使用php,怎么使用php,php实用教程,怎么使用php,内容如对您有帮助,希望把文章链接给更多的朋友!

定时器任务,在WEB应用比较常见,如何使用PHP实现定时器任务,大致有两种方案:1)使用Crontab命令,写一个shell脚本,在脚本中调用PHP文件,然后定期执行该脚本;2)配合使用ignore_user_abort()和set_time_limit(),使脚本脱离浏览器运行。前者是利用Linux的特性,和PHP本身没有多大关系,后者使用场景有限,且只能由一次HTTP请求触发该脚本,执行完后退出。那么我们如何使用纯PHP实现纯粹的定时器任务,且能适应认识任务业务需求?

基础知识

此程序在Linux下开发,以cli模式运行,一下是基本知识的简要介绍。

CLI:PHP的命令行模式,常见的WEB应用使用的是fpm;进程:进程是程序运行的基本单元,进程之间是独立运行且互不干扰的,有独立的运行空间,每个进程都有一个进程控制块;进程间通信:既然进程是独立运行,我们需要一种机制保证不同进程信息的交换,进程间通信主要包括:管道,IPC(共享内存,信号,消息队列),套接字;PCNTL扩展:PHP的一个进程扩展,主要用到pcntl_alarm()函数,详细介绍请查阅官网.

实现原理    

用一个三维数组保存所有需要执行的任务,一级索引为时间戳,值为执行任务的方法、回调参数等,具体数组形式如下:

如何使用纯PHP实现定时器任务(Timer)(php做)

这些任务可以是任意类的方法。既然是定时任务,我们需要一个类似计时的东东,此方案采用信号量去做,每一秒向当前进程发送SIGALRM信号,并捕获该信号,触发信号处理函数,循环遍历数据,判断是否有当前时间需要执行的任务。如果有则采用回调方式触发,并把参数传递给该方法。

  这是定时器类核心部分,有一个静态变量保存有所有需要执行的任务,这里为什么是静态的呢&#;大家自行思考.当进程接受到 SIGALRM 信号后,触发 signalHandler 函数,随后循序遍历数组查看是否有当前时间需要执行的任务,有则回调,并传递参数,删除当前job,随后检查是否要做持久化任务,是则继续将当前job写入事件数组等待下次触发,最后再为当前进程设置一个闹钟信号.可以看出这个定时器,只要触发一次就会从内部再次触发,得到自循环目的.

  

这是回调类及函数,为方便说明,加入不少调试信息.Timer类及回调都有了,我们看看使用场景是怎么样的.

代码非常短,这里注册了两个job,随后运行定时器,在一个无限循环里捕捉信号触发动作,如果不捕获将无法触发事先注册的处理函数.这样一个自循环的定时器开发完成.运行结果如下:

 Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_d3fedac.png" alt="查看图片" /> 

如我们场景类添加的任务一样,在的时候执行了两个任务,一个为持久化的不带参数的job,一个为非持久化带参数的job,随后非持久化job不再执行.

总结

1、在收到信号前,当前进程不能退出.这里我使用了条件永远为真的循环.在我们实际生产环境中,需要创造这么一个先决条件,比如说,我们有一组服务,这些服务都是一直运行的,不管是IO访问,等待socket链接等等,当前服务都不会终止,即使进程阻塞也不会有问题,这种场景,也就是有一个一直运行的服务中使用.2、目前PHP只支持以秒为单位的触发,不支持更小时间单位,对位定时任务而言基本足够

标签: php做

本文链接地址:https://www.jiuchutong.com/biancheng/284467.html 转载请保留说明!

上一篇:PHP内核探索:哈希表碰撞攻击原理(深入理解php内核)

下一篇:如何把php5.3版本升级到php5.4或者php5.5(php5升级到php7)

  • 企业所得税应纳税所得额怎么算
  • 监理公司成本核算方法
  • 会计工资标准
  • 普票也要盖发票专用章吗
  • 个人独资企业法人可以变更吗?
  • 测试费明细
  • 采购货款属于什么会计科目
  • 劳务派遣人员工资可以由用工单位发放么
  • 企业的哪些活动对企业有长期影响呢
  • 公司未开展业务就没有债权债务吗
  • 拆装厂房
  • 没收土地竞买保证金政策法律
  • 收到联营单位预收的发票
  • 白条确认收款后还能分期吗
  • 资本公积转增股本什么意思
  • 药店可以开具专票吗
  • 三证合一后章要换吗
  • 一个项目可以有几个单位工程
  • 企业所得税查账征收与核定征收的区别
  • 电子普通发票进什么科目
  • 建筑劳务公司开发票
  • 贴现率与再贴现率计算机行业是好多
  • 进项发票没有收到,销项已开出,成本如何结转
  • 失去胜诉权但又有起诉权是什么意思
  • 个人垫付汽车修理怎么办
  • 劳务公司如何确定收入
  • macqq截图快捷键 保存
  • 增发股票会计科目
  • php?ms=0&qgg=&_wv=3
  • 商场充值卡发票在哪开
  • yoosee怎么安装
  • macbookappstore未知错误
  • win10多任务分屏怎么关闭
  • 弗吉尼亚理工大学美国排名
  • 亚美尼亚格加尔德修道院
  • 【第二趴】uni-app开发工具(手把手带你安装HBuilderX、搭建第一个多端项目初体验)
  • php str
  • print函数php
  • 转让金融商品应交增值税计算公式
  • 利润表的本月数怎么算
  • 中标违约保证金怎么算
  • java printing
  • SQL Server 2000向SQL Server 2008 R2推送数据图文教程
  • 个税更改公司怎么操作
  • 在计算应纳税所得额时
  • 小微企业季度收入
  • 个体工商户开具房屋租赁发票
  • 车保险里面的车船税
  • 如何冲销应付账款
  • 零余额账户收到国税局退款
  • 登记账簿遇到的问题及解决
  • 企业比赛奖金要交税吗
  • 研发费用加计扣除2022政策
  • 预收账款过多,税务让说明原因
  • 购买电脑增值税税率是多少
  • 一般纳税人可抵扣的票证有哪些?
  • 外包会计注意事项
  • 房地产企业收到政府补助
  • sqlserver数据库恢复
  • CentOS 7.2下MySQL的安装与相关配置
  • mysql缓冲区
  • 设置动态壁纸来电铃声
  • mac苹果系统怎么用
  • linux系统中的用户大体可分为三组
  • 自己的磁盘
  • 从哪里看windows是多少位的
  • mstore.exe - mstore是什么进程 有什么用
  • win7系统耳机设置在哪里
  • 如何修改win7电脑用户密码
  • 关闭windows游戏
  • cocos2dx开发的游戏
  • 搞定immutable.js详细说明
  • 使用Python对SQLite数据库操作
  • 简单的横向棱纹魔杖
  • 查看项目层级结构怎么查
  • python接口编写
  • android存储方式
  • android中的常用布局有哪几种?
  • 地税局专管员
  • 文件清理规则
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设