15

マルチスレッド環境 (ほとんどの Web プラットフォームと同様) では、アプリのログにある種のスレッド ID を含めることがよくあります。これにより、一度に複数のリクエストが同時に同じログに書き込みを行っている場合に、どのログ エントリがどのリクエスト/スレッドから来たのかを正確に知ることができます。

.NET/C# では、log4net のフォーマッタによってこれを行うことができます。デフォルトでは、現在のスレッドのManagedThreadId(番号) またはName(指定された名前) が含まれます。これらのプロパティは、スレッドを一意に識別します (例: How to log right context with Threadpool threads using log4net? を参照)。

PHPでは、似たようなものは見つかりませんでした(Google、PHPのドキュメント、およびSOに尋ねました)。それは存在しますか?

4

5 に答える 5

21

最近まで、apache_getenv("UNIQUE_ID") を使用していましたが、crc32 または別のハッシュ関数と完全に連携していました。

最近では、Apache とこの mod への依存を取り除くために、以下を使用しています。

$uniqueid = sprintf("%08x", abs(crc32($_SERVER['REMOTE_ADDR'] . $_SERVER['REQUEST_TIME'] . $_SERVER['REMOTE_PORT'])));

どのログがどのリクエストに属しているかを理解するのに十分なほど一意です。さらに精度が必要な場合は、他のハッシュ関数を使用できます。

お役に立てれば。

于 2014-03-19T14:16:33.693 に答える
7

zend_thread_id():

int zend_thread_id ( void ) 

この関数は、現在のスレッドの一意の識別子を返します。

それでも:

この関数は、PHP が ZTS (Zend Thread Safety) サポートとデバッグ モード (--enable-debug) でビルドされている場合にのみ使用できます。


mysql_thread_id()データベース アクセスにその API を使用する場合 (またはmysqli::$thread_idmysqli を使用する場合)にyo call を試すこともできます。

于 2012-05-01T22:08:44.093 に答える
1

この目的でgetmypid()が使用されているのを見たことがありますが、システムによって動作が異なるようです。場合によっては、ID は各リクエストに固有ですが、他の場合は共有されます。

したがって、移植性を確保するために、他の回答のいずれかを使用することをお勧めします。

于 2016-06-09T01:49:02.433 に答える
1

PHP にはこれを利用できる関数がないようですが、Web サーバーは環境変数を介して識別子を渡すことができる場合があります。たとえば、「mod_unique_id」[1] と呼ばれる Apache モジュールがあります。これは、各リクエストに対して一意の識別子を生成し、それを環境変数として保存します。変数が存在する場合、$_SERVER['unique_id'] [2] を介して表示される必要があります。

「純粋な PHP」ソリューションは、適切なランダム識別子を生成し、define("unique_id", val) を介して格納するスクリプトを記述し、php.ini で auto_prepend_file [3] オプションを使用して、実行するすべてのスクリプトにこれを含めることです。このようにして、リクエストの処理が開始されたときに一意の ID が作成され、リクエストの処理中に使用できるようになります。

于 2014-01-09T20:28:54.550 に答える
0

ログに記録されたデータがリクエストを処理していることを識別するために ID を割り当てることは、UUID バージョン 4 (ランダム) を作成し、それをログのすべての行に書き込むのと同じくらい簡単です。

それを支援するソフトウェアもあります:ramsey/uuidphp-middleware/request-id

Log4phpを使用する場合、UUID を LoggerMDC データに配置し、適切な LogFormatter を使用することで、ロギングのすべての行に簡単に追加できます。PSR-3 ロガーの場合、YMMV のようにもう少し複雑になる可能性があります。

ランダムに作成された UUID は、1 つの要求を識別するのに適しています。サブ要求の HTTP ヘッダーと応答でその UUID を使用することで、サーバー ファーム内の複数のシステムとプラットフォームにわたって 1 つの要求を追跡することさえ可能になります。ただし、ヘッダーとして配置することは、私が言及したどのパッケージのタスクでもありません。

于 2016-06-13T12:35:24.443 に答える