2013-01-10 70 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);