2012-05-01 19 views
10

En entornos de subprocesos múltiples (como la mayoría de las plataformas web) A menudo incluyo algún tipo de ID de subproceso en los registros de mis aplicaciones. Esto me permite decir exactamente qué entrada de registro proviene de cada solicitud/subproceso, cuando hay varias solicitudes a la vez que se escriben simultáneamente en el mismo registro.Obtenga ID único de trabajador/subproceso/proceso/solicitud en PHP

En .NET/C#, esto se puede hacer por los formateadores de log4net, que por defecto incluyen del hilo actual ManagedThreadId (un número) o Name (un nombre dado). Estas propiedades se identifican de forma única una rosca (véase por ejemplo: How to log correct context with Threadpool threads using log4net?

En PHP, no he encontrado nada parecido (pedí Google, documentos PHP, etc) ¿Existe

+3

Esto puede ser útil: http://php.net/manual/en/function.zend-thread-id.php – Daan

Respuesta

4

zend_thread_id():.?

int zend_thread_id (void) 

Esta función devuelve un identificador único para el subproceso actual

Aunque:.

Esta función solo está disponible si PHP se ha creado con soporte ZTS (Zend Thread Safety) y modo de depuración (--enable-debug).


También puede probar yo mysql_thread_id() llamada, cuando se utiliza esa API para su acceso a la base de datos (o mysqli::$thread_id al usar mysqli).

+0

Gracias, pero desafortunadamente, no puedo usar 'zend_thread_id()', y aunque estoy ejecutándose en Linux, tanto 'exec ('gettid')' como 'mysql_thread_id()' no devuelven nada. Tal vez esto se deba a que estoy corriendo en un entorno compartido. ¿Hay más opciones? – cheeesus

+0

¿No se obtiene solo para llamar desde la fuente C, no desde la terminal? –

+0

@Lukas, puede que tengas razón ... No sé por qué lo puse ahí. – CodeCaster

0

PHP no parece tener una función para esto disponible, pero su servidor web podría pasar el identificador a través de variables de entorno. Hay, por ejemplo, un módulo de Apache llamado "mod_unique_id" [1] que genera un identificador único para cada solicitud y lo almacena como variables de entorno. Si la variable está presente, debe ser visible a través de $ _SERVER ['unique_id'] [2]

La solución de "PHP puro" podría ser escribir un script que genere un identificador aleatorio adecuado, lo almacene a través de define ("unique_id" , val) y luego use la opción auto_prepend_file [3] en php.ini para incluir esto en cada script que se ejecuta. De esta forma, la identificación única se creará cuando la solicitud comience a procesarse y estará disponible durante el procesamiento de la solicitud.

15

Hasta hace poco, solía apache_getenv ("UNIQUE_ID"), y ha funcionado perfectamente con una crc32 u otra función hash.

Actualmente estoy usando lo siguiente, para eliminar la dependencia de Apache y este mod.

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

Es lo suficientemente única para comprender qué registros que pertenecen a cada petición. Si necesita más precisión, puede usar otras funciones hash.

Espero que esto ayude.

+0

Solo un recordatorio de que si dos solicitudes llegan al mismo tiempo, este método dará como resultado dos identificaciones idénticas. –

+2

REMOTE_ADDR y REQUEST_TIME serán similares en ese caso, pero REMOTE_PORT será diferente. REMOTE_PORT puede ser similar a una solicitud anterior, en caso de una solicitud de mantenimiento, pero luego REQUEST_TIME no será la misma. – gilm

+1

'REQUEST_TIME_FLOAT' está disponible desde PHP 5.4, y precisa hasta el microsegundo. –

1

He visto getmypid() usado para este propósito, pero parece comportarse de manera diferente en diferentes sistemas. En algunos casos, la identificación es única para cada solicitud, pero en otros se comparte.

Por lo tanto, probablemente sea mejor que vaya con una de las otras respuestas para garantizar la portabilidad.

0

La asignación de una ID para identificar los datos registrados de una solicitud probablemente sea tan simple como crear una versión UUID 4 (aleatoria) y escribirla en cada línea del registro.

Incluso es un software que ayuda con: ramsey/uuid, php-middleware/request-id

Adición a cada línea de registro es fácil cuando se utiliza log4php poniendo el UUID a los datos LoggerMDC y utilizando un logformatter apropiado. Con los registradores PSR-3, podría ser un poco más complicado, YMMV.

Un UUID creado al azar será adecuado para identificar una única solicitud, y al usar ese UUID en los encabezados HTTP de las solicitudes secundarias y en la respuesta, incluso será posible rastrear una solicitud en múltiples sistemas y plataformas dentro del granja de servidores. Sin embargo, ponerlo como encabezado no es tarea de ninguno de los paquetes que mencioné.