php 一秒操作一次_php守护进程 加linux命令nohup实现任务每秒执行一次
Unix中 nohup 命令功能就是不挂断地运行命令,同时 nohup 把程序的所有输出到放到当前目录 nohup.out 文件中,如果文件不可写,则放到 /nohup.out 文件中。那么有了这个命令以后我们php就写成shell 脚本使用循环来让我们脚本一直运行下去,不管我们终端窗口是否关闭都能够让我们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重定向某个指定文件.
php 一秒操作一次_php守护进程 加linux命令nohup实现任务每秒执行一次相关推荐
- linux守护进程、SIGHUP与nohup详解
前端时间帮忙定位个问题.docker容器故障恢复后,其中的keepalived进程始终无法启动,也看不到Keepalived的日志. strace 查看系统调用之后,发现了原因所在 1 socket( ...
- linux守护进程编程,Linux守护进程的编程实现
Linux 守护进程的编程方法 守护进程(Daemon)是执行在后台的一种特殊进程.它独立于控制终端而且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种非常实用的进程.Linux的大多数s ...
- linux守护进程fifo,linux守护进程配置文件
syslogd 是一种守护进程,它负责记录(写到磁盘)从其它程序发送到系统的消息.这个服务尤其常被某些守护进程所使用,这些守护进程不会有另外的方法来发出可能有问题存在的信号或向用户发送消息. 1.文件 ...
- 打开服务器网页要5秒,网页优化技巧 如何把网页加载时间控制在1.5秒以内
今天为大家分享"如何把网页加载时间控制在1.5秒以内(必看)"当然了,控制在2秒以内其实是完全可以的,我们为什么要控制页面打开速度那?首先百度会对加载慢的页面进行打击,对SEO排名 ...
- Linux——1、守护进程、SIGHUP与nohup
一.守护进程 脱离于终端并且在后台运行的进程,用于长期运行,守护自己的职责(如:监听端口.服务等). 1.特点: 不受用户登录.注销影响.大多数Linux下的服务器都是利用守护进程实现的,如MySQL ...
- linux 守护进程 失败,Linux守护进程
来自http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16 以下是成为守护程序的步骤: fork(),以便父级可以退出,这会将控制权返回给命令行 ...
- linux守护进程的创建
下面的完成了这样一个功能,创建一个守护进程,每个一秒在/tmp目录下的文件peng.txt中记录当前系统时间. 一.守护进程 守护进程是linux中的后台服务进程,在系统启动时开始运行,在系统关闭时终 ...
- Linux中的两种守护进程stand alone和xinetd
Linux中的两种守护进程stand alone和xinetd --http://www.cnblogs.com/itech/archive/2010/12/27/1914846.html#top 一 ...
- Linux守护进程设计规范及python实现
http://blog.csdn.net/mr_jj_lian/article/details/7252222 守护进程 守护进程是生存期长的一种进程.它们独立于控制终端并且周期性的执行某种任务或等待 ...
最新文章
- 程序猿,凭什么让你拿二十万
- C# XML的序列化与反序列化
- 从0到1 构建实时音视频引擎
- 机器人学一些概念1——自由度冗余,映射和操作算子
- spring Boot Actuator使用
- mysql函数时分秒转换_mysql函数 秒转换成时分秒
- TCP中间件_个人方案
- 如何成为一位黑客 ( How To Become A Hacker )
- python面试如何以相反顺序展示一个文件的内容?
- 4999元起!三星在中国正式发布Galaxy S22系列
- libusb的交叉编译
- 合肥信息技术职业学院计算机模拟考试准考证,【通知】全国计算机等级考试模拟测试通知...
- 初学Java必写的小程序。
- 下一时代的HTML5和JavaScript
- pdf在线预览功能的两种方法
- 网络视频广告今年起步
- 超级冷笑话,冷死人不偿命
- JavaScript “use strict“(严格模式)
- 循序渐进学SAP系列(一):--SAP该如何入门
- android动画送礼物,Android开发仿映客送礼物效果
热门文章
- TensorFlow XLA加速编译器
- NVIDIA Turing Architecture架构设计(下)
- 山西农业大学c语言答案,第一章C语言及程序设计概述-东北农业大学教务处.doc...
- HarmonyOS UI开发 DirectionalLayout(定向布局) 的使用
- Retrofit 网络请求参数注解@Path @Field @Query 等使用
- android 8.0 ,9.0 静态广播不显示问题处理
- android 创建 file 文件,文本 并写入内容
- java.lang.ClassNotFoundException: Didn't find class org.apache.http.Protoco
- Java 修饰符的总结
- Error:(1, 0) Your project path contains non-ASCII characters.