免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5121 | 回复: 16
打印 上一主题 下一主题

php gearmand 大并发的哥们关注下,谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-24 18:11 |只看该作者 |倒序浏览
php gearmand 大并发后报这个错误,哪个英雄哥遇到过,分享一下解决经验。。谢谢!
>Message:  GearmanClient::doBackground(): gearman_con_read:lost connection to server (104)

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2012-09-24 18:38 |只看该作者
服务端连接关闭, 看一下Gearmand服务端的配置, 是否限制了连接数.

论坛徽章:
0
3 [报告]
发表于 2012-09-25 09:12 |只看该作者
本帖最后由 sickcat2004 于 2012-09-25 09:13 编辑
linux_c_py_php 发表于 2012-09-24 18:38
服务端连接关闭, 看一下Gearmand服务端的配置, 是否限制了连接数.


geamand 没有配置文件

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
4 [报告]
发表于 2012-09-25 12:28 |只看该作者
看了一下, 是一个rpc extension, 你的worker进程开了几个? 单循环Loop accept?

论坛徽章:
0
5 [报告]
发表于 2012-09-25 17:21 |只看该作者
linux_c_py_php 发表于 2012-09-25 12:28
看了一下, 是一个rpc extension, 你的worker进程开了几个? 单循环Loop accept?


谢谢兄台的更近,比较忙没有及时反馈,惭愧!

gearmand 3台,跑在centos 5.5下
每台6个workers,
一共18个,当我并发在2500以上以后,
出现 本出题php警告。。。。
我是用php 前端curl 请求 php worker 脚本处理的。。。。
我怀疑是不是机器资源不够,但是 top cup 都在65%以下!
搜索了各大论坛。。相关的讨论几乎没有,
没时间看geamand的源代码,我以为它一直很稳定!

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
6 [报告]
发表于 2012-09-25 17:33 |只看该作者
为什么php是用curl请求php worker呢, gearmand不是有开发接口吗, 你这个中途又走了什么中间代理吗

论坛徽章:
0
7 [报告]
发表于 2012-09-25 18:33 |只看该作者
linux_c_py_php 发表于 2012-09-25 17:33
为什么php是用curl请求php worker呢, gearmand不是有开发接口吗, 你这个中途又走了什么中间代理吗


oh, 是这样,我这是一个计数器,类似文章点击率或者微博粉丝数目什么的,是提供 web serviec api的方式:


