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

发布于 2018-11-06 字数4366 浏览 683 评论 0

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

用户触发定时

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

常驻内存运行

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

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 操作系统,暂停代码执行一定时间,单位是微秒,即百万分之一秒。

如何停止定时

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

return 1; // 1 执行脚本,0 退出执行脚本

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

服务器定时任务

服务器定时任务需要你是独立的服务器,或者是 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 脚本一样,使用 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

如果你对这篇文章有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助。

扫码二维码加入Web技术交流群

您暂时不能评论!

管理员开启了需要登录才能够评论,你可以免费注册一个本站的账号。

还没有评论!

目前还没有任何评论,快来抢沙发吧!