php中Swoole的热更新实现代码实例

使用swoole_http_server替代php-fpm后,由于php长驻内存,修改了代码不能实时调试,需要去手动去重启服务,很是不方便,决定使用inotify来监控文件状态的改变,来给swoole发送reload信号,来实现swoole的热更新。

如何安装inotify就不写了,安装之后可以建立一个脚本文件,如php_reload.sh:

#!/bin/sh
# src 需要监控的地址
src=/home/server/Project/test/app/
/usr/bin/inotifywait -rmq -e create,modify,delete $src | while read event
 do
    /home/server/Project/test/bin/httpserver reload
 done

linux shell 写swoole重启脚本

代码如下

#!/bin/sh
kill `lsof -t -i:9501`
sleep 2
php /data/web/mircoweb/wwwroot/Public/swoole.php
sleep 1
netstat -ntlp

如果不支持lsof命令 那就yum install lsof安装下吧

swoole服务平滑重启

1. reload.sh脚本

echo "loading..."
pid="pidof live_name"
echo $pid
kill -USR1 $pid
echo "loading success"

2. linux中执行

sh  reload.sh
代码用的原来只是自己加了一些操作流程

swoole_reload_server.php

<?php
class Server
{
        private $serv;
        public function __construct() {
        $this->serv = new swoole_server("0.0.0.0", 9501);
        $this->serv->set(array(
            'worker_num' => 8,
            'daemonize' => false,
            'max_request' => 10000,
            'dispatch_mode' => 2,
            'debug_mode'=> 1,
        ));
        $this->serv->on('Start', array($this, 'onStart'));
        $this->serv->on('WorkerStart', array($this, 'onWorkerStart'));
        $this->serv->on('Connect', array($this, 'onConnect'));
        $this->serv->on('Receive', array($this, 'onReceive'));
        $this->serv->on('Close', array($this, 'onClose'));
        $this->serv->start();
    }
    public function onStart( $serv ) {
        echo "Start\n";
        cli_set_process_title("reload_master");
    }
    public function onWorkerStart( $serv , $worker_id) {
        require_once "reload_page.php";
        Test();
    }
    public function onConnect( $serv, $fd, $from_id ) {
        echo "Client {$fd} connect\n";
 
    }
    public function onReceive( swoole_server $serv, $fd, $from_id, $data ) {
        echo "Get Message From Client {$fd}:{$data}\n";
    }
    public function onClose( $serv, $fd, $from_id ) {
        echo "Client {$fd} close connection\n";
    }
}
new Server();

reload.sh

echo "Reloading..."
cmd=$(pidof reload_master)
 
kill -USR1 "$cmd"
echo "Reloaded"

reload_page.php 

<?php
/**
 * If you change this function and want
 * swoole_server to use the new function,
 * just run 'reload.sh' to send a restart
 * signal to swoole_server.
 */
function Test() {
  echo "This is not a php file\n";
}

