Получите уникальный идентификатор рабочего/потока/процесса/запроса в PHP
В многопоточных средах (как и в большинстве веб-платформ) Я часто включаю какой-то идентификатор потока в журналы своих приложений. Это позволяет мне точно определить, какая запись в журнале была получена из какого запроса/потока, когда одновременно поступает несколько запросов, которые одновременно записываются в один и тот же журнал.
В .NET/C# это может быть сделано с помощью форматеров log4net, которые по умолчанию включают ManagedThreadId
текущего потока (число) или Name
(заданное имя). Эти свойства однозначно идентифицируют поток (см., например: Как зарегистрировать правильный контекст с потоками пула потоков с помощью log4net?
В PHP я не нашел ничего подобного (я спросил Google, PHP docs и ТАК ДАЛЕЕ). Существует ли она?
5 answers
int zend_thread_id ( void )
Эта функция возвращает уникальный идентификатор для текущего потока.
Хотя:
Эта функция доступна только в том случае, если PHP был построен с поддержкой ZTS (Zend Thread Safety) и режимом отладки (--enable-debug).
Вы также можете попробовать позвонить mysql_thread_id()
, когда вы используете этот API для доступа к базе данных (или mysqli::$thread_id
при использовании mysqli).
До недавнего времени я использовал apache_getenv ("УНИКАЛЬНЫЙ идентификатор"), и он отлично работал с crc32 или другой хэш-функцией.
В настоящее время я просто использую следующее, чтобы удалить зависимость от Apache и этого мода.
$uniqueid = sprintf("%08x", abs(crc32($_SERVER['REMOTE_ADDR'] . $_SERVER['REQUEST_TIME'] . $_SERVER['REMOTE_PORT'])));
Он достаточно уникален, чтобы понять, какие журналы принадлежат какому запросу. Если вам нужна большая точность, вы можете использовать другие хэш-функции.
Надеюсь, это поможет.
Я видел getmypid(), используемый для этой цели, но, похоже, он ведет себя по-разному в разных системах. В некоторых случаях идентификатор уникален для каждого запроса, но в других он является общим.
Итак, вам, вероятно, лучше выбрать один из других ответов, чтобы обеспечить переносимость.
PHP, похоже, не имеет функции для этого, но ваш веб-сервер может передавать идентификатор через переменные среды. Например, существует модуль Apache под названием "mod_unique_id"[1], который генерирует уникальный идентификатор для каждого запроса и сохраняет его в качестве переменных среды. Если переменная присутствует, она должна быть видна через $_SERVER['уникальный идентификатор'] [2]
"Чистым PHP" решением может быть написание скрипта, который генерирует подходящий случайный идентификатор, сохраняет его через define ("уникальный идентификатор", val), а затем использует опцию auto_prepend_file[3] в php.ini, чтобы включить это в каждый выполняемый скрипт. Таким образом, уникальный идентификатор будет создан, когда запрос начнет обрабатываться, и он будет доступен во время обработки запроса.
Назначение идентификатора для идентификации зарегистрированных данных при выполнении запроса, вероятно, так же просто, как создание UUID версии 4 (случайного) и запись его в каждую строку журнала.
В этом даже помогает программное обеспечение: ramsey/uuid, php-промежуточное программное обеспечение/идентификатор запроса
Добавить его в каждую строку журнала легко при использовании log4php, поместив UUID в данные LoggerMDC и используя соответствующий форматировщик журналов. С регистраторами PSR-3 это может быть немного сложнее, YMMV.
Случайно созданный UUID будет подходящим для идентификации одного отдельного запроса, и, используя этот UUID в заголовках HTTP вложенных запросов и в ответе, можно будет даже отслеживать один запрос в нескольких системах и платформах внутри фермы серверов. Однако размещение его в качестве заголовка не является задачей ни одного из пакетов, о которых я упоминал.