Получите уникальный идентификатор рабочего/потока/процесса/запроса в PHP


В многопоточных средах (как и в большинстве веб-платформ) Я часто включаю какой-то идентификатор потока в журналы своих приложений. Это позволяет мне точно определить, какая запись в журнале была получена из какого запроса/потока, когда одновременно поступает несколько запросов, которые одновременно записываются в один и тот же журнал.

В .NET/C# это может быть сделано с помощью форматеров log4net, которые по умолчанию включают ManagedThreadId текущего потока (число) или Name (заданное имя). Эти свойства однозначно идентифицируют поток (см., например: Как зарегистрировать правильный контекст с потоками пула потоков с помощью log4net?

В PHP я не нашел ничего подобного (я спросил Google, PHP docs и ТАК ДАЛЕЕ). Существует ли она?

Author: Community, 2012-05-02

5 answers

zend_thread_id():

int zend_thread_id ( void ) 

Эта функция возвращает уникальный идентификатор для текущего потока.

Хотя:

Эта функция доступна только в том случае, если PHP был построен с поддержкой ZTS (Zend Thread Safety) и режимом отладки (--enable-debug).


Вы также можете попробовать позвонить mysql_thread_id(), когда вы используете этот API для доступа к базе данных (или mysqli::$thread_id при использовании mysqli).

 5
Author: CodeCaster, 2013-05-03 07:02:18

До недавнего времени я использовал apache_getenv ("УНИКАЛЬНЫЙ идентификатор"), и он отлично работал с crc32 или другой хэш-функцией.

В настоящее время я просто использую следующее, чтобы удалить зависимость от Apache и этого мода.

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

Он достаточно уникален, чтобы понять, какие журналы принадлежат какому запросу. Если вам нужна большая точность, вы можете использовать другие хэш-функции.

Надеюсь, это поможет.

 15
Author: gilm, 2014-03-19 14:16:33

Я видел getmypid(), используемый для этой цели, но, похоже, он ведет себя по-разному в разных системах. В некоторых случаях идентификатор уникален для каждого запроса, но в других он является общим.

Итак, вам, вероятно, лучше выбрать один из других ответов, чтобы обеспечить переносимость.

 1
Author: Ian Dunn, 2016-09-02 12:22:40

PHP, похоже, не имеет функции для этого, но ваш веб-сервер может передавать идентификатор через переменные среды. Например, существует модуль Apache под названием "mod_unique_id"[1], который генерирует уникальный идентификатор для каждого запроса и сохраняет его в качестве переменных среды. Если переменная присутствует, она должна быть видна через $_SERVER['уникальный идентификатор'] [2]

"Чистым PHP" решением может быть написание скрипта, который генерирует подходящий случайный идентификатор, сохраняет его через define ("уникальный идентификатор", val), а затем использует опцию auto_prepend_file[3] в php.ini, чтобы включить это в каждый выполняемый скрипт. Таким образом, уникальный идентификатор будет создан, когда запрос начнет обрабатываться, и он будет доступен во время обработки запроса.

 0
Author: Juha Palomäki, 2014-01-09 20:28:54

Назначение идентификатора для идентификации зарегистрированных данных при выполнении запроса, вероятно, так же просто, как создание UUID версии 4 (случайного) и запись его в каждую строку журнала.

В этом даже помогает программное обеспечение: ramsey/uuid, php-промежуточное программное обеспечение/идентификатор запроса

Добавить его в каждую строку журнала легко при использовании log4php, поместив UUID в данные LoggerMDC и используя соответствующий форматировщик журналов. С регистраторами PSR-3 это может быть немного сложнее, YMMV.

Случайно созданный UUID будет подходящим для идентификации одного отдельного запроса, и, используя этот UUID в заголовках HTTP вложенных запросов и в ответе, можно будет даже отслеживать один запрос в нескольких системах и платформах внутри фермы серверов. Однако размещение его в качестве заголовка не является задачей ни одного из пакетов, о которых я упоминал.

 0
Author: Sven, 2016-06-13 12:35:24