PHP实现TCP实例

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: PHP实现TCP实例

NotifyService.php

class NotifyService extends Model
{
    private static $client;
    private static $redis;
    /**
     * 初始化
     */
    protected static function initial()
    {
        $url          = 'tcp://' . config('ctrl_service.host') . ':' . config('ctrl_service.port');
        self::$client = @stream_socket_client($url, $errno, $errmsg, 1);
        if (!self::$client) {
            return false;
        }
        return true;
    }
/**
     * redis连接
     * 接口并发量较高的时候容易造成TIMEWAIT过多
     * 尽量避免多次进行连接
     */
    private static function redisConnect()
    {
        // 判断是否使用redis 做缓存 如果有连接过
        // if (config('cache.type') == 'redis') {
        //     // redis 连接 判断是否有已经连接过
        //     $cache = Cache::init();
        //     // 获取缓存对象句柄
        //     $handler     = $cache->handler();
        //     self::$redis = $handler;
        //     return;
        // }
        self::$redis = new Redis();
        $host        = Env::get('redis.host', '127.0.0.1'); // redis 主机ip
        $port        = Env::get('redis.port', 6379); // redis 端口
        $password    = Env::get('redis.password', '123456'); // redis 密码
        $select      = Env::get('cache.select', 0); // 数据库
        // 第一个参数为redis服务器的ip,第二个为端口
        // self::$redis->connect($host, $port);
        self::$redis->pconnect($host, $port);
        self::$redis->auth($password); //密码验证
        self::$redis->select($select); //选择数据库
    }
    /**
     * redis断开
     */
    public static function redisClose()
    {
        self::$redis->close();
    }
/**
     * app 通知
     */
    public static function appNotify($content, $uid = 0)
    {
        if (!self::initial()) {
            return false;
        }
        $post_data = [
            'cmd'       => 1010,
            'type'      => 'notice',
            'uid'       => (int) $uid,
            'msgid'     => 88, // 88是于客户端约定的标识
            'content'   => json_encode($content),
            'loopcount' => 1,
            'gid'       => 0,
            'roomno'    => 0,
            'interval'  => 1,
        ];
        return self::sendMsg($post_data);
    }
/**
     * 发送消息给控制服转发到游服
     */
    public static function sendMsg($data)
    {
        // 添加一层外壳转发
        $msg = [
            'content' => $data,
            'type'    => 'forwarding',
        ];
        $msg = json_encode($msg);
        $msg .= "\n";
        return fwrite(self::$client, $msg);
    }
/**
     * 通知中间件配置相关
     */
    public static function middleNoticeConfigInit($data, $redis_subscribe = 'middle_config')
    {
        self::redisConnect();
        $data = json_encode($data);
        $res  = self::$redis->publish($redis_subscribe, $data);
        self::redisClose();
    }
}

NotifyService::appNotify(['type' => 'other_close'], $uid);

// 通知中间件重新获取配置

NotifyService::middleNoticeConfigInit(['type' => 'init_robot_uids']);



相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
4月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
83 4
|
2月前
|
PHP
PHP的pcntl多进程用法实例
PHP使用PCNTL系列的函数也能做到多进程处理一个事务。
37 12
|
3月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
4月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
4月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
59 2
|
8月前
|
网络安全 PHP
[网络安全/CTF] BUUCTF极客大挑战2019PHP解题详析(Dirsearch使用实例+php反序列化)
[网络安全/CTF] BUUCTF极客大挑战2019PHP解题详析(Dirsearch使用实例+php反序列化)
202 0
|
存储 网络安全 PHP
[CTF/网络安全]攻防世界unserialize3解题详析及php序列化反序列化实例讲解
序列化是指将数据结构或对象转换为可传输或可存储的格式的过程。这通常需要将数据转换为字节流或其他形式的编码格式,以便能够在不同的系统和应用程序之间进行传输或存储。
398 0
|
网络协议 网络安全 C++
TCP/IP编程调用Windows的库实现UDP网络通信(代码实例)
UDP协议的实现: UDP协议是基于IP的。(本文采用Qt进行开发实现,且结合了C/C++混合编程的知识)
355 0
TCP/IP编程调用Windows的库实现UDP网络通信(代码实例)
|
安全 PHP
CTF-PHP常见考点实例小结
CTF-PHP常见考点实例小结
CTF-PHP常见考点实例小结
|
算法 PHP 数据安全/隐私保护
AES-128-CBC-Pkcs7Padding加密PHP实例
AES-128-CBC-Pkcs7Padding加密PHP实例
516 0
AES-128-CBC-Pkcs7Padding加密PHP实例