到此这篇关于php中SWOOLE的热更新实现代码实例的文章就介绍到这了,更多相关php中SWOOLE的热更新实现内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 全面讲解CocosCreator热更新

    前言 本文主要引用cocos关于热更的官方文档,并在此基础上,总结sprout当前热更流程. 什么是热更 热更(新)本质上是从服务器下载需要的资源到本地,并且可以执行新的游戏逻辑,让新资源可以被游戏所使用,它可以使开发者在不发布新版本的情况下,修复 BUG 和发布功能,让开发者得以绕开苹果的审核机制,避免长时间的审核等待以及多次被拒造成的成本. Cocos 默认的热更新机制并不是基于补丁包更新的机制,传统的热更新经常对多个版本之间分别生成补丁包,按顺序下载补丁包并更新到最新版本.Cocos 的热

  • Cocos2d-x触摸事件实例

    在玩手机游戏的时候,屏幕接收我们的触摸消息是必不可少的,根据我们的触摸事件,去实现相应的功能,这里我们就来学习一下cocos2d-x中的触摸是怎么实现的.触摸分为单点触摸和多点触摸,先来看单点触摸,就是接收一个点的触摸.代码将实现过程清楚的写了下来,仔细分析代码吧. bool HelloWorld::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); //开启触摸 this->setTouchEnabled(true)

  • React Native 实现热更新并自动签名打包功能

    项目背景:手动link的安卓App 1.下载 react-native-code-push npm install --save react-native-code-push 2.在android/settings.gradle文件下新增: include ':app', ':react-native-code-push' project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../no

  • Cocos2d-x中背景音乐和音效使用实例

    游戏中的音乐和音效是必不可少的,好的音乐可以给我们留下很深的印象也决定了这个游戏的品质.今天我们来学习一下cocos2d-x中如何使用音乐和音效.这些用到的函数都比较简单,现在直接上代码. //声音预先处理类的头文件 #ifndef _AUDIO_PRETREAT_H #define _AUDIO_PRETREAT_H #include "cocos2d.h" //使用声音引擎必须包含SimpleAudioEngeim.h头文件 #include "SimpleAudioEn

  • Cocos2d-x中获取系统时间和随机数实例

    随机数是我们在程序中经常要用到的,cocos2d-x用CCRANDOM_0_1产生随机数,但我们最后给它传入一个随机数种子,这样产生的随机数才是真正的随机数,而这个种子就是我们一般使用的时间.下面通过代码看看我们如何实现. bool HelloWorld::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); //获取系统时间 //time_t是long类型,精确到秒,通过time()函数可以获得当前时间和1970年1月

  • 详解webpack 热更新优化

    前言 随着项目的界面越来越多,webpack的热更新越来越慢,有时会达到5,7s之久,这对于开发效率影响是非常巨大的. 分析过程 于是今天就针对这个分析了一下热更新慢的原因,步骤如下 首先先在package中的启动命令加上 --progress --watch --colors --profile 先解释一下这几个参数的含义 --progress 构建进度 --watch 实时监测 --profile 编译过程中的步骤耗时时间 加上了这几个参数,重启项目,就可以开始观察耗时时间了,修改了某个文件

  • nodemon实现Typescript项目热更新的示例代码

    我们都知道nodemon可以直接用来在开发环境下运行js文件,可以在文件改变时自动刷新和重启服务器.但是最近刚好在学typescript,所以就想使用ts来写,也想达到同样的效果,总结一下方法,大概有如下几种: nodemon+tsc: 这个方法很简单,首先通过tsc将我们的ts文件编译到dist目录下,然后再通过nodemon直接运行dist目录下的文件即可.至于ts的输出目录相关配置可在tsconfig.js中设置. tsc && nodemon --watch dist/index.

  • Cocos2d-x人物动作类实例

    我们玩的游戏一般都可以看到精灵的运动,游戏的世界就是一个运动的世界,而所有的这些动作都可以分为一些基本的动作和动作的组合,今天就来学习一下动作类CCAction,首先看一下类之间的继承关系. CCAction类下派生了三个动作类,执行动作的类是CCNode以及它的子类,通过函数runAction()来执行动作,其中CCFiniteTimeAction之下是常用的瞬时动作和延时动作.动作从本质上来说就是改变节点的属性,瞬时动作就是改变这些属性不需要时间,瞬时就完成了,而延时动作改变这些属性需要一些

  • 解决vuecli3.0热更新失效的问题

    webpack的热更新可以说极大地提高了前端的开发效率,以下就是本人遇到的针对vuecli热更新失效的解决方法: 1.检查控制台,编译的时候是否有警告,警告很可能导致热更新的失效 2.vueCli3.0及以上的版本,注意不要用cnpm安装依赖包,要用npm 以上这篇解决vuecli3.0热更新失效的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Cocos2d-x保存用户游戏数据CCUserDefault类使用实例

    我们可以利用这个类来保存我们的游戏数据,下面的代码是具体的用法. bool HelloWorld::init() { ////////////////////////////// // 1. super init first if ( !CCLayer::init() ) { return false; } bool bvalue = true; int ivalue = 100; float fvalue = 3.14f; double dvalue = 3.1415926; std::str

随机推荐