位置: 编程技术 - 正文

详解PHP执行定时任务的实现思路(php 定时执行文件脚本)

编辑:rootadmin

推荐整理分享详解PHP执行定时任务的实现思路(php 定时执行文件脚本),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php计划任务定时执行,php 定时执行文件脚本,详解php执行定时指令,详解php执行定时操作,php 定时执行文件脚本,详解php执行定时指令,详解php执行定时操作,详解php执行定时函数,内容如对您有帮助,希望把文章链接给更多的朋友!

PHP本身是没有定时功能的,PHP也不能多线程。PHP的定时任务功能必须通过和其他工具结合才能实现,例如WordPress内置了wp-cron的功能,很厉害。

一、Linux服务器上使用CronTab定时执行php

我们先从相对比较复杂的服务器执行php谈起。服务器上安装了php,就可以执行php文件,无论是否安装了nginx或Apache这样的服务器环境软件。而Linux中,使用命令行,用CronTab来定时任务,又是绝佳的选择,而且也是效率最高的选择。

首先,进入命令行模式。作为服务器的linux一般都默认进入命令行模式的,当然,我们管理服务器也一般通过putty等工具远程连接到服务器,为了方便,我们用root用户登录。在命令行中键入:

之后就会打开一个文件,并且是非编辑状态,则是vi的编辑界面,通过敲键盘上的i,进入编辑模式,就可以编辑内容。这个文件中的每一行就是一个定时任务,我们新建一行,就是新建一条定时任务(当然是指这一行内按照一定的格式进行书写)。我们现在来举个例子,增加一行,内容如下:

这是什么意思呢?实际上上面这一行由两部分组成,前面一部分是时间,后面一部分是操作内容。例如上面这个,

* * * *就是指当当前时间的分钟数为时,执行该定时任务。时间部分由5个时间参数组成,分别是:

分 时 日 月 周第1列表示分钟1~ 每分钟用或者 */1表示,/n表示每n分钟,例如*/8就是每8分钟的意思,下面也是类推第2列表示小时1~(0表示0点)第3列表示日期1~第4列表示月份1~第5列标识号星期0~6(0表示星期天)

整个句子的后面部分就是操作的具体内容。

意思就是说通过lynx访问这个url。我们在使用中主要用到lynx、curl、wget来实现对url的远程访问,而如果要提高效率,直接用php去执行本地php文件是最佳选择,例如:

这条语句就可以在每2小时的0分钟,通过linux内部php环境执行script.php,注意,这里可不是通过url访问,通过服务器环境来执行哦,而是直接执行,因为绕过了服务器环境,所以效率当然要高很多。

好了,已经添加了几条需要的定时任务了吧。点击键盘上的Esc键,输入“:wq”回车,这样就保存了设置的定时任务,屏幕上也能看到提示创建了新的定时任务。接下来就是好好写你的script.php了。

关于CronTab的更多用法这里就不介绍了,如果你想更灵活的使用这个定时任务功能,应该自己再去深入学习一下crontab。

二、Windows服务器上使用bat定时执行php

windows上和linux上有一个类似的cmd和bat文件,bat文件类似于shell文件,执行这个bat文件,就相当于依次执行里面的命令(当然,还可以通过逻辑来实现编程),所以,我们可以利用bat命令文件在windows服务器上面实现PHP定时任务。实际上在windows上定时任务,和linux上道理是一样的,只不过方法和途径不同。好了下面开始。

首先,在一个你觉得比较适当的位置创建一个cron.bat文件,然后用文本编辑器打开它(记事本都可以),在里面写上这样的内容:

D:phpphp.exe -q D:websitetest.php这句话的意思就是,使用php.exe去执行test.php这个php文件,和上面的contab一样,绕过了服务器环境,执行效率也比较高。写好之后,点击保存,关闭编辑器。

详解PHP执行定时任务的实现思路(php 定时执行文件脚本)

接下来就是设置定时任务来运行cron.bat。依次打开:“开始?>控制面板?>任务计划?>添加任务计划”,在打开的界面中设置定时任务的时间、密码,通过选择,把cron.bat挂载进去。确定,这样一个定时任务就建立好了,在这个定时任务上右键,运行,这个定时任务就开始执行了,到点时,就会运行cron.bat处理,cron.bat再去执行php。

三、非自有服务器(虚拟主机)上实现php定时任务

如果站长没有自己的服务器,而是租用虚拟主机,就无法进入服务器系统进行上述操作。这个时候应该如何进行php定时任务呢?其实方法又有多个。

