4

我设法使用 Alex Bilbie 库在 Codeigniter 上运行 MongoDB。操作进展顺利(连接、查询等),但有时我会收到这些 PHP 通知:

Message: Mongo::__construct() [mongo.--construct]: localhost:27017: pool get (0x4bfab20)

Filename: libraries/Mongo_db.php

Line Number: 1274
A PHP Error was encountered

Severity: Notice

Message: Mongo::__construct() [mongo.--construct]: localhost:27017: found in pool (0x4bfab20)

Filename: libraries/Mongo_db.php

有没有办法摆脱这些?或者可能隐藏它们......因为它们似乎并没有以另一种方式弄乱我的页面,而不是飞溅到用户的屏幕上。

编辑

不过,在几页上,我使用了 JQgrid,当错误出现时,它们会弄乱我的 HTTP 响应并呈现一些混乱的数据。

4

3 回答 3

2

此处的特定通知消息已在 MongoDB PHP 驱动程序 1.2.11 或更高版本中删除(请参阅PHP-431)。将您的 MongoDB 驱动程序升级到最新版本应该会删除过多的通知日志记录。

在生产环境中正确设置 Code Igniter 日志的一般说明仍然适用...

E_NOTICE错误报告级别旨在警告您可能存在的错误或拼写错误。它通常仅用作开发设置而不是用于生产消息。

PHP4 和 PHP5 中默认的error_reporting 设置实际上设置为忽略这些:

E_ALL & ~E_NOTICE

Code Igniterindex.php有一个应用程序环境设置,该设置通常显示 和 的所有错误并development抑制错误报告。您应该适当地设置它:testingproduction

define('ENVIRONMENT', 'production');

如果您真的想为生产环境捕获这些消息,您应该更新productionindex.php 中的设置,这样error_reporting(0)您就可以:

例如,在index.php你可能有:

case 'production':
    error_reporting(E_ALL);
    ini_set('display_errors','Off');
    ini_set('log_errors','On');
    ini_set('error_log','/var/log/php5.log');
break;

这样,如果您想查看它们,消息/通知仍将保存到error_log,但它们不会显示给最终用户。

于 2012-08-20T21:02:53.133 回答
0

在我的脑海中,你可以做一些事情。这不是关于修复您收到的 MongoDB 错误的答案,而是关于您可以隐藏错误的某些方法的答案。

a) 使用“@”运算符忽略来自被调用方法的任何错误输出,在该方法中输出您收到的错误。这将导致您将方法调用重命名为以下@method_outputting_mongodb_error($foo,$bar);.

b) 在 CodeIgniter 中关闭错误报告。这不是最好的方法,因为不会输出所有其他错误。

这里有一个很好的链接:如何关闭错误报告: http: //phpdog.blogspot.fr/2012/02/codeigniter-error-reporting-handling.html

于 2012-08-20T13:41:18.823 回答
-1

正如@Stennie 提到的,这已在更高版本的驱动程序中得到修复:https ://jira.mongodb.org/browse/PHP-431

尝试升级。

此外,这仅存在于 Windows 驱动程序中,并且仅在 v1.2.1 之后才开始发生。我知道,因为制作 JIRA 的人也根据我的建议尝试了 1.2.1,但他没有得到那些E_NOTICEs。我记得现在实际上触发了 JIRA 的对话:)。

与其他人不同,我认为您不应该用E_ALL & ~E_NOTICE. 没有人完全决定隐藏 E_NOTICE,但普遍的共识是这不是最好的事情。当然,您不希望您的日志中充满关于 MongoDB 扩展的所有这些调试信息,相反,MongoDB 扩展应该是静默的(正如您认为的那样)。

我不会隐藏 E_NOTICE 的另一个原因是因为更高版本的 PHP 的 php.ini:

; error_reporting
;   Default Value: E_ALL & ~E_NOTICE
;   Development Value: E_ALL | E_STRICT
;   Production Value: E_ALL & ~E_DEPRECATED

默认情况下,PHP 将实际安装 Production Value(就像它为我做的那样),因此 PHP 错误报告的默认设置是:

E_ALL & ~E_DEPRECATED

这是我的 AWS 和本地 Ubuntu 服务器 12.04 上的 error_reporting 的值,自从安装以来我没有更改这些值,因此我从 repo 和源安装 PHP 获得的默认值是:

error_reporting = E_ALL & ~E_DEPRECATED

因此,为以后的 PHP 版本(可能还有未来的版本)推荐的生产默认设置实际上显示了E_NOTICE,这很有用,但如果日志中填充了来自 Mongo 扩展的内容,则不会。

编辑:downvoter 关心解释?我基本上给出了与@Stennie 相同的答案,为什么要投反对票?

我已经编辑了我的答案,以实际考虑对此答案的评论和@Stennie 的答案中的对话,因此现在答案更有意义。

于 2012-08-20T21:40:16.817 回答