PHP创建守护进程(有遗留问题)

因为项目需要,需要写一个守护进程,虽然用crontab也是可以实现的,但是crontab存在许多的不足(容易产生overlap,数据无法共享)

在别人的blog里看到了守护进程的实现(unix),因此在linux环境中用php语言实现原理也是一样的,因此可以借鉴。

先普及一下进程组,会话,控制终端:

a.一个会话可以对应多个进程组

b.一个会话只能对应一个控制终端

c.进程组组长无法创建一个新的会话,但是可以创建控制终端

b.进程组的组员可以创建一个新的会话,但无法创建控制终端

c.进程只能属于一个进程组,也必定属于一个进程组

创建守护进程:

1.使用pcntl_fork()创建一个子进程(同时退出父进程)

2.使用posix_setsid()新创建一个session

关于posix_setsid()的说明:

当它调用成功的时候,会创建一个新的session,并把当前的进程设置为session leader。(从而脱离之前的session,之前的session是通过终端建立连接然后创建的。)同时也会脱离当前的进程组,创建一个新的进程组并且担任进组组长。同时新创建的session没有控制终端。

3.创建无法创建控制终端的进程(重新pcntl_fork一个子进程,退出父进程)

4.修改它的工作目录(因为工作目录可能被umount)

5.修改工作目录的权限(子进程继承父进程的文件和文件权限)

6.处理SIGCHLD信号()


上代码:

<?php
declare(ticks = 1);

$pid = pcntl_fork();
if($pid>0){
        echo "parent pid".getmypid();
        exit(0);
}

echo "child pid".getmypid();
chdir("/");
posix_setsid();
umask(0);

$pid_d = pcntl_fork();
if($pid_d > 0){
        echo "Daemon PID $pid_d";
        exit(0);
}
funzioneDemo();
function funzioneDemo(){
        while(true){
                $handle = fopen("/tmp/demon1e.log","w+");
                fput($handle, time());
                fclose($handle);
        }
}
?>


这个在centos系统中运行不正常,在ubuntu中运行正常。(内部原因不详,需要深入了解)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MQTT消息遗留问题主要涉及到两个方面:保留消息和遗嘱消息。 保留消息是指当客户端连接时,Broker会存储每个Topic的最后一条保留消息及其QoS。当订阅该Topic的客户端上线后,Broker会将该消息投递给它。保留消息的作用是让新订阅的客户端得到发布方的最新状态值,而不必等待新消息推送。但保留消息的弊端是,Broker保存的消息会与断线重连接时收到的断线消息重复,并且每次重连时都会投递一次。要删除保留消息,只需发送一条Retained为true,payload为空的消息即可解除。\[1\] 遗嘱消息是在客户端断线时发送的消息。它有四个参数:topic(预定发布的主题)、payload(遗嘱消息内容)、qos(遗嘱消息质量)和retained(遗嘱消息是否保留)。当客户端断线时,订阅该主题的其他客户端都会收到一条遗嘱消息。遗嘱消息的应用是在客户端连接时设置向指定主题发送遗嘱消息,以便在客户端断线时通知其他订阅者。\[2\] 遗嘱消息及消息保留的应用中提到,保留消息的好处是当有新的连接订阅该topic时,Broker会先发送保留消息给该连接,从而确保该连接立刻获取到topic上的消息。这样可以优化用户体验。然而,保留消息的坏处是由于保留消息会一直存在,导致新的连接都会获得该消息,如果该消息不是它们想要的,就会存在污染。因此,一些人的做法是让发送方重新发送一个空的保留消息来覆盖原有保留消息。\[3\] 综上所述,MQTT消息遗留问题主要涉及到保留消息和遗嘱消息的使用和管理。保留消息可以让新订阅的客户端得到发布方的最新状态值,但可能会导致重复投递。遗嘱消息可以在客户端断线时通知其他订阅者,但需要注意保留消息的污染问题。 #### 引用[.reference_title] - *1* *2* [SpringBoot 开发之 MQTT 协议遗嘱消息及消息保留的应用](https://blog.csdn.net/myinsert/article/details/108360297)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [相机MQTT遗嘱消息发送异常分析](https://blog.csdn.net/weixin_39603492/article/details/119434437)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值