1、使用ignore_user_abort(true)和sleep死循环

在一个php文档的开头直接来一句:

这时,通过url访问这个php的时候,即使用户把浏览器关掉(断开连接),php也会在服务器上继续执行。利用这个特性,我们可以实现非常牛的功能,也就是通过它来实现定时任务的激活,激活之后就随便它自己怎么办了,实际上就有点类似于后台任务。

而sleep(n)则是指当程序执行到这里时,暂时不往下执行,而是休息n秒钟。如果你访问这个php,就会发现页面起码要加载n秒钟。实际上,这种长时间等待的行为是比较消耗资源的,不能大量使用。

那么定时任务到底怎么实现呢?使用下面的代码即可实现:

通过执行上面这段php代码,即可实现定时任务,直到你删除cron-switch文件,这个任务才会停止。

但是有一个问题,也就是如果用户直接访问这个php,实际上没有任何作用,页面也会停在这个地方,一直处于加载状态,有没有一种办法可以消除这种影响呢?fsockopen帮我们解决了这个问题。

fsockopen可以实现在请求访问某个文件时,不必获得返回结果就继续往下执行程序,这是和curl通常用法不一样的地方,我们在使用curl访问网页时,一定要等curl加载完网页后,才会执行curl后面的代码,虽然实际上curl也可以实现“非阻塞式”的请求,但是比fsockopen复杂的多,所以我们优先选择fsockopen,fsockopen可以在规定的时间内,比如1秒钟以内,完成对访问路径发出请求,完成之后就不管这个路径是否返回内容了,它的任务就到这里结束,可以继续往下执行程序了。利用这个特性,我们在正常的程序流中加入fsockopen,对上面我们创建的这个定时任务php的地址发出请求,即可让定时任务在后台执行。如果上面这个php的url地址是www.yourdomain.com/script.php,那么我们在编程中,可以这样:

把这段代码加入到某个定时任务提交结果程序中,在设置好时间后,提交,然后执行上面这个代码,就可以激活该定时任务,而且对于提交的这个用户而言,没有任何页面上的堵塞感。

2、借用用户的访问行为来执行某些延迟任务

但是上面使用sleep来实现定时任务,是效率很低的一种方案。我们希望不要使用这种方式来执行,这样的话就可以解决效率问题。我们借用用户访问行为来执行任务。用户对网站的访问其实是一个非常丰富的行为资源,包括搜索引擎蜘蛛对网站的访问,都可以算作这个类型。在用户访问网站时,内部加一个动作,去检查任务列表中是否存在没有被执行的任务,如果存在,就将这个任务执行。对于用户而言,利用上面所说的fsockopen,根本感觉不到自己的访问竟然还做出了这样的贡献。但是这种访问的缺点就是访问很不规律,比如你希望在凌晨2点执行某项任务,但是这个时间段非常倒霉,没有用户或任何行为到达你的网站,直到早上6点才有一个新访问。这就导致你原本打算2点执行的任务,到6点才被执行。

这里涉及到一个定时任务列表,也就是说你需要有一个列表来记录所有任务的时间、执行什么内容。一般来说,很多系统会采用数据库来记录这些任务列表,比如wordpress就是这样做的。我则利用文件读写特性,提供了托管在github上的开源项目php-cron,你可以去看看。总之,如果你想要管理多个定时任务,靠上面的单个php是无法合理布局的,必须想办法构建一个schedules列表。由于这里面的逻辑比较复杂,就不再详细阐述,我们仅停留在思路层面上。

3、借用第三方定时任务跳板

很好玩的是,一些服务商提供了各种类型的定时任务,例如阿里云的ACE提供了单独的定时任务,你可以填写自己应用下的某个uri。百度云BCE提供了服务器监测功能,每天会按照一定的时间规律访问应用下的固定uri。类似的第三方平台上还有很多定时任务可以用。你完全可以用这些第三方定时任务作为跳板,为你的网站定时任务服务。比如说,你可以在阿里云ACE上建立一个每天凌晨2点的定时任务,执行的uri是/cron.php。然后你创建一个cron.php,里面则采用fsockopen去访问你真正要执行某些任务的网站的url,例如上面的www.yourdomain.com/script.php,而且在cron.php中还可以访问多个url。然后把cron.php上传到你的ACE上面去,让ACE的定时任务去访问/cron.php,然后让cron.php去远程请求目标网站的定时任务脚本。

