详解PHP设置定时任务的实现方法

一、总结

一句话总结:

1、ignore_user_abort(true)是什么意思?

无论客户端是否关闭浏览器,下面的代码都将得到执行

2、set_time_limit(0)是什么意思?

脚本执行没有时间方面的限制,也就是可以一直执行,默认php脚本最大执行30秒。

二、详解PHP设置定时任务的实现方法

定时运行任务对于一个网站来说,是一个比较重要的任务,比如定时发布文档,定时清理垃圾信息等,现在的网站大多数都是采用PHP动态语言开发的,而对于PHP的实现决定了它没有Java和.Net这种AppServer的概念,而http协议是一个无状态的协议,PHP只能被用户触发,被调用,调用后会自动退出内存,没有常驻内存。

如果非要PHP去设置定时任务, 可以有以下三个方法:

1、用户触发定时

通过挂载到网页里面,判断当前的时间,然后运行PHP代码,缺点是每一次加载网页,都需要加载这个PHP页面,而对于人气不旺的网站,这样的延时可能会更加的严重,毕竟是用户的HTTP请求去触发这个PHP代码的运行,Discuz!论坛程序是判断在00:00之后,第一个用户访问请求去执行定时的PHP代码。

2、常驻内存运行

PHP是可以常驻内存运行程序的,下面的这段代码,可以在当前文件夹下,生成一个test.txt,并每隔20秒,往里面写入一个时间戳,无论客户端是否关闭浏览器。

<?php
ignore_user_abort(true);
set_time_limit(0);
function write_txt(){
if(!file_exists("test.txt")){
$fp = fopen("test.txt","wb");
fclose($fp);
}
$str = file_get_contents(’test.txt’);
$str .= "\r\n".date("H:i:s");
$fp = fopen("test.txt","wb");
fwrite($fp,$str);
fclose($fp);
}
function do_cron(){
usleep(20000000);
write_txt();
}
while(1){
do_cron();
}
?>

关键的两个函数

ignore_user_abort(true),这个函数的作用是,无论客户端是否关闭浏览器,下面的代码都将得到执行。

set_time_limit(0),这个函数的作用是,取消PHP文件的执行时间,如果没有这个函数的话,默认PHP的执行时间是30秒,也就是说30秒后,这个文件就会从内存中删除。

另外usleep函数是在PHP5.0后的版本中加入的函数,支持Windows操作系统,设置代码运行的时间,单位是毫秒(MS)。

如何停止定时

但是当我执行脚本的时候,即使我关闭了浏览器,我根本就没法去停止这段程序了,所以你需要一个执行脚本的开关,你可以用外部文件引入的方法来实现,在while循环的时候,include开关变量即可。那么就可以这样实现:

建立外部引入变量文件 switch.php 内容如下:

<?php
return 1;//1执行脚本 0退出执行脚本
?>

这个脚本只是测试可行,具体效率应该不高,对于lamp,你完全可以使用crontab 来实现。

3、服务器定时任务

服务器定时任务需要你是独立的服务器,或者是VPS,总之就是对系统的配置有足够的权限,虚拟空间就不要折腾这个方法了,因为你没有权限。

Windows平台

在 Windows 平台下您可以将cli\php.exe 和 .php 文件的双击属性相关联,您也可以编写一个批处理文件来用 PHP 执行脚本。我们把写好的程序放在一个目录下如 E:\web\mail.php

然后写一个windows批处理文件内容如下:

@D:\php\cli\php.exe E:\web\mail.php >d:\php\cli\sendmail.log
Pause

那个 D:\php\cli\php.exe 是我的PHP安装文件所在目录。Php.exe 就是windows PHP命令行模式的程序。

好的,我们保存这个文件为 mail.bat 然后的windows中的计划任务中添加一个任务,让操作系统在某个时间来运行这个批处理文件。

Unix平台

如果您使用 Unix 系统,您需要在您的 PHP 脚本的最前面加上一行特殊的代码,使得它能够被执行,这样系统就能知道用什么样的程序要运行该脚本。为 Unix 系统增加的第一行代码不会影响该脚本在 Windows 下的运行,因此您也可以用该方法编写跨平台的脚本程序。

在Crontab中使用PHP执行脚本

就像在Crontab中调用普通的shell脚本一样(具体Crontab用法),使用PHP程序来调用PHP脚本,每一小时执行 myscript.php 如下:

# crontab -e
00 * * * * /usr/local/bin/php /home/john/myscript.php

/usr/local/bin/php为PHP程序的路径。

在Crontab中使用URL执行脚本

如果你的PHP脚本可以通过URL触发,你可以使用 lynxcurlwget 来配置你的Crontab。

下面的例子是使用Lynx文本浏览器访问URL来每小时执行PHP脚本。Lynx文本浏览器默认使用对话方式打开URL。但是,像下面的,我们在lynx命令行中使用-dump选项来把URL的输出转换来标准输出。

00 * * * * lynx -dump http://www.uedsc.net/myscript.php

下面的例子是使用 CURL 访问URL来每5分执行PHP脚本。Curl默认在标准输出显示输出。使用 "curl -o" 选项,你也可以把脚本的输出转储到临时文件。

*/5 * * * * /usr/bin/curl -o temp.txt http://www.uedsc.net/myscript.php

