PHP 毫秒级定时器,实现php毫秒定时器方法详解
描述
PHP编程语言是一种快速、简洁的服务端脚本编程语言,可以制作强大的交互性展现。在编程界PHP是完全免费的语言,在程序员身上使用非常的广泛,在编程中是大家高效的选择。
PHP能实现的功能
1.可以快速的生成动态网站页面内容,方便快捷。
2.可以在网站端实现对服务器上的文件管理,例如对文件的:创建、打开、读取、写入、关闭。
3.手机html中的表单数据,实现交互性。
4.方便、简单的可以发送和接收 cookies数据。
5.链接MySQL数据库之后,可以对数据库的数据进行可以对数据库中的数据,进行增、删、查、改等功能
6.方便的对隐私数据进行加密,限制某些用户访问网站上的资源。
实现php毫秒定时器
PHP 小程序,功能为每30秒记录时间,写入到文件
代码如下
# vi for_ever.php
#! /usr/local/php/bin/php
define(‘ROOT’, dirname(__FILE__)。‘/’);
set_time_limit(0);
while (true) {
file_put_contents(ROOT.‘for_ever.txt’, date(‘Y-m-d H:i:s’)。“\n”, FILE_APPEND);
echo date(‘Y-m-d H:i:s’), ‘ OK!’;
sleep(30);
}
?>
保存退出,然后赋予 for_ever.php 文件可执行权限:
# chmod +x for_ever.php
让它在再后台执行:
# nohup /home/andy/for_ever.php.php &
记得最后加上 & 符号,这样才能够跑到后台去运行
执行上述命令后出现如下提示:
[1] 5157
nohup: appending output to ‘nohup.out’
所有命令执行输出信息都会放到 nohup.out 文件中
这时你可以打开 for_ever.php 同目录下的 for_ever.txt 和 nohup.out 看看效果!
好了,它会永远运行下去了,怎么结束它呢?
# ps
PID TTY TIME CMD
4247 pts/1 00:00:00 bash
5157 pts/1 00:00:00 for_ever.php
5265 pts/1 00:00:00 ps
# kill -9 5157
找到进程号 5157 杀之,你将看到
[1]+ Killed nohup /home/andy/for_ever.php
OK!
=========================================================================
在很多项目中,或许有很多类似的后端脚本需要通过crontab定时执行。比如每10秒检查一下用户状态。脚本如下:
@file: /php_scripts/scan_userstatus.php
代码如下:
#!/usr/bin/env php -q
$status = has_goaway();
if ($status) {
//done
}
?>
通过crontab定时执行脚本scan_userstatus.php
#echo “*:*/10 * * * * /php_scripts/scan_userstatus.php”
这样,每隔10秒钟,就会执行该脚本。
我们发现,在短时间内,该脚本的内存资源还没有释放完,又启用了新的脚本。也就是说:新脚本启动了,旧脚本占用的资源还没有如愿释放。如此,日积月累,浪费了很多内存资源。我们对这个脚本进行了一下改进,改进后如下:
@file: /php_scripts/scan_userstatus.php
代码如下:
#/usr/bin/env php -q
while (1) {
$status = has_goaway();
if ($status) {
//done
}
usleep(10000000);
}
?>
这样,不需要crontab了。可以通过以下命令执行脚本,达到相同的功能效果
#chmod +x /php_scripts/scan_userstatus.php
#nohup /php_scripts/scan_userstatus.php &
在这里,我们通过&将脚本放到后台运行,为了防止随着终端会话窗口关闭进程被杀,我们使用了nohup命令。那么有没有办法,不使nohup命令,也能够运行呢,就像Unin/Linux Daemon一样。接下来,就是我们要讲的守护进程函数。
什么是守护进程?一个守护进程通常补认为是一个不对终端进行控制的后台任务。它有三个很显著的特征:在后台运行,与启动他的进程脱离,无须控制终端。常用的实现方式是fork() -> setsid() -> fork() 详细如下:
@file: /php_scripts/scan_userstatus.php
代码如下:
#/usr/bin/env php -q
daemonize();
while (1) {
$status = has_goaway();
if ($status) {
//done
}
usleep(10000000);
}
function daemonize() {
$pid = pcntl_fork();
if ($pid === -1 ) {
return FALSE;
} else if ($pid) {
usleep(500);
exit(); //exit parent
}
chdir(“/”);
umask(0);
$sid = posix_setsid();
if (!$sid) {
return FALSE;
}
$pid = pcntl_fork();
if ($pid === -1) {
return FALSE;
} else if ($pid) {
usleep(500);
exit(0);
}
if (defined(‘STDIN’)) {
fclose(STDIN);
}
if (defined(‘STDOUT’)){
fclose(STDOUT);
}
if (defined(‘STDERR’)) {
fclose(STDERR);
}
}
?>
实现了守护进程函数以后,则可以建立一个常驻进程,所以只需要执行一次:
#/php_scripts/scan_userstatus.php
这里较为关键的二个php函数是pcntl_fork()和posix_setsid()。fork()一个进程,则表示创建了一个运行进程的副本,副本被认为是子进程,而原始进程被认为是父进程。当fork()运行之后,则可以脱离启动他的进程与终端控制等,也意味着父进程可以自由退出。 pcntl_fork()返回值,-1表示执行失败,0表示在子进程中,而返进程ID号,则表示在父进程中。在这里,退出父进程。setsid(),它首先使新进程成为一个新会话的“领导者”,最后使该进程不再控制终端,这也是成为守护进程最关键的一步,这意味着,不会随着终端关闭而强制退出进程。对于一个不会被中断的常驻进程来说,这是很关键的一步。进行最后一次fork(),这一步不是必须的,但通常都这么做,它最大的意义是防止获得控制终端。(在直接打开一个终端设备,而且没有使用O_NOCTTY标志的情况下, 会获得控制终端)。
其它事项说明:
1) chdir() 将守护进程放到总是存在的目录中,另外一个好处是,你的常驻进程不会限制你umount一个文件系统。
2)umask() 设置文件模式,创建掩码到最大的允许限度。如果一个守护进程需要创建具有可读,可写权限的文件,一个被继承的具有更严格权限的掩码会有反作用。
3)fclose(STDIN), fclose(STDOUT), fclose(STDERR) 关闭标准I/O流。注意,如果有输出(echo),则守护进程会失败。所以通常将STDIN, STDOUT, STDERR重定向某个指定文件。
====================================
#!/bin/bash
PHP=/opt/php/bin/php
CMD_DIR=/data/yii2-angularjs
cd $CMD_DIR
while :; do
$PHP yii user/add-user
echo “$PHP yii user/add-user”
sleep 1
done
done
done
====================================
打开APP精彩内容
点击阅读全文
PHP 毫秒级定时器,实现php毫秒定时器方法详解相关推荐
- c语言 定时器作用,单片机定时器的作用及使用方法详解
单片机定时器的作用及使用方法详解 单片机定时器在单片机的功能是很重要的,它一般被用作定时功能,来做定时检测.定时响应和定时控制,并且可以产生毫秒宽的脉冲信号来驱动步进电机.计时和计数的最终功能是通过计 ...
- java定时执行bat_windows定时器配置执行java jar文件的方法详解
##创建测试类 新建Java工程创建测试类如下代码:(创建文件验证定时器是否执行) package makeFile; import java.io.File; import java.io.IOEx ...
- Unified Functional Testing(UFT)15.0.2入门保姆级教程(一),图文详解。QTP
UFT入门之侦测器(ObjectSpy)及录制第一个脚本 实验说明 1.Quick Test Pro(QTP)11.5后更名为Unified Functional Testing(UFT) 2. 实验 ...
- 计算机游戏 25攻略,我的咖啡厅25级攻略大全及游戏技巧详解
我的咖啡厅这款游戏相信大家都听说过了.游戏里面的体验非常的好.很真实,有一种身临其境的感觉.今天小编给大家带来的就是我的咖啡厅25级攻略大全,希望对大家有所帮助. 首先,先进入房间 ,上二楼 ,查看窗 ...
- vue 子级拿值_vue 父组件通过$refs获取子组件的值和方法详解
前言 在vue项目中组件之间的通讯是很常见的问题,同时也是很重要的问题,我们大致可以将其分为三种情况: 父传子:在父组件中绑定值,在子组件中用props接收 子传父:在父组件中监听一个事件,在子组件中 ...
- 爬虫神级解析工具之XPath:用法详解及实战
一.XPATH是什么 Xpath最初被设计用来搜寻XML文档,但它同样适用于HTML文档的搜索.通过简洁明了的路径选择表达式,它提供了强大的选择功能:同时得益于其内置的丰富的函数,它可以匹配和处理字符 ...
- 保姆级 Git 入门教程,10000 字详解
转载来自:杰哥的IT之旅 前言 Git简介 实用主义 深入探索 总结 参考资料 Git简介 Git 是一种分布式版本控制系统,它可以不受网络连接的限制,加上其它众多优点,目前已经成为程序开发人员做项目 ...
- SD-RTN——毫秒级网络加速带来全新的体验
近几年网络直播视频.VR/AR.竞技游戏.大数据.4K高清视频的快速增长,正在将毫秒级网络加速技术推向历史发展的潮头.用户的预期越来越高,他们期待"最好"的在线体验,网络延迟会直接 ...
- Timer定时器详解
Timer定时器主要做定时任务或者按照一定的时间间隔做任务,例如每天4点钟定时执行作业等 Timer的特性 1.它属于单线程的,每创建个Timer实例,就会创建一个新线程 2.Timer默认情况下不是 ...
最新文章
- spring boot集成mybatis
- [BZOJ5303] [HAOI2018] 反色游戏
- Bzoj1051 受欢迎的牛
- python右斜杠_Python中的左斜杠、右斜杠(正斜杠和反斜杠)
- Verilog语言实现并行(循环冗余码)CRC校验
- lisp正负调换_lisp中如何把符号转换为字符串
- 点云平面提取_基于LiDAR点云数据滤波方法
- Thinkphp3.2整合微信支付
- iptables官方文档
- 关于一些信息学数论问题例题的讨论
- SQL2008 行锁使用RowLock
- android不是16位,16位图像和Android处理
- JS动态加载JSON文件并读取数据
- qt.qpa.xcb: could not connect to display解决
- 哈佛幸福课个人使用精华
- C++计算某天是该年的第几天
- ASP.NET类计算机专业毕业设计题目选题课题
- 如何为IT部门制定更好的战略计划
- AlertManager告警的单独使用及prometheus配置告警规则使用
- 如何识别媒体偏见_超越偏见:为什么我们不能仅仅“修正”面部识别
热门文章
- 个性化排序的神经协同过滤
- 分布式深度学习DDL解析
- Java/Android 调用类里面的方法
- App is not indexable by Google Search; consider adding at least one Activity with an ACTION-VIEW int
- JDBC学习DayTwo
- CSS3---6.文字阴影
- 集群分发脚本xsync
- 2022-2028年中国消防报警行业市场前瞻与投资战略规划分析报告
- Linux下安装数据库
- 最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr...