Swoole

swoole+websocket+redis实现一对一聊天

若如初见. 提交于 2020-07-28 10:48:42
如同web端的QQ和微信一样,这是一个web端的聊天程序。 环境:linux(centos) + php7.2 + swoole扩展 + redis + mysql Redis 实现每个连接websocket的服务都唯一绑定一个用户。通过 用户账号 = websocket fd 存到redis中。 Mysql 实现离线消息池。如果一个用户不在线,则其他用户发送给他的消息暂时存储在mysql。待该用户上线时,再从离线消息池取出发送。 此处是看了 还是感谢大神。 具体参考代码和相应注释: 服务端代码: <? php $server = new swoole_websocket_server("0.0.0.0", 9052 ); $redis = new Redis(); $redis ->connect('127.0.0.1', 6379 ); $db = new mysqli('127.0.0.1', 'test', 'test', 'thinkphp5' ); $server ->on('open', function (swoole_websocket_server $server , $request ) { echo "server: handshake success with fd{ $request ->fd}\n"; // $request->fd 是客户端id })

PHP 中的多进程使用,进程通信、进程信号等详解

三世轮回 提交于 2020-07-28 08:46:31
多进程环境要求 Linux 系统 php-cli 模式 pcntl 扩展 或 swoole 扩展 pcntl 扩展 <?php $str = "hello world!" . PHP_EOL; // 派生一个子进程,子进程会复制主进程中的上下文 // pcntl_fork 函数在主进程中返回子进程的进程ID,在子进程返回0,失败在主进程返回-1 $pid = pcntl_fork(); // 这里开始的代码,会被主进程、子进程共同执行 echo $str; if($pid > 0) { echo "我是主进程,子进程的pid是{$pid}" . PHP_EOL; } elseif($pid == 0) { echo "我是子进程,我的pid是". getmypid() . PHP_EOL; }else{ echo "我是主进程,开启子进程失败" . PHP_EOL; } swoole 扩展 <?php use Swoole\Process; $str = "hello world!" . PHP_EOL; // 实例化一个进程类 $process = new Process(function() use($str) { echo $str; echo "我是子进程,我的pid是" . getmypid() . PHP_EOL; }); // 开启子进程,成功返回子进程的PID

江娱互动「世界争霸」产品迁移至腾讯云云函数的实践

你。 提交于 2020-07-28 07:52:31
社交,是游戏玩家的一项基本需求,那么,在游戏中,成熟稳定的聊天系统担负着玩家交流的重要使命。 做为一家从不 996 的游戏创业公司,我们的两款产品《世界争霸》和《农场小镇》都在使用自研的聊天系统。随着在线人数逐渐增多,系统的稳定性和成本面临着更多的考验。于是,升级技术栈势在必行。 至此,核心目标已经出现,以保障性能为前提,同时做到省事和省钱。最终,腾讯云的云函数产品进入了我们的视线。 云函数,无需服务器,省去运维烦恼,只需要关注于业务逻辑代码,可谓省事。按量付费,用多少花多少,避免业务低谷期的资源浪费,可谓省钱。非常适合游戏聊天系统 API 这种复杂度低的中小型需求。 那么接下来我们关注的是,现有系统能不能无缝迁移过去,也就是云函数能不能满足目前所有的特定需求,我们一个一个来说。 第一个需求:少改代码 原来的 API 部分是采用 swoole 做为底层扩展,部署在腾讯云的 CVM 上,并使用腾讯云的负载均衡来接收外部请求。代码层面则是使用了 composer 进行包管理,一款开源的 easyswoole 框架做为 http 业务的架子。 换用云函数的方案的话,非代码层面就变成了腾讯云 API 网关加云函数来提供服务,而为了方便,依然需要继续使用 composer 进行包管理。原来基于 swoole 的 http 框架无法继续使用,改代码的重点就在这里。 首先就是逻辑入口

Laravel模型事件的实现原理详解

旧巷老猫 提交于 2020-07-28 03:59:16
模型事件在 Laravel 的世界中,你对 Eloquent 大多数操作都会或多或少的触发一些模型事件,下面这篇文章主要给大家介绍了关于Laravel模型事件的实现原理,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴。 前言 Laravel的ORM模型在一些特定的情况下,会触发一系列的事件,目前支持的事件有这些:creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored,那么在底层是如何实现这个功能的呢? 下面话不多说了,来一起看看详细的介绍吧。 一.如何使用模型事件 先来看看如何使用模型事件,文档里面写了两种方法,实际上总共有三种方式可以定义一个模型事件,这里以saved事件来做例子,其他事件都一样。 1.events属性 直接上代码: class User extends Authenticatable { use Notifiable; protected $events = [ 'saved' => UserSaved::class, ]; } 这个比较难以理解,而且文档并没有详细说明,刚开始以为saved被触发后会调用UserSaved里面的handle方法,实际上并不是。这个数组只是对事件做的一个映射

php实时推送系统消息给客户端

人走茶凉 提交于 2020-07-27 21:56:43
在我们实际开发过程中,有些数据需要实时获取。 比如erp系统中的订单信息,OA系统中的流程审批等都需要及时处理,这时我们就不能再使用http协议了; 当然也可以使用轮询的机制。但是轮询请求中有大半是无用,浪费带宽和服务器资源, 这时我们就得使用websocket协议来满足这种业务需求。 准备工作: 安装PHP-swoole拓展; 直接贴代码: <?php new class { private $_serv = null ; public function __construct () { $this -> _serv = new swoole_websocket_server ( '0.0.0.0' , 6552 ); $this -> _serv -> set ( array ( 'worker_num' => 2 , 'dispatch_mode' => 3 , 'log_file' => 'swoole.log' , )); //增加个监听端口 $udpworker = $this -> _serv -> listen ( "127.0.0.1" , 6553 , SWOOLE_SOCK_UDP ); $udpworker -> on ( 'Packet' , function ( $serv , $data , $addr ) { $data = json_decode

mysql 悲观锁与乐观锁的详解

空扰寡人 提交于 2020-07-27 15:02:01
悲观锁与乐观锁是人们定义出来的概念,你可以理解为一种思想,是处理并发资源的常用手段。 不要把他们与mysql中提供的锁机制(表锁,行锁,排他锁,共享锁)混为一谈。 一、悲观锁 顾名思义,就是对于数据的处理持悲观态度,总认为会发生并发冲突,获取和修改数据时,别人会修改数据。所以在整个数据处理过程中,需要将数据锁定。 悲观锁的实现,通常依靠数据库提供的锁机制实现,比如mysql的排他锁,select .... for update来实现悲观锁。 例子:商品秒杀过程中,库存数量的减少,避免出现超卖的情况。 CREATE TABLE `tb_goods_stock` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `goods_id` bigint(20) unsigned DEFAULT '0' COMMENT '商品ID', `nums` int(11) unsigned DEFAULT '0' COMMENT '商品库存数量', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `modify_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY

位运算在 PHP 实际项目当中的运用

放肆的年华 提交于 2020-07-27 08:49:35
来回顾一下这些基础知识,同时也会讲位运算在 PHP 实际项目当中的高级技巧。 一、位运算知识回顾 PHP 手册当中,专门对位运算及位运算符进行了使用介绍。 https://www. php.net/manual/zh/langu age.operators.bitwise.php 1) 按位与运算符:& 之所以称为位运算,指的是在运算过程中,我们会把两组需要位运算的数值进行二进制化,然后两组二进制的数字从低位向左对齐。这里的位指的是二进制数字的位置。而按位与运算符指的是两组数值每一位相与,同为 1 则 结果为 1,否则为 0。 看 PHP 示例: echo 1 & 3; // 输出:1 为什么会输出 1 呢? 那是因为: 1 的二进制表示结果为:01。 3 的二进制表示结果为:11。 那么这两组二进制结果对齐之后的运算流程如下: 01 11 —— 01 从右往左进行位运算,都 为 1 则结果为1,否则为 0。结果自然是 01。而 01 转换成十进制就是 1 。所以,输出的结果为 1。 再看一组示例吧: echo 2 & 10; // 输出:2 我们来看看运算过程: 10 1010 —————— 0010 0010 转换成十进制就是 2。 一定要记得是向左对齐。或者称为低位顺位对齐模式。 如果你不会十进制转二进制或二进制转十进制不会。那么,下面这两个方法能帮助你。 echo

RabbitMQ 清除全部队列及消息

£可爱£侵袭症+ 提交于 2020-07-25 14:31:52
前言 安装RabbitMQ后可访问:http://{rabbitmq安装IP}:15672使用(默认的是帐号guest,密码guest。此账号只能在安装RabbitMQ的机器上登录,无法远程访问登录。) 远程访问登录,可以使用自己创建的帐号,给与对应的管理员权限即可。 直接在管理页面删除 访问http://{rabbitmq安装IP}:15672,登录。 点击queues,这里可以看到你创建的所有的Queue, 选中某一个Queue,下方有个Delete Queue删除队列/Purge Message清除消息。 但是这样只能一个队列一个队列的删除,如果队列中的消息过多就会特别慢。 命令行批量删除 首先定位到 rabbitMQ 安装目录的sbin 目录下。打开cmd窗口。 关闭应用的命令为: rabbitmqctl stop_app 清除的命令为: rabbitmqctl reset 重新启动命令为: rabbitmqctl start_app ps 查看所有队列命令: rabbitmqctl list_queues 注意 命令行批量删除相当于重置RabbitMQ,请谨慎操作,配置和队列都会被清除。 操作完成,记得添加远程访问账号。 以上内容希望帮助到大家, 很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料

PHP PDO与mysql的连接单例防止超时情况处理

自作多情 提交于 2020-07-25 05:32:41
这个数据库类主要处理了单例模式下创建数据库对象时,如果有两次较长时间的间隔去执行sql操作,再次处理会出现连接失败的问题,利用一个cache数组存放pdo对象与时间戳,把两次执行之间的时间进行了比较,如果间隔超过了10秒就再次new PDO创建连接,没有超过的情况下会继续使用原来的连接,并且因为每次使用后会使连接续期,cache数组里的时间戳也进行了续期. 每次执行操作都会从cache数组中获取下连接,多次执行不超过10秒的情况下,只会有一个连接 代码中实现读写分离,判断sql语句前面6个字符是select的就查询从库,其余操作查询主库.主库和从库就是分别在配置数组中0和1创建不同的PDO对象连接 代码如下: <?php class SinaPdoAdapter{ const MASTER = 0; const SLAVE = 1; const DEFAULT_CACHE_EXPIRETIME = 10; private static $options = array( PDO::ATTR_AUTOCOMMIT => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //PDO::ATTR_PERSISTENT => true, )

Mac系统下 PHP7安装Swoole扩展 教程

给你一囗甜甜゛ 提交于 2020-05-09 21:42:58
转载自 https://www.fujieace.com/php/php-extensions/swoole.html 今天我用的PHP版本是:PHP7.1 环境依赖: php-5.3.10 或更高版本 gcc-4.4 或更高版本 make autoconf Swoole下载地址 :https://github.com/swoole/swoole-src/releases 1、下载源代码包后,在终端进入源码目录,执行下面的命令进行编译和安装: cd swoole phpize ./configure make sudo make install 2、修改php.ini加入: extension=swoole.so 3、检测扩展是否安装成功? php -m 谈谈我用PHP7在安装Swoole扩展所遇到的问题 1、Operation not permitted 这个是macos新版本中的引入了** Rootless**策略,我们会对一些系统的目录没有操作的权限,即使是root用户也不行(一定是个假root)。 暂时关闭的方法是关机重启后按住command + R 别松手 ,进入安全模式。 在安全模式下打开终端,输入下面命令后重新启动即可! csrutil disable 开启: csrutil enable 2、查看php.ini 的路径: php --ini 默认是在 /etc