当前位置: 首页 > 知识库问答 >
问题:

MongoClient PHP sript将永远运行

郎诚
2023-03-14

我正在使用PHP mongoClient类连接mongob远程主机。

除了简单的连接代码,我没有写什么特别简单的东西。

$connection_url = "mongodb://{$dbuser}:{$dbpass}@{$dburl}:{$dbport}/{$dbname}";         
$this->m = new MongoClient($connection);

它确实连接到mongodb,但一段时间后,我的应用程序挂起,所谓挂起,是指php sript永远运行,没有响应,最后apache和我的服务器崩溃。我需要重启服务器才能重新启动。

为什么PHP脚本永远运行而mongolerver没有响应。

我将max_execution_time设置为30秒。

MongoClient版本1.4.5

更新:

正如这里所解释的,mongoDB的默认连接和套接字时间永远不会超时,我想,如果套接字从MongoServer端关闭,可能是MongoClient永远等待的php。

为了确保我为mongoclient设置了选项,使其在套接字关闭时等待时间不超过5秒,如下所示

$connection_url = "mongodb://{$dbuser}:{$dbpass}@{$dburl}:{$dbport}/{$dbname}";
$options = array('connectTimeoutMS' =>5000 , 'socketTimeoutMS' => 5000);
$this->m = new MongoClient($connection, $options);

但这仍然悬而未决

这是短的Mongo日志

2:4:找到某个主机的连接;-; dbname/user/fd6da21ee7cf37731eb88e250d4a05d6; 1957(寻找某个主机;-; dbname/username/fd6da21ee7cf37731eb88e250d4a05d6; 1957)2:2:mongo_get_read_write_connection:找到一个单机连接

2:4:找到连接主机;-; dbname/username/fd6da21ee7cf37731eb88e250d4a05d6; 1957(寻找主机名;-; dnname/user/fd6da21ee7cf37731eb88e250d4a05d6; 1957)

2:2:is_ping: ping主机名;-; dbname/username/fd6da21ee7cf37731eb88e250d4a05d6; 1957

“is_ping”之后没有日志。这意味着我的脚本挂在这里。

更新:

下面是挂起时正在使用和运行的进程

ps aux | sort -rk 3,3 | head -n 20
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
www-data 32612  0.0  1.1 108372  5604 ?        S    11:05   0:00 /usr/sbin/apache2 -k start
www-data 32390  0.0  1.1 108372  5604 ?        S    11:04   0:00 /usr/sbin/apache2 -k start
www-data 32389  0.0  1.4 109192  7348 ?        S    11:00   0:00 /usr/sbin/apache2 -k start
www-data 32388  0.0  1.4 109192  7376 ?        S    11:00   0:00 /usr/sbin/apache2 -k start
www-data 32387  0.0  1.4 109192  7376 ?        S    11:00   0:00 /usr/sbin/apache2 -k start
www-data 32386  0.0  1.2 108412  6100 ?        S    11:00   0:00 /usr/sbin/apache2 -k start
www-data 32385  0.0  1.8 111692  9432 ?        S    11:00   0:00 /usr/sbin/apache2 -k start
www-data 31833  0.0  1.5 109216  7548 ?        S    02:35   0:00 /usr/sbin/apache2 -k start
www-data 31173  0.0  1.5 108824  7872 ?        S    Mar02   0:00 /usr/sbin/apache2 -k start
www-data 15538  0.0  1.5 109216  7664 ?        S    Mar02   0:00 /usr/sbin/apache2 -k start
www-data 15536  0.0  1.4 109200  7496 ?        S    Mar02   0:00 /usr/sbin/apache2 -k start
www-data 15535  0.0  1.6 110904  8444 ?        S    Mar02   0:00 /usr/sbin/apache2 -k start
www-data 15534  0.0  1.3 108684  6536 ?        S    Mar02   0:00 /usr/sbin/apache2 -k start
whoopsie   847  0.0  0.5 187668  2676 ?        Ssl  Feb24   0:00 whoopsie
syslog     370  0.0  0.6 249676  3060 ?        Sl   Feb24   0:31 rsyslogd -c5
root       984  0.0  0.1  15792   908 tty1     Ss+  Feb24   0:00 /sbin/getty -8 38400 tty1
root       946  0.0  2.0 108348 10120 ?        Ss   Feb24   0:32 /usr/sbin/apache2 -k start
root         9  0.0  0.0      0     0 ?        S    Feb24   0:00 [rcu_bh]
root       879  0.0  0.0      0     0 ?        S<   Feb24   0:00 [kvm-irqfd-clean]

