文档章节

PHP 每隔几秒执行一次

lixiaokai2008
 lixiaokai2008
发布于 2016/09/11 15:09
字数 538
阅读 125
收藏 3
PHP

背景是这样的:我需要一段PHP代码去定期对数据库操作,并把结果保存起来。如果方法是用户请求的时候来触发执行这个代码,显然用户的响应时间变长,影响用户体验!如果利用操作系统的定时任务,执行频率也是非常高的。

下面写个简单例子来讲解这个方法。

<?php
ignore_user_abort();//关闭浏览器仍然执行
set_time_limit(0);//让程序一直执行下去
$interval=3;//每隔一定时间运行
do{
    $msg=date("Y-m-d H:i:s");
    file_put_contents("log.log",$msg,FILE_APPEND);//记录日志
    sleep($interval);//等待时间,进行下一次操作。
}while(true);
?>

需要说明的是:程序没有写结束判断语句,他会无限循环下去。当然如果想停止的话,可以重启apache,重启后就无效了。想再次进行定时执行,那么把这段代码再一次运行。

上面简单例子可以说明这个原理。 那么针对上面的例子,我可以进行一下改良方案。

你需要一个执行脚本的开关,你可以用外部文件引入的方法来实现,在while循环的时候,include开关变量即可。那么就可以这样实现: 建立外部引入变量文件 switch.php 内容如下:

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

改良脚本如下:

<?php
    ignore_user_abort();//关闭浏览器后,继续执行php代码
    set_time_limit(0);//程序执行时间无限制
    $sleep_time = 5;//多长时间执行一次
    $switch = include 'switch.php';
    while($switch){
        $switch = include 'switch.php';
        $msg=date("Y-m-d H:i:s").$switch;
            file_put_contents("log.log",$msg,FILE_APPEND);//记录日志
        sleep($sleep_time);//等待时间,进行下一次操作。
    }
    exit();
?>

当然我们也可以使用系统的定时执行php脚本了,下面看个linux的例子。 在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程序的路径。

本文转载自:http://www.blhere.com/966.html

共有 人打赏支持
lixiaokai2008
粉丝 14
博文 100
码字总数 20933
作品 0
中山
私信 提问
php定时执行脚本的问题

我想实现的是定时发送消息,PHP 除了可以在命令行里添加定时任务执行脚本外,还有什么比较好的方法。 每隔几秒刷新一次,判断当前时间是否需要发送消息这样的方式觉得有点不恰当。

姚善良
2014/06/02
356
8
Spring 定时器使用

1、spring的配置文件 2、基于xml的定时器任务 3、基于注解的定时器任务 4、测试 说明: 1)Cron表达式的格式:秒 分 时 日 月 周 年(可选) 字段名 允许的值 允许的特殊字符 秒 0-59 , - * /...

满小茂
2015/12/30
451
0
如何让Linux定时任务crond以秒为单位执行(如每隔3秒)

如何让Linux定时任务crond以秒为单位执行(如每隔3秒) 需要用到Shell脚本每隔3秒钟去监控一个软件进程的运行状态,发现crond似乎只支持到分,不知道秒,怎么办呢? 第一种方法: 当然首先想到...

蜗牛奔跑
2015/10/28
0
0
计划任务 crontab、at

crontab使用方法:   command 分 时 日 月 周 命令第1列表示分钟1~59 (每分钟用或者 /1表示,*/5 代表每5分钟)第2列表示小时1~23(0表示0点)第3列表示日期1~31第4列表示月份1~...

以谁为师
03/05
0
0
javascript setTimeout 和 setInterval 区别

setTimeout()方法是在等待指定时间后执行函数, 且只执行一次传入的句柄函数. setInterval()方法是每指定间隔时间后执行一次传入的句柄函数,循环执行直至关闭窗口或clearInterval(). [setTime...

李长春
2012/11/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JDK 12又来了,我学不动了...

写在前面 看到 JDK 12又发布了,萌新不知不觉感觉瑟瑟发抖,从 Java 1.8的函数式编程思维和范式 到 Java 1.9的模块化特性的加持 以及还没来得及深切感受一下 Java 1.11 的 ZGC强大之后,这次...

CodeSheep
58分钟前
12
0
解决在gradle构建project时,发生peer not authenticated错误的方法

问题: FAILURE: Build failed with an exception.* What went wrong:Could not resolve all dependencies for configuration ':wl01-service:compile'.> Could not resolve com.ali......

Benz001
今天
2
0
Apache Ignite上的TensorFlow

任何深度学习都是从数据开始的,这是关键点。没有数据,就无法训练模型,也无法评估模型质量,更无法做出预测,因此,数据源非常重要。在做研究、构建新的神经网络架构、以及做实验时,会习惯...

李玉珏
今天
19
0
Java记录日志附带请求标识

起因 系统是web接口服务,排查故障的时候经常需要记录某次请求调用链路日志。这样我们拉日志的时候只要匹配这个traceid就行了 第一版解决方案 原来我们一直用了个很low的办法,在请求开始的时...

Tree
今天
4
0
使用split_size优化的ODPS SQL的场景

使用split_size优化的ODPS SQL的场景 首先有两个大背景需要说明如下: 说明1:split_size,设定一个map的最大数据输入量,单位M,默认256M。用户可以通过控制这个变量,从而达到对map端输入的...

阿里云官方博客
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部