2012-05-01 18 views
10

マルチスレッド環境(ほとんどのWebプラットフォームのようなもの)では、私のアプリケーションのログにある種のスレッドIDを含むことがよくあります。これにより、一度に複数のリクエストが同時に同じログに書き込まれているときに、どのリクエストがどのリクエスト/スレッドから来たのかを正確に伝えることができます。PHPで一意のワーカー/スレッド/プロセス/リクエストIDを取得

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

を、私は似た何かを発見していない(私はグーグル、PHPのドキュメントとSO)が尋ねたことが

+3

これは役に立つかもしれません:http://php.net/manual/en/function.zend-thread-id.php – Daan

答えて

4

zend_thread_id()存在しています:。?

int zend_thread_id (void) 

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

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


(mysqliのを使用している場合かmysqli::$thread_id)あなたのデータベースアクセスにそのAPIを使用するときにも、ヨーヨーコールmysql_thread_id()を試みることができます。

+0

ありがとうございます、残念ながら、私は 'zend_thread_id()'を使うことはできません。 Linux上で実行している場合、 'exec( 'gettid')'と 'mysql_thread_id()'は何も返しません。多分私は共有環境で走っているからです。他のオプションはありますか? – cheeesus

+0

端末からではなく、Cソースから呼び出すためのgettidはありませんか? –

+0

@Lukasあなたは正しいかもしれません...なぜ私はそこに置くのか分からない。 – CodeCaster

0

PHPはこの機能を利用できないようですが、Webサーバーが環境変数で識別子を渡すことができます。たとえば、mod_unique_id [1]というApacheモジュールがあります。このモジュールはリクエストごとに固有の識別子を生成し、それを環境変数として格納します。変数が存在する場合は、$ _SERVER ['unique_id'] [2]

で表示する必要があります。 "Pure PHP"ソリューションは、適切なランダム識別子を生成するスクリプトを作成し、define( "unique_id" 、val)、php.iniのauto_prepend_file [3]オプションを使用して、実行するすべてのスクリプトにこれを組み込みます。このようにして、要求が処理を開始するときに一意のIDが作成され、要求の処理中にそのIDが使用可能になります。

15

または別のハッシュ関数を使用します。

最近Apacheとこのmodの依存関係を取り除くために、次のものを使用しています。

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

それはどの要求に属するログを理解するのに十分なユニークです。より精度が必要な場合は、他のハッシュ関数を使用できます。

これが役に立ちます。

+0

2つのリクエストが同時に発生した場合、このメソッドは2つの同一のIDを生成することを通知します。 –

+2

この場合、REMOTE_ADDRとREQUEST_TIMEは似ていますが、REMOTE_PORTは異なります。 REMOTE_PORTは、キープアライブ要求の場合は前の要求と同様にすることができますが、REQUEST_TIMEは同じではありません。 – gilm

+1

'REQUEST_TIME_FLOAT'はPHP 5.4から利用可能で、正確にはマイクロ秒までです。 –

1

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

だから、移植性を確保するために、他の答えの1つに行く方がよいでしょう。

0

ログに記録されたデータを識別するためにIDを割り当てると、おそらくUUIDバージョン4(ランダム)を作成し、ログのすべての行に書き込むだけです。でも、それを手伝っソフトウェアがある

:LoggerMDCデータへのUUIDを入れ、適切なLogFormatterを使用してlog4phpを使用したときのログのすべての行にそれを追加するramsey/uuidは、php-middleware/request-id

は簡単です。 PSR-3ロガーでは、少し複雑なYMMVかもしれません。

ランダムに作成されたUUIDは、1つのリクエストを識別するのに適しており、サブリクエストのHTTPヘッダーとレスポンスでそのUUIDを使用することで、複数のシステムとプラットフォームサーバーファーム。しかし、それをヘッダーにすることは、私が言及したパッケージのタスクではありません。