php + mongodb 百万级记录批量remove异常问题
2013-09-03 13:32
162 查看
1. 大批量insert,update,remove中可能会因为操作超时而发生异常
在对php+mongodb进行性能测的过程中发现一个问题,mongodb的insert,update,remove等函数有一个默认的30秒超时问题如:$coll->remove();试图使用上面的语句清空coll中的所以记录是,你会发现若果在上面语句的后面加一句:$count = $coll->count();用来测试remove返回时是不是真已经删空了后面这条语句就会触发一个30秒超时的异常,经过研究我发现其实是remove操作超过了30秒,在remove中30秒都还没收到数据库的回应信息,remove将返回(但其实remove这条指令已经下发给数据库,因此删除操作还继续执行)返回后接着执行$count = $coll->count();,但是这里就有问题了,因为这时候remove删除操作没没结束,貌似remove语句给数据库上锁了,$count = $coll->count();执行的时候由于remove操作还没完成,也就是还没解锁,就等呀等呀,30秒超时后抛出异常,终止。remove原型:public bool|array MongoCollection::remove ([ array
array() [, array
array() ]] )这里不知道是我理解的不对还是怎么的,感觉有些坑爹,注意它的参数[
在测试中发现一个郁闷的现象,比如php中有对db执行很大数量的删除或插入操作时,页面卡死在那,等的不赖烦关掉,或者发现操作错误,关掉页面想对数据库进行其他操作,但是若php已经向mongodb发送了remove、insert等指令,并正在执行,那么php页面关闭后,发送给mongo的指令并不会被终止掉,然后就会发现,页面关闭后,还在不停的往数据库中插入、删除数据,这时你就不好再对数据库进行操作,因为前面的操作还没完成,然后就要等呀等呀,对于这个问题目前还没找到解决方法:
关闭php页面后终止php对mongodb的操作。
在对php+mongodb进行性能测的过程中发现一个问题,mongodb的insert,update,remove等函数有一个默认的30秒超时问题如:$coll->remove();试图使用上面的语句清空coll中的所以记录是,你会发现若果在上面语句的后面加一句:$count = $coll->count();用来测试remove返回时是不是真已经删空了后面这条语句就会触发一个30秒超时的异常,经过研究我发现其实是remove操作超过了30秒,在remove中30秒都还没收到数据库的回应信息,remove将返回(但其实remove这条指令已经下发给数据库,因此删除操作还继续执行)返回后接着执行$count = $coll->count();,但是这里就有问题了,因为这时候remove删除操作没没结束,貌似remove语句给数据库上锁了,$count = $coll->count();执行的时候由于remove操作还没完成,也就是还没解锁,就等呀等呀,30秒超时后抛出异常,终止。remove原型:public bool|array MongoCollection::remove ([ array
$criteria=
array() [, array
$options=
array() ]] )这里不知道是我理解的不对还是怎么的,感觉有些坑爹,注意它的参数[
$criteria[
$options]],
$options
是在[[]]内,我理解的是:
如果没有$criteria就不应该设置$options,我测试了一下也是这样的,若果我理解错误了,还望读到次文的同志帮忙提出来,谢谢。基于上面的理解,我们就不能使用如$coll->remove(array("safe"=>true));这样的方法来清空table(我也测过,确实不行),也就是要设置[code]$criteria,但是我们的目的就是清空,若果在做匹配然后再清空我觉得应该会降低这个清空操作的性能,但没办法呀,所以只能是:
#$re_db = $coll->remove(array("app.type"=>"game"),array("safe" => true));[/code]
但是还不够,这样还是没解决问题,需要再为remove设置一个timeout的时间:
$re_db上面的超时设为600秒(timeout单位是毫秒),这样只要你的remove操作能在600秒内完成,就能实现这样的功能:等待remove执行完成后再执行$count = $coll->count();notice:这里的$re_db不能省略2.中断及误操作带来的苦恼
= $coll->remove(array("app.type"=>"game"),array("safe" => true,"timeout"=>6000000));
在测试中发现一个郁闷的现象,比如php中有对db执行很大数量的删除或插入操作时,页面卡死在那,等的不赖烦关掉,或者发现操作错误,关掉页面想对数据库进行其他操作,但是若php已经向mongodb发送了remove、insert等指令,并正在执行,那么php页面关闭后,发送给mongo的指令并不会被终止掉,然后就会发现,页面关闭后,还在不停的往数据库中插入、删除数据,这时你就不好再对数据库进行操作,因为前面的操作还没完成,然后就要等呀等呀,对于这个问题目前还没找到解决方法:
关闭php页面后终止php对mongodb的操作。
相关文章推荐
- 记录一次PHP项目报502的问题
- 工作中遇到的一个相当有意思的问题(关于Windows和linux环境下执行PHP,ajax,javascript,flexigrid的一个莫名异常)
- Apache+PHP,swfupload做批量上传时遇到的文件类型支持问题和文件上传大小限制问题的相应解决方案
- WPF程序异常问题记录
- mysql+php搜索型注入问题记录
- 关于PHP打开之后找不到数据库问题的记录
- LINQ.Contains超过2100记录报异常Exception的问题
- 记录一次解决PHP返回数据被nginx截断的问题
- Web服务器异常问题记录
- PHP批量删除的问题
- 编译php扩展问题记录
- ssm整合过程中问题记录--异常:Access denied for user 'Administrator'@'localhost' (using password: YES)
- marathon异常挂掉问题记录
- php学习笔记:thinkphp问题记录
- 记录一次PHP项目报502的问题
- php 中用户触发错误与记录错误日志及异常处理
- php 面试 本人碰到过的问题 在此做下记录
- PHP中批量更新数据表中多条记录
- PHP 错误与异常 笔记与总结(14 )记录和发送异常信息
- PHP中错误与异常的日志记录用法分析