内容简介:从 2.1.2 版本开始,Swoole 开始支持进程池功能,该功能基于下面我们来看一个简单的异步进程池实现示例,通过监听注:上述代码需要安装
Swoole 进程池的简单实现
从 2.1.2 版本开始,Swoole 开始支持进程池功能,该功能基于 Server
的 Manager
模块实现,可用于管理多个工作进程。相比 Process
实现多进程, Process\Pool
更加简单,封装层次更高,开发者无需编写过多代码即可实现进程管理功能。
下面我们来看一个简单的异步进程池实现示例,通过监听 WorkerStart
事件启动 Redis 进程池,并且在 WorkerStop
时断开所有连接:
<?php $workerNum = 5; $pool = new Swoole\Process\Pool($workerNum); $pool->on("WorkerStart", function ($pool, $workerId) { echo "Worker#{$workerId} is started\n"; $redis = new Redis(); $redis->pconnect('127.0.0.1', 6379); $key = "key1"; while (true) { $msgs = $redis->brpop($key, 2); if ( $msgs == null) continue; var_dump($msgs); echo "Processed by Worker#{$workerId}\n"; } }); $pool->on("WorkerStop", function ($pool, $workerId) { echo "Worker#{$workerId} is stopped\n"; }); $pool->start();
注:上述代码需要安装 PHP Redis 扩展 才能生效。
将上述代码保存到 process/pool.php
,可以看到,我们在上述 Redis 进程池中维护 5 个 Redis 连接,在 WorkerStart
时通过 pconnect
函数建立与 Redis 服务器的长连接,然后监听连接,如果列表 key1
中有数据的话,将其取出并打印出来,哪个连接进程先读取到数据则进行处理。
我们在本地启动这个进程池:
php process/pool.php
然后新建一个 Terminal 窗口,通过 ps -ef | grep php
即可看到运行的 PHP CLI 进程:
然后通过 redis-cli
启动 Redis 客户端,往 key1
列表推送数据:
在运行 php process/pool.php
的窗口即可看到打印的结果:
具体由哪个进程处理是随机的,谁先拿到数据谁处理,显然,使用进程池的方式可以维护多个长连接,避免了每次请求重复建立连接的开销,提供了系统的性能和并发性,而在传统的 PHP-FPM 模式中,每次 HTTP 请求都会创建新的 Redis 连接。
在 Laravel 中实现数据库和 Redis 的持久连接
在 Laravel 项目中,如果使用了 LaravelS 扩展包 ,则只需要在 config/database.php
中启用 MySQL 和 Redis 的持久连接配置接即可实现二者的持久连接:
// 数据库持久连接配置 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), PDO::ATTR_PERSISTENT => true ]) : [], ], // Redis 持久连接配置 'redis' => [ ... 'default' => [ 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => env('REDIS_DB', 0), 'persistent' => true ], ... ]
因为基于 Swoole 的 HTTP 服务器会持久化对象,在已启动的 Swoole 服务器进程中,Redis 和 MySQL 连接实例会一直存在,知道进程退出,并且 LaravelS 会在自动维护 MySQL 的连接状态,一旦断开,会立即重连,而 Redis 持久连接状态则不会自动维护,断开时会抛出异常,需要开发者自行维护持久连接的异常断开情况。
所以,LaravelS 只提供了对数据库和 Redis 的持久连接支持,并没有维护相应的进程池,不过,持久连接已经大大优于 PHP-FPM 模式下每次请求需要新建连接的性能了,如果你的系统并发量更大,则可以考虑监听 Swoole 的WorkerStart 事件来启动进程池维护多个长连接,对于 MySQL 数据库,有现成的SMProxy 扩展包可供使用,感兴趣的同学可以去看看。
以上所述就是小编给大家介绍的《基于 Swoole 构建高性能 Laravel 应用系列 —— 基于 Process\Pool 通过进程池实现数据库和 Redis 的...》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 构建高性能ASP.NET站点(上)
- 《高性能linux服务器构建实战》
- 构建高性能ASP.NET站点(下)
- 构建高性能ASP.NET站点(中)
- 如何构建基于 Ceph 的高性能云存储解决方案?
- 高阶:腾讯新闻构建高性能的 react 同构直出方案
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
编写可读代码的艺术
Boswell, D.、Foucher, T. / 尹哲、郑秀雯 / 机械工业出版社 / 2012-7-10 / 59.00元
细节决定成败,思路清晰、言简意赅的代码让程序员一目了然;而格式凌乱、拖沓冗长的代码让程序员一头雾水。除了可以正确运行以外,优秀的代码必须具备良好的可读性,编写的代码要使其他人能在最短的时间内理解才行。本书旨在强调代码对人的友好性和可读性。 本书关注编码的细节,总结了很多提高代码可读性的小技巧,看似都微不足道,但是对于整个软件系统的开发而言,它们与宏观的架构决策、设计思想、指导原则同样重要。编......一起来看看 《编写可读代码的艺术》 这本书的介绍吧!