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下使用无限生命期Session的方法
Mar 16 PHP
PHP性能优化准备篇图解PEAR安装
Dec 05 PHP
php Session存储到Redis的方法
Nov 04 PHP
PHP中Fatal error session_start()错误解决步骤
Aug 05 PHP
thinkphp模板继承实例简述
Nov 26 PHP
PHP+jQuery+Ajax实现用户登录与退出
Apr 27 PHP
php中memcache 基本操作实例
May 17 PHP
PHP实现的限制IP投票程序IP来源分析
May 04 PHP
php与c 实现按行读取文件实例代码
Jan 03 PHP
PHP中Trait及其应用详解
Feb 14 PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
Sep 13 PHP
php实现JWT(json web token)鉴权实例详解
Nov 05 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多进程编程实例详解
Jul 19 #PHP
You might like
PHP的FTP学习(二)[转自奥索]
2006/10/09 PHP
针对初学PHP者的疑难问答(2)
2006/10/09 PHP
php 常用类整理
2009/12/23 PHP
PHP计算2点经纬度之间的距离代码
2013/08/12 PHP
eaglephp使用微信api接口开发微信框架
2014/01/09 PHP
php读取excel文件示例分享(更新修改excel)
2014/02/27 PHP
php ci 获取表单中多个同名input元素值的代码
2016/03/25 PHP
PHP  实现等比压缩图片尺寸和大小实例代码
2016/10/08 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
php实现留言板功能(会话控制)
2017/05/23 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
回车直接实现点击某按钮的效果即触发单击事件
2014/02/27 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
使用jquery实现IE下按backspace相当于返回操作
2014/03/18 Javascript
jQuery实现点击小图片淡入淡出显示大图片特效
2015/09/09 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
2016/05/19 Javascript
手把手教你搭建ES6的开发运行环境
2017/07/11 Javascript
JS算法题之查找数字在数组中的索引位置
2019/05/15 Javascript
微信小程序关键字变色实现代码实例
2019/12/13 Javascript
Node.js web 应用如何封装到Docker容器中
2020/09/01 Javascript
python 获取本机ip地址的两个方法
2013/02/25 Python
Python缩进和冒号详解
2016/06/01 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
python 读取摄像头数据并保存的实例
2018/08/03 Python
浅析PEP570新语法: 只接受位置参数
2019/10/15 Python
基于logstash实现日志文件同步elasticsearch
2020/08/06 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
HTML5 canvas基本绘图之绘制曲线
2016/06/27 HTML / CSS
心得体会范文
2014/01/04 职场文书
心理健康教育制度
2014/01/27 职场文书
好书伴我成长演讲稿
2014/05/14 职场文书
2014年外贸业务员工作总结
2014/12/11 职场文书
品质保证书格式
2015/02/28 职场文书
八年级英语教学反思
2016/02/15 职场文书