php脚本守护进程原理与实现方法详解


Posted in PHP onJuly 20, 2017

本文实例讲述了php脚本守护进程原理与实现方法。分享给大家供大家参考,具体如下:

思路:

1. while 循环,若当前没有数据要操作可以休眠;
2. crontab 脚本每隔固定时间段执行该脚本,执行时先检测是否已在执行,若无 执行,有则 跳过。
3. nohup  后台执行
4. flock -xn  加锁

实例:

要执行代码:index.php

<?php
set_time_limit(0);
//死循环
while(1) {
  $message = '1111111' . "\n";
  error_log($message);
  sleep(5);
}
#/tmp/lock/test1.lock 为当前进程要锁定的文件,不同的进程配置不同的锁文件,该文件会自动创建
* * * * * flock -xn /tmp/lock/test1.lock -c 'nohup php index.php >> /php/test.log 2>&1 &'
* * * * * flock -xn /tmp/mytest.lock -c 'php /home/fdipzone/php/test.php >> /home/fdipzone/php/test.log'

在写好的php脚本。为防止守护进程内存溢出,建议定期检测内存占用。
将以下代码放到业务脚本中:

if(memory_get_usage()>100*1024*1024){
  exit('内存溢出');//大于100M内存退出程序,防止内存泄漏被系统杀死导致任务终端
}

注意:

nohup 任务查看与关闭方法:

关闭:

//方法一:
ps -e | grep commend
kill -9 pid
//方法二:
fg %n  //n为jobs命令查看的进程号

查看:

//查看后台进程
jobs

原理:

使用linux flock 文件锁实现任务锁定,解决冲突

格式:

flock [-sxun][-w #] fd#
flock [-sxon][-w #] file [-c] command

选项

-s, --shared:    获得一个共享锁
-x, --exclusive: 获得一个独占锁
-u, --unlock:    移除一个锁,通常是不需要的,脚本执行完会自动丢弃锁
-n, --nonblock:  如果没有立即获得锁,直接失败而不是等待
-w, --timeout:   如果没有立即获得锁,等待指定时间
-o, --close:     在运行命令前关闭文件的描述符号。用于如果命令产生子进程时会不受锁的管控
-c, --command:   在shell中运行一个单独的命令
-h, --help       显示帮助
-V, --version:   显示版本

运行一个php文件,文件锁使用独占锁,如果锁定则失败不等待。参数为-xn

* * * * * flock -xn /tmp/mytest.lock -c 'php /home/fdipzone/php/test.php >> /home/fdipzone/php/test.log'

这样当任务未执行完成,下一任务判断到/tmp/mytest.lock被锁定,则结束当前的任务,下一周期再判断。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php中通过curl模拟登陆discuz论坛的实现代码
Feb 16 PHP
基于php缓存的详解
May 15 PHP
php生成缩略图填充白边(等比缩略图方案)
Dec 25 PHP
分享一个php 的异常处理程序
Jun 22 PHP
PHP strtotime函数用法、实现原理和源码分析
Feb 04 PHP
codeigniter发送邮件并打印调试信息的方法
Mar 21 PHP
php+ajax实现无刷新动态加载数据技术
Apr 28 PHP
PHP中预定义的6种接口介绍
May 12 PHP
php编写批量生成不重复的卡号密码代码
May 14 PHP
PHP处理Ajax请求与Ajax跨域问题
Feb 13 PHP
PHP8.0新功能之Match表达式的使用
Jul 19 PHP
PHP 出现 http500 错误的解决方法
Mar 09 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
Jul 20 #PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 #PHP
ThinkPHP框架表单验证操作方法
Jul 19 #PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
Jul 19 #PHP
关于ThinkPhp 框架表单验证及ajax验证问题
Jul 19 #PHP
php实现的pdo公共类定义与用法示例
Jul 19 #PHP
PHP实现的Redis多库选择功能单例类
Jul 27 #PHP
You might like
php下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
2010/12/29 PHP
PHP中Session引起的脚本阻塞问题解决办法
2014/04/08 PHP
PHP文件上传处理案例分析
2016/10/15 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
PHP面向对象程序设计继承用法简单示例
2018/12/28 PHP
js返回上一页并刷新代码整理
2012/12/21 Javascript
jquery实现在页面加载的时自动为日期插件添加当前日期
2014/08/20 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
JS实现自动固定顶部的悬浮菜单栏效果
2015/09/16 Javascript
全面解析Bootstrap布局组件应用
2016/02/22 Javascript
AngularJS入门教程之多视图切换用法示例
2016/11/02 Javascript
详解基于javascript实现的苹果系统底部菜单
2016/12/02 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
利用jsonp与代理服务器方案解决跨域问题
2017/09/14 Javascript
对vue 键盘回车事件的实例讲解
2018/08/25 Javascript
[00:42]《辉夜杯》—职业组预选赛12月3日15点 正式打响
2015/12/03 DOTA
Python实现获取操作系统版本信息方法
2015/04/08 Python
python+selenium识别验证码并登录的示例代码
2017/12/21 Python
Python后台开发Django的教程详解(启动)
2019/04/08 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
2019/08/06 Python
Python Pandas对缺失值的处理方法
2019/09/27 Python
Python实现发票自动校核微信机器人的方法
2020/05/22 Python
使用pycharm和pylint检查python代码规范操作
2020/06/09 Python
Python self用法详解
2020/11/28 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
CSS3 box-sizing属性
2009/04/17 HTML / CSS
阿姆斯特丹城市卡:Amsterdam Pass
2019/12/01 全球购物
波兰最大的电商平台:Allegro.pl
2021/02/06 全球购物
造价工程师个人求职信
2013/09/21 职场文书
高二历史教学反思
2014/01/25 职场文书
自荐信格式简述
2014/01/25 职场文书
GMP办公室主任岗位职责
2014/03/14 职场文书
个人委托书范本汇总
2014/10/01 职场文书
师范生见习报告
2014/10/31 职场文书
MongoDB使用场景总结
2022/02/24 MongoDB