从套接字读取PHP Mongo错误

时间:2013-01-10 02:06:53

标签: php mongodb

最近几天,我的错误日志已填充此错误:

send_package: error reading from socket: The socket is closed

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

之前有没有人看过这个错误或知道如何处理它?<​​/ p>

产生错误的行是:

$mongo = new Mongo("mongodb://user:pwd@host/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']}");
        };
    }
    }

2 个答案:

答案 0 :(得分:7)

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

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

会发生什么:

  • Apache在正常请求期间打开与MongoDB服务器的连接。
  • 据推测,您已经重新启动了MongoDB服务器
  • Apache / PHP从未意识到在MongoDB重启期间连接已关闭并且保持先前打开的持久连接

解决此问题的唯一方法是重启Apache(强制它杀死所有工作线程并创建新连接)。

请告诉我这是否适合您。

答案 1 :(得分: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);