在 PHP 中获取唯一的工作线程/进程/请求 ID

2022-08-31 00:40:52

在多线程环境(与大多数Web平台一样)中,我经常在应用程序的日志中包含某种线程ID。这使我能够准确地分辨出哪个日志条目来自哪个请求/线程,当同时有多个请求同时写入同一日志时。

在 .NET/C# 中,这可以通过 log4net 的格式化程序来完成,默认情况下,这些格式化程序包括当前线程的(数字)或(给定名称)。这些属性唯一标识线程(例如,请参阅:如何使用 log4net 使用 Threadpool 线程记录正确的上下文?ManagedThreadIdName

在PHP中,我没有找到类似的东西(我问了Google,PHP文档和SO)。它存在吗?


答案 1

直到最近,我还使用apache_getenv(“UNIQUE_ID”),它与crc32或其他哈希函数完美配合。

如今,我只是使用以下,以消除对Apache和此mod的依赖。

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

它是唯一的,足以了解哪些日志属于哪个请求。如果需要更高的精度,可以使用其他哈希函数。

希望这有帮助。


答案 2

zend_thread_id()

int zend_thread_id ( void ) 

此函数返回当前线程的唯一标识符。

虽然:

仅当 PHP 是使用 ZTS(Zend 线程安全)支持和调试模式(--enable-debug)构建的,此函数才可用。


您也可以尝试调用mysql_thread_id(),当您使用该API进行数据库访问时(或使用mysqli时,$thread:id)。


推荐