博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php通过共享内存,控制mysql连接数,多进程插入数据(pcnt学习四)
阅读量:6430 次
发布时间:2019-06-23

本文共 2358 字,大约阅读时间需要 7 分钟。

本人前一遍blog中提到,当进程数过多时,多进程插入mysql数据库表,超过了mysql最大连接数,就会报错,插入就会有失败的情况。想通过进程间通信来控制一下连接数,参考了一些

实现了一下,利用共享内存来存放mysql的连接数,当某个进程在获取信号量后,尝试去连接数据库之前,先判断一下,当前的连接数是否超过了预定的阈值,如果没有,就连接数据库,连接成功后,连接数加一,立马释放信号,等操作数据库完毕后,进程再次阻塞,来获取信号,然后把连接数减一,释放信号量后,进程退出。
这样就可以控制有mysql的连接数不会达到上限,程序不会出现连接数据库失败的情况。当然我可以直接少fork一些进程,本人就是觉得要折腾一下。不然进程通信就懵逼了。而且也不会有以下的问题出现。
但是本人实验,fork一万个子进程,虚拟机很容易就挂了。后来该为fork 5000个子进程,插入一百万条数据,模拟的是最原始的插入。虚拟机虽然没有崩, 但是很卡,期间会出现很多僵尸进程,这里有点疑问。
多进程耗内存比较严重,下一步打算用多线程来试试。
ps:要支持Semaphore函数,php在编译安装是要加上如下参数:

--enable-sysvsem--enable-sysvshm--enable-sysvmsg

为此,我还重新编译了php。。。。蛋疼啊。代码如下:

0) { //$id = pcntl_wait($status,WNOHANG); $child[] = $pid; } else if ($pid == 0) { while(true) { // 获得信号量 sem_acquire($signal); $count = shm_get_var($shm_id, SHARE_KEY); if ($count >= $poolSize) { sem_release($signal); continue; } else { $link = mysqli_connect('localhost','root','root','yii2advanced'); if ($link) { $count++; shm_put_var($shm_id,SHARE_KEY,$count); sem_release($signal); $start = ($i-1)*$per + 1; $end = $start + $per; for($j = $start; $j< $end; $j++){ $time = microtime(true); $sql = 'insert pcntl_test (rank,time) values ('.$j.','.$time.')'; mysqli_query($link,$sql); } mysqli_close($link); break; } } sleep(1); } sem_acquire($signal); $count = shm_get_var($shm_id,SHARE_KEY); $count--; shm_put_var($shm_id, SHARE_KEY, $count); sem_release($signal); $id = getmypid(); $count++; echo 'count : '.$count.' child '.$id.' finished '.microtime(true).PHP_EOL; exit(0); }}while(count($child)){ foreach($child as $k => $pid) { $res = pcntl_waitpid($pid, $status, WNOHANG); if ( -1 == $res || $res > 0) { unset($child[$k]); } }}$end = microtime(true);echo 'end '.$end.PHP_EOL;echo 'fork '.$num.'process insert '.$total.' recodes takes '.($end-$begin).PHP_EOL;

最后,我统计分析了一下5千个进程,一百万条记录,插入时,mysql的连接数情况(平均连接数为464),用python作图如下:

图片描述

转载地址:http://wbiga.baihongyu.com/

你可能感兴趣的文章
张小龙莫慌 马化腾莫急 你们要好好的 微信还有时间
查看>>
一些常用软件静默安装参数(nsis,msi,InstallShield ,Inno)
查看>>
部署mimic版本的Ceph分布式存储系统
查看>>
Java缓冲流细节
查看>>
IOS中复制对象的用法及深拷贝和浅拷贝详解
查看>>
lfs
查看>>
Eclipse内存不够解决办法
查看>>
关于tbody js取法兼容。
查看>>
[CC]点云密度计算
查看>>
CATransition 动画处理视图切换
查看>>
[转载] 高等应用数学问题的matlab求解——第3章 微积分问题的计算机求解
查看>>
大整数比较大小
查看>>
C++ 指定路径文件夹存在与否查询及文件夹创建
查看>>
八大排序算法的Java实现
查看>>
IDEA+Maven+Tomcat构建项目流程
查看>>
java 线程机制
查看>>
数据是重要的战略资源,数据同样是产品非常重要的组成部分。淘宝对中国最大的贡献,不只是方便了老百姓购物,而是把中国消费者的消费习惯数据慢慢沉淀下来。...
查看>>
Leetcode Find Minimum in Rotated Sorted Array
查看>>
Python接口测试-使用requests模块发送post请求
查看>>
System.currentTimeMillis()计算方式与时间的单位转换
查看>>