很多站长朋友们都不太清楚php中的timer,今天小编就来给大家整理php中的timer,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 PHP FPM源代码反刍品味之四:事件处理 2、 PHP怎么制作计时器 3、 PHP+MYSQL 实现队列 进行发送短信怎么做 4、 php格式化时间转换为多少天,小时,分钟,秒前 PHP FPM源代码反刍品味之四:事件处理FPM master 进程启动后,会进入函数fpm_event_loop,无限循环.
处理事件.
master 进程所做的的事,总的来说就是两类:
简称timer事件,需按时运行,主要有3个:
简称fd事件,需从文件句柄(file descriptor)读取到指令后,依指令运行.
重复一下,unix 下一切IO, 皆文件,socket ,socketpair,pipe 都返回文件句柄(fd) 用于通信.
主要的fd有:
对于timer事件,多个事件在事件轴上是依次排列的,只需反复检查,到时运行.
对于fd事件,需监听多个fd,需用到我们第二篇讲的IO多路复用技术.
如果满足事件条件,则处理事件内容.
FPM设计上,两类事件使用同一个结构,并且事件触发条件和事件处理逻辑放到同一个事件对象里(C语言对象就是结构体).
举个例子, 打铃下课,打铃是触发条件,下课是事件内容,两个同时放到一个事件对象 ,这是一个很好的设计.
fd值: -1
flags值:FPM_EV_PERSIST
which值: FPM_EV_TIMEOUT
fd值: 获取触发指令的文件fd
flags值: FPM_EV_EDGE(fd事件底层的边缘触发标志,需系统支持)
which值: FPM_EV_READ
两类事件分别放在两个事件队列
static struct fpm_event_queue_s *fpm_event_queue_timer = NULL;
static struct fpm_event_queue_s *fpm_event_queue_fd = NULL;
事件队列的结构很常见,双向队列:
typedef struct fpm_event_queue_s {
struct fpm_event_queue_s *prev;
struct fpm_event_queue_s *next;
struct fpm_event_s *ev;
} fpm_event_queue;
4移除事件 (fpm_event_del -> fpm_event_queue_del)
简单的出列操作:
static int fpm_event_queue_del(struct fpm_event_queue_s **queue, struct fpm_event_s *ev)
对于fd事件,需在底层事件轮询机制里移除(如:epoll)
5,运行事件回调函数:
6, 底层事件轮询模块结构
不同的操作系统,支持不同的IO事件机制,linux 支持epoll,
windows支持select, freebsd 支持kqueue,这个结构统一操作接口
在函数fpm_event_init_main里 调用module->init初始化
fpm 里对应的配置
master进程在fpm_event_loop函数里无限循环,处理定时任务和fd事件.
期间会在module->wait阻塞片刻,对于epoll机制,就是epoll_wait.
PHP怎么制作计时器计时器的运用在网页制作中很普遍,其实计时器有很多做法,PHP加JS、JS加AJAX也可以控制实现。不是PHP可以单独实现的,因为PHP是实现服务端的语言,没有办法去控制。以下实例就是制作计时器的代码:
<SCRIPT language=JAVASCRIPT>
var timerID = null;
var timerRunning = false;
function stopclock()
{
if(timerRunning)
clearTimeout(timerID);
timerRunning = false;
}
function startclock()
{
stopclock();
showtime();
}
function showtime()
{
var now = new Date();
var hours = now.getHours();
var minutes = now.getMinutes();
var seconds = now.getSeconds()
var timeValue = "" +hours;
//定时初始化数据库的代码:
timeValue += ((minutes < 10) ? ":0" : ":") + minutes
timeValue += ((seconds < 10) ? ":0" : ":") + seconds
document.Calc.time.value = timeValue;
// you could replace the above with this
// and have a clock on the status bar:
// window.status = timeValue;
timerID = setTimeout("showtime()",1000);
timerRunning = true;
return '';
}</script>
客服端PHP+HTML代码:
<html>
< head>
< META HTTP-EQUIV="Refresh" Content="1;URL=test.php">
< /head>
< body>
< ?
echo date("Y年m月d日 H时i分s秒");
?>
</body>
</html>
PHP+MYSQL 实现队列 进行发送短信怎么做最近遇到一个批量发送短信的需求,短信接口是第三方提供的。刚开始想到,获取到手机号之后,循环调用接口发送不就可以了吗?
但很快发现问题:当短信数量很大时,不仅耗时,而且成功率很低。
于是想到,用PHP和MySQL实现一个消息队列,一条一条的发送短信。下面介绍具体的实现方法:
首先,建立一个数据表sms,包含以下字段:
id,
phone, //手机号
content //短信内容
将需要发送的短信和手机号存入sms表中。
接下来,需要用PHP实现一个定时器,定时读取一条记录,并发送短信:
<?php
$db = new Db();
$sms = new Sms();
while(true){
$item = $db->getFirstRecord(); //获取数据表第一条记录
if(!$item){
//如果队列中没有数据,则结束定时器
break;
}
$res = $sms->send($item['phone'],$item['content']); //发送短信
if($res){
$db->deleteFristRecord(); //删除发送成功的记录
echo $item['phone'].'发送成功';
}else{
echo $item['phone'].'发送失败,稍后继续尝试';
}
sleep(10); //每隔十秒循环一次
}
echo '发送完毕!';
?>
将代码保存为timer_sms.php,打开命令行,执行定时器:
php timer_sms.php
好了,php定时器将会根据设定的时间间隔(这里设的是10秒),自动完成发送短信的任务。任务完成后将自动退出定时器,不再占用服务器资源。
根据我的测试,PHP定时器占用资源并不多,不会对服务器造成压力。而且是异步访问数据库,也不会影响数据库的运行。
这种方式的优点是:
1、后台运行,前台无需等待
2、成功率高,失败的记录会自动重发,直到成功
php格式化时间转换为多少天,小时,分钟,秒前<?php
function mytime($date)
{
$str = '';
$timer = strtotime($date);
$diff = $_SERVER['REQUEST_TIME'] - $timer;
$day = floor($diff / 86400);
$free = $diff % 86400;
if($day > 0)
{
return $day."天前";
}
else
{
if($free>0)
{
$hour = floor($free / 3600);
$free = $free % 3600;
if($hour>0)
{
return $hour."小时前";
}
else
{
if($free>0)
{
$min = floor($free / 60);
$free = $free % 60;
if($min>0)
{
return $min."分钟前";
}
else
{
if($free>0)
{
return $free."秒前";
}
else
{
return '刚刚';
}
}
}
else
{
return '刚刚';
}
}
}
else
{
return '刚刚';
}
}
}
echo mytime("2017-1-18 10:22:01");
?>
关于php中的timer的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。
查看更多关于php中的timer php中的两种跳转语句以及各自的特点的详细内容...