基于swoole扩展实现真正的PHP数据库连接池

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

PHP的数据库连接池一直以来都是一个难题,很多从PHP语言转向Java的项目,大多数原因都是因为Java有更好的连接池实现。PHP的MySQL扩展提供了长连接的API,但在PHP机器数量较多,规模较大的情况下,mysql_pconnect非但不能节约MySQL资源,反而会加剧数据库的负荷。

假设有100台PHP的应用服务器,每个机器需要启动100个apache或fpm工作进程,那每个进程都会产生一个长连接到MySQL。这一共会产生1万个My SQL连接。大家都知道MySQL是每个连接会占用1个线程。那MYSQL就需要创建1万个线程,这样大量的系统资源被浪费在线程间上下文切换上。而你的业务代码中并不是所有地方都在做数据库操作,所以这个就是浪费的。

连接池就不同了,100个worker进程,公用10个数据库连接即可,当操作完数据库后,立即释放资源给其他worker进程。这样就算有100台PHP的服务器,那也只会创建1000个MySQL的连接,完全可以接受的。

以前确实没有好的办法来解决此问题的,现在有了swoole扩展,利用swoole提供的task功能可以很方便做出一个连接池来。

代码如下:

$serv = new swoole_server("127.0.0.1", 9508); $serv->set(array( 'worker_num' => 100, 'task_worker_num' => 10, //MySQL连接的数量 )); function my_onReceive($serv, $fd, $from_id, $data) { //taskwait就是投递一条任务,这里直接传递SQL语句了 //然后阻塞等待SQL完成 $result = $serv->taskwait("show tables"); if ($result !== false) { list($status, $db_res) = explode(':', $result, 2); if ($status == 'OK') { //数据库操作成功了,执行业务逻辑代码,这里就自动释放掉MySQL连接的占用 $serv->send($fd, var_export(unserialize($db_res), true) . "\n"); } else { $serv->send($fd, $db_res); } return; } else { $serv->send($fd, "Error. Task timeout\n"); } } function my_onTask($serv, $task_id, $from_id, $sql) { static $link = null; if ($link == null) { $link = mysqli_connect("127.0.0.1", "root", "root", "test"); if (!$link) { $link = null; $serv->finish("ER:" . mysqli_error($link)); return; } } $result = $link->query($sql); if (!$result) { $serv->finish("ER:" . mysqli_error($link)); return; } $data = $result->fetch_all(MYSQLI_ASSOC); $serv->finish("OK:" . serialize($data)); } function my_onFinish($serv, $data) { echo "AsyncTask Finish:Connect.PID=" . posix_getpid() . PHP_EOL; } $serv->on('Receive', 'my_onReceive'); $serv->on('Task', 'my_onTask'); $serv->on('Finish', 'my_onFinish'); $serv->start();

这里task_worker_num就是要启用的数据库连接池数量,worker进程为100时,连接池数量为10就可以设置为worker_num = 100, task_worker_num = 10。


======================

php+sqlrelay+mysql实现连接池及读写负载均衡  

http://blog.163.com/e4lich@126/blog/static/848106502011014103645812/















本文转自ljianbing51CTO博客,原文链接:http://blog.51cto.com/ljianbing/1620166 ,如需转载请自行联系原作者








相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
15天前
|
前端开发 网络协议 测试技术
探索PHP的异步编程模型:从React到Swoole
在Web开发领域,PHP一直以简单易用著称。然而,随着互联网应用对性能和并发处理能力的不断追求,传统的同步阻塞式编程模型已逐渐暴露出局限性。本文将深入探讨PHP中的异步编程模型,从早期的React到现代的Swoole,分析其原理、优势及应用场景,并通过实例展示如何利用这些工具提升PHP应用的性能和响应速度。文章旨在为PHP开发者提供一种全新的视角,帮助他们在构建高性能Web应用时做出更合理的技术选择。
14 0
|
10天前
|
关系型数据库 分布式数据库 数据库
PolarDB,阿里云的开源分布式数据库,与微服务相结合,提供灵活扩展和高效管理解决方案。
【7月更文挑战第3天】PolarDB,阿里云的开源分布式数据库,与微服务相结合,提供灵活扩展和高效管理解决方案。通过数据分片和水平扩展支持微服务弹性,保证高可用性,且兼容MySQL协议,简化集成。示例展示了如何使用Spring Boot配置PolarDB,实现服务动态扩展。PolarDB缓解了微服务数据库挑战,加速了开发部署,为云原生应用奠定基础。
83 3
|
17天前
|
SQL 缓存 PHP
PHP 与数据库优化:提升Web应用性能的关键
在Web开发中,PHP作为一种流行的服务器端脚本语言,与数据库密切相关。本文探讨了如何通过PHP与数据库优化来提升Web应用的性能和响应速度。从数据库查询优化、索引的设计到PHP代码编写的最佳实践,我们将深入探讨每个方面如何影响应用的效率和用户体验。
|
23天前
|
SQL 监控 安全
代码审计-PHP原生开发篇&SQL注入&数据库监控&正则搜索&文件定位&静态分析
代码审计-PHP原生开发篇&SQL注入&数据库监控&正则搜索&文件定位&静态分析
|
1月前
|
运维 JavaScript Serverless
Serverless 应用引擎产品使用合集之php工程已经部署,可以正常访问数据库,静态资源样式无法正常加载,要怎么配置
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
Serverless 应用引擎产品使用合集之php工程已经部署,可以正常访问数据库,静态资源样式无法正常加载,要怎么配置
|
15天前
|
存储 SQL PHP
PHP中的PDO与数据库交互
PHP的PDO扩展提供了一种方式来统一访问多种数据库
|
16天前
|
SQL 关系型数据库 MySQL
php mysqli操作数据库
php mysqli操作数据库
18 0
|
1月前
|
Ubuntu 中间件 Linux
linux php添加扩展zip libzip ZipArchive功能
linux php添加扩展zip libzip ZipArchive功能
22 1
|
1月前
|
Ubuntu 关系型数据库 MySQL
ubuntu apt 安装wordpress所需所有的 一键脚本 扩展您的PHP似乎没有安装运行WordPress所必需的MySQL扩展。
ubuntu apt 安装wordpress所需所有的 一键脚本 扩展您的PHP似乎没有安装运行WordPress所必需的MySQL扩展。
23 0
ubuntu apt 安装wordpress所需所有的 一键脚本 扩展您的PHP似乎没有安装运行WordPress所必需的MySQL扩展。
|
2月前
|
负载均衡 关系型数据库 数据管理
关系型数据库的横向扩展
【5月更文挑战第2天】关系型数据库的横向扩展
46 6
关系型数据库的横向扩展