php多线程操作数据库(转)
PHP用pcntl可以实现多线程操作数据库。直接上代码,逻辑自己研究喽。
示例代码为:
/**
* 并发多线程运行任务,把任务拆解成区块,用多线程去并发执行
* @param callable $exeWorkers [任务函数体]
* @param [type] $maxJob [最大数量]
* @param [type] $threadNum [线程数量]
*/
function runJobWithThread(callable $exeWorkers,$maxJob,$threadNum)
{
$pids = array(); for($i = 0; $i < $threadNum; $i++){ $pids[$i] = pcntl_fork(); switch ($pids[$i]) {
case -1:
echo "fork error : {$i} \r\n";
exit; case 0:
$totalPage=ceil($maxJob / $threadNum);
$param = array(
//'lastid' => $maxJob / $threadNum * $i,
//'maxid' => $maxJob / $threadNum * ($i+1), 'page_start' => $totalPage*$i,
'page_end' => $totalPage*($i+1),
); $exeWorkers($param);
exit; default:
break;
} } foreach ($pids as $i => $pid) {
if($pid) {
pcntl_waitpid($pid, $status);
}
}
}
使用时:
//1000个任务,10个线程
runJobWithThread(function($para){
echo '进程ID:'.getmypid().',最小ID是【'.$para['page_start'].'】最大ID为:【'.$para['page_end'].'】'.PHP_EOL;
},1011,10);
可以实现多线程操作数据。
并发链接数据库时,可以通过设置线程ID实现并发链接。
具体代码类似:
class DB {
public static function getInstance()
{
static $instances = array();
$key = getmypid();
if (empty($instances[$key]))
{
$instances[$key] = new DB();
}
return $instances[$key];
}
}
只放代码,具体可以自己尝试一下,并发操作数据库可以极大的提高处理数据的性能,在定时任务和数据处理的时候非常有用。
php多线程操作数据库(转)的更多相关文章
- sqlite:多线程操作数据库“database is locked”解决方法(二)
上一篇博客<sqlite:多线程操作数据库“database is locked”解决方法>通过注册延时函数的方法来处理数据库被锁的问题.此方法固然能解决问题,但是在多个线程向数据库写入大 ...
- python 多线程操作数据库
如果使用多线程操作数据库,容易引起多用户操作锁表 OperationalError: (2013, 'Lost connection to MySQL server during query') 使用 ...
- sqlite:多线程操作数据库“database is locked”解决方法
1. 使sqlite支持多线程(不确定是否非加不可,暂且加上,以备后患) 可以在编译时/启动时/运行时选择线程模式,参考:http://www.cnblogs.com/liaj/p/4015219.h ...
- Qt 多线程与数据库操作需要注意的几点问题(QSqlDatabase对象只能在当前线程里使用)
彻底抛弃MFC, 全面应用Qt 已经不少时间了.除了自己看书按步就班做了十几个验证性的应用,还正式做了3个比较大的行业应用,总体感觉很好.Native C++ 下, Qt 基本是我用过的最简便的界面库 ...
- Qt 多线程与数据库操作需要注意的几点问题
源地址:http://blog.csdn.net/goldenhawking/article/details/10811409 彻底抛弃MFC, 全面应用Qt 已经不少时间了.除了自己看书按步就班做了 ...
- MFC的多线程操作
记得用MFC做了一个图像自动修复软件,当时没有多线程操作这一概念,由于图像修复算法比较复杂,因此,当执行图像修复时,程序就像卡死了似得而不能做其他操作.其实MFC对这种情况有一种很好地解决方案,那就是 ...
- [R语言]R语言使用多线程对数据库进行大批量访问时出现无法连接问题
问题描述: 在R中使用多线程对数据库进行写入,在服务器端运行脚本(linux环境),总是在第6-7万个任务线程时,出现无法连接到数据库的问题.任务中断,错误信息为task 6xxxx failed,C ...
- 更高效地提高redis client多线程操作的并发吞吐设计
Redis是一个非常高效的基于内存的NOSQL数据库,它提供非常高效的数据读写效能.在实际应用中往往是带宽和CLIENT库读写损耗过高导致无法更好地发挥出Redis更出色的能力.下面结合一些redis ...
- C#多线程操作界面控件的解决方案(转)
C#中利用委托实现多线程跨线程操作 - 张小鱼 2010-10-22 08:38 在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了 ...
随机推荐
- python-flask-1
https://askubuntu.com/questions/244641/how-to-set-up-and-use-a-virtual-python-environment-in-ubuntu ...
- 从零开始创建一个 PHP 扩展
创建一个扩展的基本步骤都有哪些.示例中,我们将实现如下功能: <?phpecho say();?> 输出内容: $ php ./test.php$ hello word 在扩展中实现一个s ...
- JDK源码阅读-Integer
先上一版字符串转数值的几个方法的区别 parseInt(String s),解析字符串数,10进制,返回int parseInt(String s, int radix),解析字符串数,radix为指 ...
- MySQL日志格式 binlog_format
MySQL 5.5 中对于二进制日志 (binlog) 有 3 种不同的格式可选:Mixed,Statement,Row,默认格式是 Statement.总结一下这三种格式日志的优缺点. MySQL ...
- 关于约束ENABLE NOVALIDATE的一个疑问
http://www.dbunix.com/?p=188 关于约束ENABLE NOVALIDATE的一个疑问 CREATE TABLE test (id varchar2(12), name var ...
- spring-boot-starter-actuator监控接口详解
spring-boot-starter-actuator 是什么 一句话,actuator是监控系统健康情况的工具. - 怎么用? 1. 添加 POM依赖 <dependency> < ...
- 最简单的基于FFmpeg的移动端样例:IOS 推流器
===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...
- Xcode6+Cocos2d-x真机调试 报错
眼下真机调试时遇到下面问题. Undefined symbols for architecture arm64: "_png_get_io_ptr", referenced fro ...
- pod install fatal: unable to access 'https://chromium.googlesource.com/webm/libwebp/'
1. 前往文件夹 /用户/aki/.cocoapods/repos/master/1/9/2/libwebp 2.编辑libwebp.podspec.json 将source git 改为 https ...
- iOS总结(自己定义button)
1.首先新建一个类该类继承UIButton 2.实现几个方法 1).改动字体的一些属性 -(instancetype)initWithFrame:(CGRect)frame{ self = [supe ...