首页 > 系统相关 >php脚本守护进程设计

php脚本守护进程设计

时间:2023-03-05 11:34:28浏览次数:48  
标签:脚本 tmp log -- lock flock php 守护


思路:

while 循环,若当前没有数据要操作可以休眠;
crontab 脚本每隔固定时间段执行该脚本,执行时先检测是否已在执行,若无 执行,有则 跳过。
nohup 后台执行
flock -xn 加锁
2>&1 表示不仅命令行正常的输出保存到xx.log中,产生错误信息的输出也保存到xx.log文件中;

实例:
要执行代码: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
选项
[plain] view plain copy
-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被锁定,则结束当前的任务,下一周期再判断。


标签:脚本,tmp,log,--,lock,flock,php,守护
From: https://blog.51cto.com/sdwml/6101308

相关文章

  • php 检测mysql表是否存在
    pdo:<?php$dsn='mysql:dbname=test;host=127.0.0.1';$user='root';$password='';try{$pdo=newPDO($dsn,$user,$password);}catch(PDOException$e){......
  • php curl 批量请求
    实例:<?php$ch=array();$res=array();$conn=array();$urls=array('baidu'=>"http://www.baidu.com/",'cheyun'=>"http://auto.jrj.com.cn/",'w3c'=......
  • php curl 请求302跳转页面
    若请求url已改变且设置了自动跳转,可通过设置CURLOPT_FOLLOWLOCATION参数实现自动请求跳转链接。若要手动判断是否跳转,可通过curl_getinfo($ch)方法获取具体请求信息,其中......
  • phpstorm配合phpstudy搭建php学习环境
    phpstorm配合phpstudy搭建php学习环境前言初学php学校提供的是zendstudio和phpstudy的学习环境,因为去年学习java所以习惯了idea的方式,所以今年就找到了JetBrains的ph......
  • phpcms文件目录结构
    根目录| – api  接口文件目录| – caches缓存文件目录    | –configs系统配置文件目录    | –caches_*系统缓存目录| – p......
  • 微信小程序结合php后台实现登录授权机制详解
    微信小程序应用的用户登录授权机制相当复杂,官方给出了下面一张流程图来解释:下面结合这张图来详细讲述下小程序的登录验证授权机制。首先,小程序应用实现登录验证的前提是......
  • scite 脚本
    自动转换\n分隔多行文本到字符串functionmTextToCString()ifoutputthenoutput:ClearAll()endlocal__allText_=editor:GetText()__allText_=s......
  • lua脚本在redis中的使用
    先开启redis的日志输出修改redis.conf文件,设置logfile/root/tools/redis-6.0.9/logs/redis.log重启redissystemctlrestartredisd创建一个简单的lua脚本test.......
  • lua脚本的使用
    先开启redis的日志输出修改redis.conf文件,设置logfile/root/tools/redis-6.0.9/logs/redis.log重启redissystemctlrestartredisd创建一个简单的lua脚本test.......
  • 定位解析一个因脚本劫持导致webpack动态加载异常的问题
    问题描述项目现场的前端项目在点击顶部的导航栏切换不同的模块时,会有小概率出现模块加载报错的情况:我们的前端项目里是有基于react-loadable做的懒加载的,上图的12.be789......