共有1个答案

储俊英
2023-03-14

听起来像是硬件问题或mongodb问题,如果有挂起的php脚本,服务器应该不需要重新启动。。。

但是,您可以尝试将username password db添加到如下选项中:

function __construct($host, $username, $password, $db){
    $this->client = new MongoClient("mongodb://" . $host, array('username' => $username, 'password' => $password, 'db' => $db));
    $this->db = $this->client->selectDB($db);
}
 类似资料:
  • 问题内容: 有什么办法可以使这两个软件包一起运行? 因此,基本上,我希望两全其美。自动运行服务器(并在出现错误时重新启动),并在发生.js文件更改时自动更新。 问题答案: 但是要避免该问题,您可以执行以下操作: 这样可以确保实际退出(而不是给您“应用程序崩溃”消息),然后再次将其接收。 在此指定要运行的命令,否则将默认为节点。不使用-c会导致在此答案的注释中提及的错误。

  • 在其他语言中,此任务很简单,只需在Python中使用类似以下内容: 如果没有什么要处理的,我的程序也会想暂停执行。我不希望它用查询使数据库过载。 我正在尝试编写一个应用程序,它将充当后台队列处理器。它将检查数据库,看看队列中是否有任何需要处理的项目,然后该程序将数据写入磁盘上的文件。连接到同一数据库的不同系统的用户会间歇性地将数据添加到数据库中。 我认为永久npm模块不太合适,因为该模块只是检查脚

  • 我有一个奇怪的问题Laravel队列:工作。在我的crontab中,我设置了一个工作,就像Laravel文档中描述的那样 在我的应用程序/控制台/Kernel.php我设置这个: 在我的正式服php工匠队列中:工作运行几秒钟,然后被“杀死”。这就是我所期望的。 在我的开发盒php artisan队列中:工作永远运行。因此,激活cron作业会产生php进程,直到整个内存被填满。 两个盒子都是Cent

  • 有没有办法让BeaconTransmitter实例永远发送? 问题是:我想要一个RPi检测器,当我回家时,不需要Wifi运行,或者RPi甚至可以访问互联网(例如,当它检测到电话时,它可以打开所有路由器等)。 我的android手机上有一个极简的应用程序,发送iBeacon运行,而RPi上的beacontools库会检测到它。原则上,这是运作良好的。(虽然我知道它应该是相反的,但我再次,我希望RPi

  • 我在上构建了一个排队系统。应用程序将为特定的生成消息,在使用者端,我必须使用为该主题生成的所有记录。 我使用新的Java使用者API编写了consumer。代码看起来像 这里我需要永远运行消费者,这样生产者推入kafka主题的任何记录都应该立即消费和处理。 所以我的困惑是,使用无限while循环(像示例代码中那样)消费数据是正确的方法吗?

  • 问题内容: 我正在尝试新的React Hooks的API,它似乎一直在无限循环中运行!我只希望回调运行一次。这是我的代码供参考: 单击“运行代码段”,以查看将“ Run useEffect”字符串无限打印到控制台。 问题答案: 发生这种情况是因为在每次渲染后都会触发,这是在这种情况下无状态功能组件的调用。当你做一个从返回的呼叫中,阵营将再次呈现该组件,并再次运行。这将导致无限循环: →交通→交通→