之前在yii的项目里用redis作为消息队列,现在很多任务需要延迟需求,于是把之前redis的消息队列替换成了rabbitmq

于是使用yii的yii2-queue这个组件

但是由于提供的yii queue/listen是个单进程的消费,而且也不是守护进程,如果有个任务阻塞,就会对其它的任务有影响,开多个又难以管理

于是使用master-worker的方式 开多个worker干活,master监控worker状态

但是进程常驻的程序 又牵扯到代码修改了重启的问题

比如 在master启动就已经加载到内存的程序代码 不重启master是无法得到修改的变更的

下面例子来演示哪些代码需要重启,哪些不需要

这里使用的是从项目里抽出来的简要的进程管理组件

composer require hkui/process_manager

job.php

class job
{
public function do($obj){ $i=0;
while(true){
$i++;
echo posix_getpid()."=".$i."-job-".A.PHP_EOL;
sleep(2);
$obj->isExit($i);
}
}
}

demo.php

require '../../../vendor/autoload.php';
use ProcessManager\Process; define("A","456");
class demo extends Process
{
public function runJob($worker, $index)
{ \swoole_set_process_name(sprintf('%s-worker-%d', 'test',$index));
include 'job.php';
$job=new job();
$job->do($this);
}
} if(count($argv)<3){
exit( "params lost".PHP_EOL);
}
$process_name=$argv[1];
$worker_num=3;
if(isset($argv[3])){
$worker_num=intval($argv[3]);
}
$cmd=$argv[2];
$config=[
'process_name'=>$process_name,
'worker_num'=>$worker_num,
'out_file'=>'/tmp/out',
'max_run_time'=>10 //运行10个后自己退出,然后master补上 ];
$process=new demo($config);
echo posix_getpid().PHP_EOL;
$process->run($cmd);
开启1个master3个worker
php demo.php test start 3 [root@6fb38402a4c6 process_manager]# php demo.php test status
9982
Array
(
[0] => 9979 9980 9981
[1] => USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
[2] => root 9882 0.0 0.1 144952 7420 ? Ss 08:42 0:00 test-master
[3] => root 9979 0.0 0.1 147004 9212 ? S 08:49 0:00 \_ test-worker-1
[4] => root 9980 0.0 0.1 147004 9212 ? S 08:49 0:00 \_ test-worker-2
[5] => root 9981 0.0 0.1 147004 9212 ? S 08:49 0:00 \_ test-worker-0
) 修改常量A的值,worker在重启(运行满10次 或者执行 php demo.php test reload) 后,输出的结果不会体现出A的修改变更
但是修改
job.php里runJob里的输出,worker在重启后会执行最新的代码
如果我们把 include 'job.php'; 拿到外面
demo部分替换成 define("A","456");
include 'job.php'; class demo extends Process
{
public function runJob($worker, $index)
{ \swoole_set_process_name(sprintf('%s-worker-%d', 'test',$index)); $job=new job();
$job->do($this);
}
}
这时修改job代码后,worker重启也不会生效了 runJob里的代码都是子进程worker里的代码
我们在最开始版本的demo代码里
打印下print_r(get_included_files()); define("A","456"); class demo extends Process
{
public function runJob($worker, $index)
{
print_r(get_included_files());
\swoole_set_process_name(sprintf('%s-worker-%d', 'test',$index));
include 'job.php';
$job=new job();
$job->do($this);
}
}
得到
Array
(
[0] => /www/process/vendor/hkui/process_manager/demo.php
[1] => /www/process/vendor/autoload.php
[2] => /www/process/vendor/composer/autoload_real.php
[3] => /www/process/vendor/composer/ClassLoader.php
[4] => /www/process/vendor/composer/autoload_static.php
[5] => /www/process/vendor/hkui/process_manager/src/Process.php
)
这时job.php并没有加载到内存里
所以每次woker重启,new job时 都会加载最新的job.php代码 ,而常量A在demo.php里定义,已经加载到了内存,所以改A必须重启master才能生效
如果把 include 'job.php'; define("A","456"); 下面,这时的get_included_files() 为
Array
(
[0] => /www/process/vendor/hkui/process_manager/demo.php
[1] => /www/process/vendor/autoload.php
[2] => /www/process/vendor/composer/autoload_real.php
[3] => /www/process/vendor/composer/ClassLoader.php
[4] => /www/process/vendor/composer/autoload_static.php
[5] => /www/process/vendor/hkui/process_manager/job.php
[6] => /www/process/vendor/hkui/process_manager/src/Process.php
)
修改job内容 worker重启后new Job 不再加载job.php,而是从父进程master继承 所以不会生效,必须重启父进程master

master-worker常驻型程序代码修改哪些需要重启master或者worker的更多相关文章

  1. HOOK大法实现不修改程序代码给程序添加功能

    [文章标题]: HOOK大法实现不修改程序代码给程序添加功能[文章作者]: 0x18c0[软件名称]: Scylla[使用工具]: OD.Stub_PE.ResHacker[版权声明]: 本文原创于0 ...

  2. 如何快速读懂大型C++程序代码

    要搞清楚别人的代码,首先,你要了解代码涉及的领域知识,这是最重要的,不懂领域知识,只看代码本身,不可能搞的明白.其次,你得找各种文档:需求文档(要做什么),设计文档(怎么做的),先搞清楚你即将要阅读是 ...

  3. wemall app商城源码中基于PHP的通用的树型类代码

    wemall doraemon是Android客户端程序,服务端采用wemall微信商城,不对原商城做任何修改,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可随意定制修改.本文分享其中 ...

  4. 小程序代码包压缩 策略&方案

    微信小程序自推出以来,逐渐发展,目前正受到越来越多的青睐.其中很重要的一点得益于小程序的轻量级特性,每个小程序最多不超过2MB,招之即来挥之即去,相比于几十上百兆的APP,用户进入小程序,或者说,小程 ...

  5. Spark闭包 | driver & executor程序代码执行

    Spark中的闭包 闭包的作用可以理解为:函数可以访问函数外部定义的变量,但是函数内部对该变量进行的修改,在函数外是不可见的,即对函数外源变量不会产生影响. 其实,在学习Spark时,一个比较难理解的 ...

  6. am335x UART1输入u-boot 调试信息代码修改

    AM335x 调试信息UART1输出代码修改1. 关于pin_mux  的配置代码修改位置:/board/forlinx/ok335x/mux.c void enable_uart0_pin_mux( ...

  7. C程序之修改Windows的控制台颜色(转载)

    Windows的CMD可以和Linux下的终端一样可以有五颜六色,目前我在网上找到2种方法可以修改Windows的CMD,当然都是在代码中修改的.在“CMD”->“属性”->“颜色”,这种 ...

  8. 反编译工具 使用.NET JustDecompile来反编译你的程序代码

    原文地址:http://www.it165.net/pro/html/201310/7383.html 前言 在项目的进行中有时会碰到需要去了解由第三方所开发的程序代码或者因为年久已经遗失原始码的程序 ...

  9. C++ Primer Plus(第6版)中文版——课后练习程序代码

    博客内容经历了一次整理,以前发的博文太散.没什么水准,搞的随笔分类越来越多orz,这次把CPP这本书的课后练习的程序代码放到一起方便查阅与修改..嗯 9.6.1 #ifndef _9..1_H_ #d ...

随机推荐

  1. 【转帖】如果进入CPU的世界,时间会是怎样的?

    如果进入CPU的世界,时间会是怎样的? 2018-02-26 20:52:46 world6 阅读数 1295更多 分类专栏: 网络 缓存服务 架构   版权声明:本文为博主原创文章,遵循CC 4.0 ...

  2. sqlserve 数据库8G log文件也有10来g 按日期删除 方法

    数据库存了几年的数据没有维护过,数据庞大,日志文件也不小,如何清理不需要的数据呢 首先考虑的肯定是某个日期之前的数据清除掉 delete from 表名 where cast(字段名 as datet ...

  3. 【程序人生】程序员真会玩,工作996,生病ICU

    昨天Github上一个项目彻底爆红了网络,短短一天star数突破一万,Issues已破1800,大家纷纷说出有关企业的不合理加班行为,句句吐露程序员的心声,掀起了一波抵制加班潮,抵制996. 该项目里 ...

  4. 09 IO流(六)——ByteArray字节流、流对接

    字节数组流 ByteArray流是节点流. 前面讲到的文件字节流,文件字符流,他们的源都是来自于pc硬盘. 本节要讲的字节数组流的源是来自于内存或网络. 它更合适用来处理来自网络的字节流. 由于源并不 ...

  5. WUSTOJ 1315: 杜学霸和谭女神(Java)

    题目链接:

  6. vue的就地复用--- v-for与:key

    v-for遵循的是vue的就地复用原则.文本与数据是绑定的,所以当文本被重新渲染的时候,列表也会被重新渲染. 就地复用只适用于不依赖子组件状态或临时DOM状态的列表渲染输出.[比如表单输入值的列表渲染 ...

  7. 最简容器动手小实践——FC坦克大战游戏容器化

    FC 经典力作相信大家一点也不陌生.童年时期最频繁的操作莫过于跳关,在 果断跳到最后一关之后,一般都是以惨败告终,所以还是一关一关的过原始积累才能笑到最后.这款游戏的经典就在于双人配合,守家吃装备.也 ...

  8. Comet OJ Contest 4

    A:签到. #include<bits/stdc++.h> using namespace std; #define ll long long #define inf 1000000010 ...

  9. Git config 使用说明(转)

    原文:https://blog.csdn.net/gdutxiaoxu/article/details/79253737

  10. Spring Cloud Alibaba学习笔记(5) - 整合Sentinel及Sentinel规则

    整合Sentinel 应用整合Sentinel 在dependencies中添加依赖,即可整合Sentinel <dependency> <groupId>com.alibab ...