从套接字读取错误


PHP Mongo Error reading from socket

最近几天,我的错误日志已经填满了这个错误:

send_package: error reading from socket: The socket is closed

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

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

生成错误的行是:

$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']}");
        };
    }
    }

PHP/mongoclient + Apache + MongoDB存在一个已知的问题,Apache进程会打开无效的持久连接。

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

结果是:

  • Apache在正常请求期间打开与MongoDB服务器的连接。
  • 假设,在某些时候你已经重新启动了你的MongoDB服务器
  • Apache/PHP在MongoDB重启期间不会识别连接已关闭,并保持先前打开的持久连接

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

让我知道这是否适合你

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

  • "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);