在PHP中获取唯一的worker/thread/process/request ID

che*_*ica 13 php logging multithreading webrequest

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

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

在PHP中,我没有发现任何类似的东西(我问谷歌,PHP文档和SO).它存在吗?

gil*_*ilm 16

直到最近,我使用了apache_getenv("UNIQUE_ID"),它与crc32或其他哈希函数完美配合.

现在我只是使用以下内容,以消除对Apache和此mod的依赖.

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

它足够独特,可以了解哪些日志属于哪个请求.如果需要更高的精度,可以使用其他散列函数.

希望这可以帮助.

  • 在这种情况下,REMOTE_ADDR和REQUEST_TIME将类似,但REMOTE_PORT将有所不同.在keepalive请求的情况下,REMOTE_PORT可以类似于先前的请求,但REQUEST_TIME将不相同. (2认同)
  • 自PHP 5.4起,`REQUEST_TIME_FLOAT`就可用了,精确到微秒。 (2认同)
  • `hash('crc32b',$ values)`似乎更具可读性`sprintf("%08x",abs(crc32($ values)))`,我认为它实现了相同的结果. (2认同)

Cod*_*ter 6

zend_thread_id():

int zend_thread_id ( void ) 
Run Code Online (Sandbox Code Playgroud)

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

虽然:

只有在使用ZTS(Zend线程安全)支持和调试模式(--enable-debug)构建PHP时,此功能才可用.


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