Einzigartig Arbeiter/thread/Prozess/request-ID in PHP
In multi-threaded-Umgebungen (wie die meisten web-Plattformen) I beinhalten oft eine Art von thread-ID, um die Protokolle zu meinen apps. Dies ermöglicht mir, zu sagen, genau das, was log-Eintrag kam aus dem request/thread, wenn es mehrere Anfragen auf einmal, die gleichzeitig schreiben, um das gleiche Protokoll.
In .NET/C#, dies kann durch den Formatierer von log4net, die standardmäßig beinhalten die aktuelle thread ManagedThreadId
(eine Zahl) oder Name
(mit einem bestimmten Namen). Diese Eigenschaften eindeutig zu identifizieren, einen thread (siehe zum Beispiel: Wie Sie sich richtigen Kontext mit Threadpool-threads mit log4net?
In PHP, ich habe nicht gefunden, etwas ähnliches (ich fragte Google, PHP-docs und SO). Gibt es die?
- Dies kann nützlich sein: php.net/manual/en/function.zend-thread-id.php
Du musst angemeldet sein, um einen Kommentar abzugeben.
zend_thread_id()
:Obwohl:
Könnte man auch versuchen, yo nennen
mysql_thread_id()
, wenn Sie, dass die API für Ihre Datenbank zugreifen (odermysqli::$thread_id
bei der Verwendung von mysqli).zend_thread_id()
, und ich bin zwar unter Linux, sowohlexec('gettid')
undmysql_thread_id()
nichts zurück. Vielleicht deshalb, weil ich ' m laufen in einer gemeinsamen Umgebung. Gibt es andere Optionen?Bis vor kurzem verwendete ich apache_getenv("UNIQUE_ID"), und es funktionierte perfekt mit einem crc32 oder eine andere hash-Funktion.
Heutzutage bin ich nur mit dem folgenden, in der Reihenfolge zu entfernen Abhängigkeit von Apache und mod.
$uniqueid = sprintf("%08x", abs(crc32($_SERVER['REMOTE_ADDR'] . $_SERVER['REQUEST_TIME'] . $_SERVER['REMOTE_PORT'])));
Es ist einzigartig genug, um zu verstehen, welche Protokolle gehören zu der Anfrage. Wenn Sie mehr Präzision, können Sie die Verwendung anderer hash-Funktionen.
Hoffe, das hilft.
REQUEST_TIME_FLOAT
ist verfügbar seit PHP 5.4 und präzise bis hin zu einer Mikrosekunde.hash( 'crc32b', $values )
scheint mehr lesbarsprintf( "%08x", abs( crc32( $values ) ) )
, und ich denke, es erreicht das gleiche Ergebnis.Ich habe gesehen, getmypid() für diesen Zweck verwendet, aber es scheint sich anders Verhalten auf verschiedenen Systemen. In einigen Fällen wird die ID ist eindeutig für jede Anfrage, sondern auf andere gemeinsame.
Also, sind Sie wahrscheinlich besser mit einer der anderen Antworten für Portabilität zu sorgen.
PHP scheint nicht zu haben eine Funktion dafür zur Verfügung, aber Ihr web-server möglicherweise in der Lage, übergeben Sie den identifier über environment-Variablen. Es ist zum Beispiel ein Apache-Modul namens "mod_unique_id"[1], erzeugt einen eindeutigen Bezeichner für jede Anforderung und speichert es als eine environment-Variablen. Wenn die variable vorhanden ist, sollte es sichtbar sein, über $_SERVER['unique_id'] [2]
"Pure PHP" Lösung könnte sein, schreiben Sie ein Skript, das erzeugt geeignete zufällige Kennung, speichert es mit define("unique_id", val) und dann mit auto_prepend_file [3] option in php.ini, um diese in jedem Skript, dass ausgeführt wird. Diese Weise die einzigartige id erstellt werden, wenn der Antrag beginnt mit der Verarbeitung und es würde verfügbar sein, während der Verarbeitung der Anfrage.
Zuweisung einer ID, um zu ermitteln, protokolliert Daten aus, der eine Anfrage ist wahrscheinlich so einfach wie die Erstellung einer UUID, version 4 (random) und schreiben Sie auf jede Linie des log.
Gibt es sogar software, die geholfen haben: ramsey/uuid, php-middleware/Anfrage-id
Hinzufügen, um jede Zeile der Protokollierung ist einfach, wenn Sie log4php, indem die UUID der LoggerMDC Daten und Verwendung einer geeigneten LogFormatter. Mit dem PSR-3 Holzfäller, vielleicht ist es ein bisschen komplizierter, YMMV.
Eine zufällig erstellte UUID geeignet, um eine einzige Anfrage, und mit dieser UUID in die HTTP-Header von sub-Anfragen und in der Antwort, es wird sogar möglich sein, zu verfolgen Anforderungen über mehrere Systeme und Plattformen in der server-farm. Allerdings setzen es als header ist nicht die Aufgabe von jedem der Pakete, die ich erwähnt.