easyswoole实现线上更新代码
众所周知,easyswoole作为常驻内存的框架,修改代码并不能直接生效,而是需要重启服务,那么,当你的easyswoole项目上线之后,该如何保证旧请求的同时去更新代码呢?
nginx reload和restart
首先,我们需要了解到nginx reload和restart的区别.
reload
nginx 执行reload命令后,将会重新加载一次配置文件,并且给其他worker进程发送信号,进程收到信号之后,将不再接收新请求,当旧请求执行完毕后,将会自动销毁.
同时,如果reload加载的配置文件出错,nginx将会自动回滚到正常时候的配置,并不会造成服务中断.

restart
restart= stop+start,当nginx执行restart命令后,将会先中断服务,不再接收请求.
同时,当配置文件出错时,restart将会无法正常start,服务将一直中断.
更新线上easyswoole代码.
easyswoole reload
easyswoole本身自带reload代码,可实现关于worker进程的重启,但由于easyswoole的task进程是通过自定义进程实现,无法实现重启.
所以理论上,我们依然需要直接stop+start
那么,如何才能使得stop+start依然不中断服务呢?
反向代理
在上一篇文章中,我们了解到了nginx反向代理,负载均衡的实现.nginx实现负载均衡,同时,easyswoole 服务,理应跟nginx反向代理配合使用:
首先,我们创建一个测试的easyswole服务,并且在index控制器中写入以下测试方法:
|
1
2
3
4
5
6
7
8
9
10
11
|
public function index(){ $this->response()->write('<h1>test 1</h1>'); go(function(){ //假设每次请求进来,都将投递一个异步任务 TaskManager::getInstance()->async(function (){ echo 1; \co::sleep(1); }); });} |
启动服务后,通过nginx 反向代理.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
upstream test.cn { server 127.0.0.1:9501;} server { root /data/wwwroot/; server_name local.swoole.com; location / { proxy_http_version 1.1; proxy_set_header Connection "keep-alive"; proxy_set_header X-Real-IP $remote_addr; if (!-f $request_filename) { proxy_pass http://test.cn; } }} |
在这个时候,我们已经启动了一个正在运行的服务:

新增测试脚本,测试请求
为了便于测试,我们新增一个测试脚本:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
<?php/** * Created by PhpStorm. * User: 10671 * Date: 2020/5/25 0025 * Time: 21:33 */while(1){ $test = file_get_contents("http://1.cn"); var_dump($test); usleep(100000);} |
此脚本将会一直请求1.cn,并且打印数据.
更新代码
那么,假设现在我们需要更新代码,该怎么使得线上生效呢?首先,我们重新创建一个文件夹.
|
1
|
cp -r 1.cn/ 2.cn/ |
修改 dev.php端口改为 9502:
假设修改代码为test2:
|
1
2
3
4
5
6
7
8
9
10
11
|
public function index(){ $this->response()->write('<h1>test 2</h1>'); go(function(){ //假设每次请求进来,都将投递一个异步任务 TaskManager::getInstance()->async(function (){ echo 1; \co::sleep(1); }); });} |
启动该服务.并测试是否启动成功.
|
1
2
|
[root@localhost 2.cn]# curl http://127.0.0.1:9502<h1>test 2</h1>[root@localhost 2.cn]# |
此时,服务器运行了2个服务: 9501为旧版本服务,9502为新版本服务
注意,此例子为测试例子,在实际中,请使用git等版本控制工具更新代码.
此时9501正在一直接收请求,并且不断的在投递异步任务:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@localhost 1.cn]# php easyswoole task status┌─────────┬─────────┬──────┬───────┬─────────────┐│ running │ success │ fail │ pid │ workerIndex │├─────────┼─────────┼──────┼───────┼─────────────┤│ 20 │ 71 │ 0 │ 36212 │ 0 │├─────────┼─────────┼──────┼───────┼─────────────┤│ 20 │ 70 │ 0 │ 36213 │ 1 │├─────────┼─────────┼──────┼───────┼─────────────┤│ 20 │ 70 │ 0 │ 36214 │ 2 │├─────────┼─────────┼──────┼───────┼─────────────┤│ 20 │ 70 │ 0 │ 36215 │ 3 │└─────────┴─────────┴──────┴───────┴─────────────┘ |
修改nginx代理,并reload 重载配置
此时,我们修改nginx的配置,改为代理9502:
|
1
2
3
|
upstream test.cn { server 127.0.0.1:9502;} |
同时热重启nginx:

查看task任务状态
此时,nginx的新请求已经进入新服务.9501服务此时并没有中断,用于处理还未完成的task异步任务:

直到处理完成,才可关闭9501服务.

此时,线上版本已经更新成功,服务并没有中断.
easyswoole实现线上更新代码的更多相关文章
- 分享下使用 svn,测试服务器代码自动更新、线上服务器代码手动更新的配置经验
分享下使用 svn,测试服务器代码自动更新.线上服务器代码手动更新的配置经验 利用SVN的POST-COMMIT钩子自动部署代码 Linux SVN 命令详解 Linux SVN 命令详解2 使用sv ...
- 使用git克隆项目、从dev分支上更新代码以及将代码提交到Coding(或GitHub)上面
本教程的目的: 这是个crm项目中,有两个分支一个是master 和 dev ,master主分支,不允许提交代码,我要拉去dev分支上最新的代码,并将修改后的项目,在推送到dev分支上. 一. 1. ...
- 如何使用Fiddler调试线上JS代码
大家平时肯定都用过火狐的Firebug或者谷歌的调试工具来调试JS,但遗憾的是我们不能像编辑html,css那样来直接新增或者删除JS代码. 虽然可以通过调试工具的控制台来动态执行JS代码,但有时候却 ...
- IDEA 在SVN上更新代码错误: Error:Server SSL certificate rejected
在IDEA中更新代码到SVN中 ,出现了 Error:Server SSL certificate rejected ---服务器的SSL证书 的错误 之前在网上有找过一些相关的做法,但是 ...
- Django线上部署代码修改失效问题
记一次django项目的线上部署维护问题,django+nginx 关于nginx反向代理服务器的介绍这里有一篇博客介绍的比较好:nginx的相关介绍 以及当一次客户端请求发出后,uwsig以及uWS ...
- 使用Fiddler调试线上JS代码
在下面的命令框输入“select script”回车来筛选js请求 将HTTP请求重定向到本地的文件,进行web调试.这种调试方式不需要发布到线上再验证,避免了修改不成功.对用户造成影响的风险 左边一 ...
- Mac php7本地安装mongodb扩展以适配使用mongo扩展的线上老代码
从https://pecl.php.net/package/mongodb官网下载压缩包(不懂事的我下载了1.5.1版本) 解压安装包 tar -zxvf mongodb-1.5.1.tgz 进入解压 ...
- 在Linux上git pull线上仓库代码时,出现error: Your local changes to the following files would be overwritten by merge
在Windows上工作时未出现过该问题,于是通过命令: git diff 查看差异,得到结果: diff --git a/start_crons.sh b/start_crons.sh old mod ...
- 不停机替换线上代码? 你没听错,Arthas它能做到
写在前边 有没有这样一种感受,自己写的代码在开发.测试环境跑的稳得一笔,可一到线上就抽风,不是缺这个就是少那个反正就是一顿报错,线上调试代码又很麻烦,让人头疼得很.阿里巴巴出了一款名叫Arthas的工 ...
随机推荐
- 关于步进电机驱动板,tb6560
参考的,淘宝上买来的步进电机S曲线驱动方法,发现 他程序输出的PWM波形全是方波, 占空比为50% 而且他 修改这两个数来输出波形,所以 我打算参考这个来写一个驱动 TIMX_CNT中放置的是当前计 ...
- 报错: Uncaught TypeError: Cannot read property 'prototype' of undefined(Day_43)
报错原因 引入的js顺序错误,elementUI需要依赖于Vue,调整顺序即可. 调整后
- easyui datagrid 自定义单元格单击与双击事件(Day_38)
$(function(){ $('#tableId').datagrid({//单击事件 onClickRow:function(rowIndex,rowData){ alert("单 ...
- Django(45)drf序列化类的使用(Serializer)
前言 上一篇文章我们讲述了序列化,这篇就带大家一起来实现以下序列化 Serializer 我们使用序列化类Serializer,我们来看下源码结构,这里推荐使用pycharm左边导航栏的Structu ...
- Ansible学习分享(基本)
背景:Teamleader提到一款好用的自动化配置管理工具,于是前去学习实践,有了下面分享. 纲要 一.Ansible简介 二.Ansible准备 2.1 Ansible安装 2.2 设置SSH公钥验 ...
- Go语言协程并发---读写锁sync.RWMutex
package main import ( "fmt" "sync" "time" ) /* 读写锁 多路只读 一路只写 读写互斥 */ / ...
- 手把手教你实现三种绑定方式(call、apply、bind)
关于绑定首先要说下this的指向问题. 我们都知道: 函数调用时this指向window 对象调用函数时this指向对象本身 看下面得例子: // 1 function test(){ const n ...
- TensorFlow分布式(多GPU和多服务器)详解
本文介绍有关 TensorFlow 分布式的两个实际用例,分别是数据并行(将数据分布到多个 GPU 上)和多服务器分配. 玩转分布式TensorFlow:多个GPU和一个CPU展示一个数据并行的例子, ...
- onnx算子大全
本文通过此脚本从def文件自动生成.不要直接修改,而是编辑算子定义. 对于算子输入/输出的可辩别的,它可以是可辩别的.不可辩别的或未定义的.如果未指定变量的可辩别的,则该变量具有未定义的可辩别的. a ...
- 《CNN Image Retrieval in PyTorch: Training and evaluati-ng CNNs for Image Retrieval in PyTorch》代码思路解读
这是一个基于微调卷积神经网络的图像检索的代码实现,这里我就基于代码做一个实现思路的个人解读,如果有不对的地方或者不够详细的地方,欢迎大家指出. 代码的GitHub地址:filipradenovic/c ...