4、循环利用include包含文件(待验证)

php面向过程的特性使得其程序是从上往下执行的,利用这个特性,在我们使用include某个文件时,就会执行被引入的文件,知道include的文件内程序执行完之后,再往下执行。如果我们创建一个循环,再利用sleep,不断的include某个文件,使循环执行某段程序,则可以达到定时执行的目的。我们再进一步,并不是利用while(true)来实现循环,而是利用被include文件本身再include自身来实现循环,比如我们创建一个do.php,它的内容如下:

其实通过这种方法执行和while的思路也像。而且同样用到sleep,效率低。

PHP定时任务是一个非常有意思的东西,虽然说实话,用系统的php.exe去直接执行php文件的效率更高,但是对于很多普通站长而言,虚拟主机是无法做到直接php执行原生程序的。本文仅提供一些解决的思路,我也仅仅是在学习中,有很多问题或表述都不正确,希望你指出来;你可以通过本文的思路,开发出自己的一种解决方案。

标签: php 定时执行文件脚本

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

上一篇:PHP定时执行任务的3种方法详解(php实现定时任务)

下一篇:php阿拉伯数字转中文人民币大写(php将数字转为字符串)

  • 资金预算表编制依据
  • 集团内部借款利息收入增值税
  • 减免增值税申报表
  • 销售报废车辆按多少计提销项税额
  • 技术服务费属于现代服务吗
  • 增值税与普通发票的关系
  • 结转上年度的企业所得税会计分录?
  • 以前年度漏记一笔短期借款但本金利息支出记账了
  • 增值税普票收款人
  • 医疗器械销售税负率是多少
  • 小微企业需要开公户吗
  • 公司接受安全罚款的账务处理
  • 公司帐上欠了股东很多钱有何税务风险?
  • 股东认缴和实缴的会计分录
  • 工资中的话费补助是什么
  • 飞机票本身包含保险吗多少钱
  • 现金比率计算公式含义
  • 收到现金支票如何进账
  • 税金及附加审计说明怎么写
  • 长期待摊费用挂账原因
  • pruttct.exe - pruttct是什么进程 有什么用
  • 极易一键重装系统怎么用
  • 票据融资都有哪些方式
  • 计提税金会计分录怎么做
  • win7电脑软键盘怎么打开
  • 公益慈善事业捐赠个人所得税
  • 企业发生的间接费用应先在
  • 莱辛巴赫瀑布在瑞士哪里
  • 运费抵扣的基本原则
  • php 随机数
  • 人力资源外包可以去吗
  • PHP实现中国公民身份证号码有效性验证示例代码
  • vscode常用插件功能简介
  • php安装openssl扩展
  • gcm文件
  • vue虚拟domdiff算法
  • 货运代理约柜费怎么算
  • 消防工程材料费用占比
  • 费用在发生时确认而不考虑支付费用
  • 增值税普通发票有什么用
  • mysql基本sql语句大全(基础用语篇)
  • 银行账户管理的直接责任人是共享中心核算会计
  • 一个人失恋了该怎么安慰她
  • 个人所得税汇算清缴
  • sql server怎么升级版本
  • 出售无形资产科目
  • 业务招待费税务风险
  • 免征增值税政策的政策有哪些?
  • 差额征税指的是什么税种
  • 水电费的收据单怎么写
  • 附加税的计税依据是增值税实际缴纳税款吗
  • 待抵扣进项税额是什么情况下用的
  • 贷款服务可以抵扣进项税额吗
  • 损益平准金结转
  • 没有外币账户可以收外币吗
  • 五险一金的正确说法
  • 企业所得税税负率多少合适
  • centos6.9安装教程详细
  • sqlserver日志恢复数据
  • Vista下WMC不能播放RMVB解决办法
  • ubuntu调出命令行
  • ubuntu20.04怎么安装
  • win10下载英雄联盟运行没反应
  • Win10预览版拆弹
  • 怎么快速
  • qt for 安卓
  • sed 处理多行
  • shell脚本实例精讲
  • android ichart ColumnStacked2D图表无法显示解决方案
  • js入门基础教程
  • javascript数据转换
  • jquery 模态窗口
  • androidsdk的计算机
  • 农商银行股权分红如何计算
  • 福建税务总局电话
  • 税务局开展活动
  • 山东省水资源税征收标准
  • 率土之滨怎么提高建设值上限
  • 吉林省耕地面积有多少万亩
  • 企业所得税的税负率多少合适
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设