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正则的Unknown Modifier错误解决方法
Mar 02 PHP
php获取当前网址url并替换参数或网址的方法
Jun 06 PHP
CodeIgniter框架中_remap()使用方法2例
Mar 10 PHP
php使用正则过滤js脚本代码实例
May 10 PHP
linux使用crontab实现PHP执行计划定时任务
May 10 PHP
ThinkPHP实现跨模块调用操作方法概述
Jun 20 PHP
PHP经典面试题之设计模式(经常遇到)
Oct 15 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
Feb 15 PHP
thinkPHP3.2.2框架行为扩展及demo示例
Jun 19 PHP
php 多继承的几种常见实现方法示例
Nov 18 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
May 27 PHP
php实现简易计算器
Aug 28 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计算上一个月的今天
2013/05/23 PHP
Zend Guard使用指南及问题处理
2015/01/07 PHP
在Mac上编译安装PHP7的开发环境
2015/07/28 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
PHP实现UTF8二进制及明文字符串的转化功能示例
2017/11/20 PHP
Javascript this指针
2009/07/30 Javascript
JQuery 将元素显示在屏幕的中央的代码
2010/02/27 Javascript
javascript JSON操作入门实例
2010/04/16 Javascript
用js将内容复制到剪贴板兼容浏览器
2014/03/18 Javascript
javascritp添加url参数将参数加入到url中
2014/09/25 Javascript
基于JavaScript实现仿京东图片轮播效果
2015/11/06 Javascript
跟我学习javascript的严格模式
2015/11/16 Javascript
Javascript中常用类型的格式化方法小结
2016/12/26 Javascript
JavaScript中三种常见的排序方法
2017/02/24 Javascript
微信小程序实现图片懒加载的示例代码
2017/12/13 Javascript
react实现换肤功能的示例代码
2018/08/14 Javascript
手把手教你使用TypeScript开发Node.js应用
2019/05/06 Javascript
微信小程序实现用table显示数据库反馈的多条数据功能示例
2019/05/07 Javascript
微信小程序官方动态自定义底部tabBar的例子
2019/09/04 Javascript
详解JavaScript中的Object.is()与&quot;===&quot;运算符总结
2020/06/17 Javascript
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
2020/07/11 Javascript
vue 使用微信jssdk,调用微信相册上传图片功能
2020/11/13 Javascript
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
分享一个常用的Python模拟登陆类
2015/03/29 Python
python中偏函数partial用法实例分析
2015/07/08 Python
Python和Java进行DES加密和解密的实例
2018/01/09 Python
Python 取numpy数组的某几行某几列方法
2019/10/24 Python
Django后端按照日期查询的方法教程
2021/02/28 Python
DC Shoes官网:美国滑板鞋和服饰品牌
2017/09/03 全球购物
电厂厂长岗位职责
2014/01/02 职场文书
消防安全汇报材料
2014/02/08 职场文书
迎新晚会主持词
2014/03/24 职场文书
投标服务承诺书
2014/05/28 职场文书
平面设计专业求职信
2014/08/09 职场文书
2015年售后服务工作总结
2015/04/25 职场文书
Python闭包的定义和使用方法
2022/04/11 Python