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には、通常は のすべてのエラーを表示し、 およびのエラー報告を抑制するアプリケーション環境設定があります。これを適切に設定する必要があります。developmenttestingproduction

define('ENVIRONMENT', 'production');

実際に本番環境でこれらのメッセージをキャプチャしたい場合はproduction、代わりに次のように index.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_NOTICEの s を得られなかったので、私はそれを知っています。その JIRA を実際にトリガーした会話をしたことを覚えています :)。

他のエラーとは異なり、これらのエラーを で「隠す」べきではないと思いますE_ALL & ~E_NOTICE。E_NOTICE を非表示にすることを決定した人は誰もいませんが、一般的なコンセンサスは、それが最善ではないということです。もちろん、MongoDB 拡張機能に関するすべてのデバッグ情報でログがいっぱいになるのは望ましくありません。その代わりに、MongoDB 拡張機能は (ご想像のとおり) サイレントにする必要があります。

E_NOTICE を非表示にしないもう 1 つの理由は、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 に設定した値です。インストールして以来、値を変更していません。レポとソースの両方から PHP をインストールすることで得られるデフォルト値は次のとおりです。

error_reporting = E_ALL & ~E_DEPRECATED

したがって、以降の PHP バージョン (およびおそらく将来のバージョン) の本番用に推奨されるデフォルト設定は、実際には を示してE_NOTICEいます。

編集:反対票を投じるのは説明する気ですか?私は基本的に@Stennieと同じ答えを出しましたが、なぜ反対票を投じるのでしょうか?

この回答と@Stennieの回答に対するコメントの会話を実際に考慮して回答を編集したので、回答がより理にかなっています。

于 2012-08-20T21:40:16.817 に答える