下面的例子是使用WGET访问URL来每10分执行PHP脚本。-q 选项表示安静模式。"-O temp.txt" 表示输出会发送到临时文件。

*/10 * * * * /usr/bin/wget -q -O temp.txt http://www.uedsc.net/myscript.php
 
 

详解PHP设置定时任务的实现方法的更多相关文章

  1. MySQL关闭过程详解和安全关闭MySQL的方法

    MySQL关闭过程详解和安全关闭MySQL的方法 www.hongkevip.com 时间: -- : 阅读: 整理: 红客VIP 分享到: 红客VIP(http://www.hongkevip.co ...

  2. NPOI2.2.0.0实例详解(十)—设置EXCEL单元格【文本格式】 NPOI 单元格 格式设为文本 HSSFDataFormat

    NPOI2.2.0.0实例详解(十)—设置EXCEL单元格[文本格式] 2015年12月10日 09:55:17 阅读数:3150 using System; using System.Collect ...

  3. 详解Webwork中Action 调用的方法

    详解Webwork中Action 调用的方法 从三方面介绍webwork action调用相关知识: 1.Webwork 获取和包装 web 参数 2.这部分框架类关系 3.DefaultAction ...

  4. Linux服务器,服务管理--systemctl命令详解,设置开机自启动

    Linux服务器,服务管理--systemctl命令详解,设置开机自启动 syetemclt就是service和chkconfig这两个命令的整合,在CentOS 7就开始被使用了. 摘要: syst ...

  5. 详解PHP实现定时任务的五种方法

    这几天需要用PHP写一个定时抓取网页的服务器应用. 在网上搜了一下解决办法, 找到几种解决办法,现总结如下. 定时运行任务对于一个网站来说,是一个比较重要的任务,比如定时发布文档,定时清理垃圾信息等, ...

  6. postman接口自动化,环境变量的用法详解(附postman常用的方法)

    在实现接口自动测试的时候,会经常遇到接口参数依赖的问题,例如调取登录接口的时候,需要先获取登录的key值,而每次请求返回的key值又是不一样的,那么这种情况下,要实现接口的自动化,就要用到postma ...

  7. 详解PHP执行定时任务的实现思路

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

  8. 详解JavaScript中的arc的方法

    今天说说JavaScript在网页中画圆的函数arc! 一.arc所需要的参数设置 1 arc(x, y, radius, startAngle, endAngle, counterclockwise ...

  9. 详解Java中的Object.getClass()方法

    详解Object.getClass()方法,这个方法的返回值是Class类型,Class c = obj.getClass(); 通过对象c,我们可以获取该对象的所有成员方法,每个成员方法都是一个Me ...

随机推荐

  1. 今天发现里一个非常好用的Listbox自绘类,带不同文字字体和图片,觉得很有必要记下来

    代码简写 MyListBox.h class CUseListBox : public CListBox { typedef struct _ListBox_Data { CString strApp ...

  2. 洛谷 P1104 生日

    P1104 生日 题目描述 cjf君想调查学校OI组每个同学的生日,并按照从大到小的顺序排序.但cjf君最近作业很多,没有时间,所以请你帮她排序. 输入输出格式 输入格式: 有2行, 第1行为OI组总 ...

  3. Objc执行时读取和写入plist文件遇到的问题

    以下是本猫保持游戏NPC和物件交互的plist文件: 随着游戏和玩家逐步发生互动,玩家会改动人物和物件的交互的状态.这也是RPG游戏最主要的功能. 在切换每一个地图时须要将上一个地图发生的改变存储到p ...

  4. PDF.Js的使用—javascript中前端显示pdf文件

    PDF.Js的使用—javascript中前端显示pdf文件 写于2018/12/6 起因是一个图片展示页面需要展示pdf格式的文件,所以查了半天决定使用pdf.js,我也不求有多了解它,能实现我想要 ...

  5. 1. vue环境搭建和配置

      const 相对于 var # 全局安装 vue-cli install可以简写成i 1.$ npm install --global vue-cli # 创建一个基于 webpack 模板的新项 ...

  6. ThinkPHP5.0---URL访问

    ThinkPHP 5.0 在没有启用路由的情况下典型的URL访问规则是(采用 PATH_INFO 访问地址): http://serverName/index.php(或者其它应用入口文件)/模块/控 ...

  7. [D3] Animate Transitions in D3 v4

    D3 makes it easy to add meaningful animations to your data visualizations. Whether it’s fading in ne ...

  8. Angular7环境搭建报错

    昨天写的2019年Angular7——安装搭建路由方法不太正统,今天又去翻了下angular官网,跟着上面的环境搭建与部署走了一遍 从安装@angular/cli命令行工具开始 本篇主要记录下搭建过程 ...

  9. php 如何写一个自己项目的安装程序

    版权声明:此篇文章只是用作笔记,如果版权冲突,请邮件通知一下(15201155501@163.com) https://blog.csdn.net/shenpengchao/article/detai ...

  10. 初识Visual Studio Code 一.使用Visual Studio Code 开发C# 控制台程序

    原文:初识Visual Studio Code 一.使用Visual Studio Code 开发C# 控制台程序 1. 安装.NET Core 安装包下载地址:https://www.microso ...