2013-01-10 46 views
4

过去几天的阅读,我的错误日志已经充满了这样的错误:PHP蒙戈错误从插座

send_package: error reading from socket: The socket is closed 

我真的不知道这是哪里来的。看起来我的MongoDB服务器没有打开TCP套接字,但我真的只是在猜测。

有没有人看过这个错误或知道如何处理它?

线产生的错误是:

$mongo = new Mongo("mongodb://user:[email protected]/db",array('timeout'=>6000)); 

我也偶尔疙瘩DIC中获得的:

class HurstDI extends \Pimple 
    { 
     public function __construct(){ 
      $this['mongoUser'] = 'user'; 
      $this['mongoPwd'] = 'pwd'; 
      $this['mongoHost'] = "host/db"; 
      $this['mongoTimeout'] = 6000; 
      $this['mongodb'] = function($c){ 
      return new \MongoClient("mongodb://{$c['mongoUser']}:{$c['mongoPwd']}@{$c['mongoHost']}"); 
     }; 
    } 
    } 
+0

什么是从MongoDB的话说,日志?它会不时重新启动吗? – hek2mgl

+0

嗯,我看过日志,但是我猜想我没有回到足够远的地步。我看到很多'code'Wan Jan 9 18:18:11 [initandlisten]从10.158.26.40:52664#17298接收的连接 Wed Jan 9 18:18:11 [initandlisten]连接被拒绝,因为打开的连接太多:819 Wed Jan 9 18:18:11 [initandlisten]从10.29.133.149:56104接受的连接#17299 Wed Jan 9 18:18:11 [initandlisten]连接被拒绝,因为连接太多:819 – adear11

+0

This SO post may有帮助http:// stackoverflow。com/questions/7693989/increase-mongodb-maximum-number-of-connections – hek2mgl

回答

7

有一个known issue用PHP/mongoclient +阿帕奇+的MongoDB其中无效的持久连接由Apache进程保持打开。

尝试重新启动Apache Web服务器。

会发生什么事是:

  • 阿帕奇打开一个正常请求期间,您的MongoDB服务器的连接。
  • 据推测,在某些时候你必须重新启动你的MongoDB服务器
  • 的Apache/PHP永远不会承认该连接是MongoDB的重启期间关闭并保持到持久连接之前打开

的唯一途径解决这个问题就是重启Apache(强制它终止所有的工作线程并创建新的连接)。

让我知道这是否适合你。

+0

其他今天当问题真的开始发生时,我还没有重新启动mongo服务器。这是apache/php没有释放连接的累积问题吗?或者只有当mongo服务器重新启动时才会出现这种情况? – adear11

+0

@ adear11它启动时,MongoDB服务器重新启动,但它继续,直到Apache服务重新启动 –

+0

我刚刚重新启动我的Apache服务器,它似乎已经纠正自己。解决方案是否再次发生这种情况而不重新启动MongoDB服务器?最好不要使用持久连接(如果这是PHP驱动程序中的选项)? – adear11

0

增加超时可能会有所帮助。

  • “socketTimeoutMS”:套接字上的发送或接收在超时之前可能需要多长时间才能执行 。
  • “wTimeoutMS”:它控制服务器等待 满足写入关注的毫秒数。
  • “connectTimeoutMS”:在以毫秒为单位超时之前连接可以打开的时间为 。

    $m = new MongoClient("mongodb://127.0.0.1:27017", array("connect"=>TRUE, "connectTimeoutMS"=>10, "socketTimeoutMS"=>10, "wTimeoutMS"=>10)); 
    
        $db= $m->mydb; 
        $coll = $db->testData; 
        $coll->insert($paramArr);