前端开发人员 功过  ajax,curl的get或者post方式传送数据给php脚本服务端,然后我在服务端脚本里接受参数
,我上代码吧!
  1. class Hit extends CI_Controller {
  2.         private $_data=array();

  3.         private function _echo($msg="ok",$errno=1,$data=array()){
  4.                 $re = array();
  5.                 $re['msg']=$msg;
  6.                 $re['state']=$errno;
  7.                 $re['data']=$data;
  8.                 $this->re_json($this->_data['callback'],json_encode($re));
  9.                 exit;
  10.         }
  11.         private function re_json($callback,$json_re)
  12.         {
  13.                 //__DEBUG__ AND $json_re="'".$json_re."'";
  14.                 $this->_data['fe_debug'] AND $json_re="'".$json_re."'";
  15.                 if($callback){
  16.                         echo $callback."(".$json_re.")";
  17.                 }else{
  18.                         echo $json_re;
  19.                 }   
  20.         }

  21.         private function init(){
  22.                 $this->_data['callback']="";
  23.                 $this->_data['platform_name']="";
  24.                 $this->_data['platform_id']=0;
  25.                 $this->_data['object_id'] =0;
  26.                 $this->_data['event_id'] = 0;
  27.                 $this->_data['fe_debug']=0;

  28.         }
  29.         public function insert(){//new_click
  30.                 $this->init();
  31.                 isset($_REQUEST['callback']) AND $this->_data['callback']=$_REQUEST['callback'];
  32.                 isset($_REQUEST['debug']) AND $this->_data['fe_debug']=intval($_REQUEST['debug']);
  33.                 $data = array();
  34.                 isset($_REQUEST['callback']) AND $data= $this->input->get();
  35.                 $data OR $data = $this->input->post();
  36.                 $data OR $data = $this->uri->uri_to_assoc();
  37.                 $data = $this->check_data($data);
  38.                  $data_=array();
  39.                 $data_['platform_id']=$data['platform_id'];
  40.                 $data_['object_id']=$data['object_id'];
  41.                 $data_['event_id']=$data['event_id'];
  42.                 $this->in_queue($data_);

  43.         }
  44.         private function check_data($data){
  45.                 if(empty($data) OR !is_array($data)){
  46.                         $this->_echo("no any data","-400");
  47.                 }
  48.                 $event_id=0;
  49.                 $object_id=0;
  50.                 $platform_name="";
  51.                 extract($data);
  52.                 //isset($callback) AND $this->_data['callback']=$callback;
  53.                 isset($platform_name) AND $this->_data['platform_name']=$platform_name;
  54.                 isset($object_id)  AND  $this->_data['object_id']=intval($object_id);
  55.                 isset($event_id) AND   $this->_data['event_id']=intval($event_id);
  56.                 if(!$this->_data['platform_name']){
  57.                         $this->_echo("platform_name is NULL",-5);
  58.                 }
  59.                 //print_r($event_id);
  60.                 global $g_platform_list,$g_event_list;
  61.                 if(!$platform_id=array_search($platform_name,$g_platform_list)){
  62.                         $this->_echo("platform_name error",-1);
  63.                 }
  64.                 if(!array_key_exists( intval($event_id),$g_event_list) ){
  65.                         $this->_echo("event_id error",-2);
  66.                 }
  67.                 if(!intval($object_id)){
  68.                         $this->_echo("object_id error",-3);
  69.                 }
  70.                 $this->_data['platform_id']=$platform_id;
  71.                 return $this->_data;
  72.         }
  73.         private function in_queue($data){

  74.                 global $g_gearman;
  75.                 $client = new GearmanClient();
  76.                 foreach($g_gearman as $key=>$v){
  77.                         $tmp_array = explode(":",$v);
  78.                         $client->addServer($tmp_array[0],$tmp_array[1]);
  79.                 }
  80.                 $str = json_encode($data);
  81.                 $client->doBackground("in_queue_now",$str);
  82.                 if($client->returnCode() != GEARMAN_SUCCESS){
  83.                         $this->_echo("gearman error",-500);
  84.                 }
  85.                 __DEBUG__ AND  $this->_echo("ok",1,$data);
  86.                 __DEBUG__ OR   $this->_echo("ok",1);
  87.         }
  88. }
复制代码
  1. private function in_queue($data){

  2.                 global $g_gearman;
  3.                 $client = new GearmanClient();
  4.                 foreach($g_gearman as $key=>$v){
  5.                         $tmp_array = explode(":",$v);
  6.                         $client->addServer($tmp_array[0],$tmp_array[1]);
  7.                 }
  8.                 $str = json_encode($data);
  9.                 $client->doBackground("in_queue_now",$str);
  10.                 if($client->returnCode() != GEARMAN_SUCCESS){
  11.                         $this->_echo("gearman error",-500);
  12.                 }
复制代码
look ::::
in_queue 这个私有成员方法里面加入geamand服务器然后 处理的,然后另外一台服务器在从消息队列里面取出数据插入mongo,谢谢跟进!

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
8 [报告]
发表于 2012-09-25 18:38 |只看该作者
本帖最后由 linux_c_py_php 于 2012-09-25 18:39 编辑

知道了, 那你先增加worker进程数, 压力测试一下QPS到多少不响应.

这样实现不行就不能用这个扩展了, 这个gearmand和zeromq工作模式应该是类似的, 没有中心服务器, 可以考虑使用zeromq来做这件事, 如果你能接受有中心服务器的MQ, 可以选择RabbitMQ.

论坛徽章:
0
9 [报告]
发表于 2012-09-25 18:43 |只看该作者
linux_c_py_php 发表于 2012-09-25 18:38
知道了, 那你先增加worker进程数, 压力测试一下QPS到多少不响应.

这样实现不行就不能用这个扩展了, 这个 ...

  多谢建议,我明天用webbench 压一下,
看看能抗多少。。。不行的话,
估计要考虑水平扩展worker和gearmand server ,
现在换另外的消息队列,估计boss不同意了。。。要上线了!

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
10 [报告]
发表于 2012-09-25 18:45 |只看该作者
gearmand server 是有中心服务器的?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP