Getmypid: примеры (PHP)
getmypid: int|falseФункция getmypid в PHP возвращает идентификатор процесса (PID) текущего PHP-процесса, выполняющего скрипт. Это целое число, уникальное в рамках работы операционной системы в данный момент времени.
Функция применяется для целей логирования, отладки, управления процессами или взаимодействия между ними (например, создание блокировок или временных файлов с привязкой к конкретному процессу). Часто PID используется для создания уникальных имен файлов или идентификации процесса при работе с демонами, фоновыми задачами или системами очередей.
Функция getmypid() не принимает никаких аргументов.
Получение PID текущего процесса для вывода в лог или отладки.
<?php
$pid = getmypid();
echo "PID текущего процесса: $pid";
?>PID текущего процесса: 8742
Использование PID для создания уникального имени временного файла.
<?php
$pid = getmypid();
$tempFile = "/tmp/process_" . $pid . ".tmp";
file_put_contents($tempFile, "Данные процесса");
echo "Создан файл: $tempFile";
// ...
unlink($tempFile);
?>Создан файл: /tmp/process_8742.tmp
Возвращают идентификатор пользователя и группы, от имени которых выполняется текущий скрипт. Полезны для проверки прав доступа.
Возвращает имя владельца текущего скрипта. Менее информативно, чем getmyuid().
Функция из расширения POSIX, выполняет ту же задачу, что и getmypid(). Использование getmypid() предпочтительнее, так как не требует отдельного расширения и является частью ядра PHP.
PID процесса меняется при каждом запуске скрипта. Ошибкой является его сохранение для идентификации между сеансами выполнения.
<?php
// Неправильно: PID будет разным при следующем запуске.
$lockFile = "/tmp/my_script_" . getmypid() . ".lock";
// Правильно: использовать постоянный уникальный идентификатор.
$lockFile = "/tmp/my_script_" . uniqid('', true) . ".lock";
?>В веб-среде каждый HTTP-запрос может обрабатываться отдельным процессом (например, в режиме PHP-FPM). PID может быть одинаковым для нескольких запросов, если они обрабатываются одним и тем же рабочим процессом, что не делает его уникальным идентификатором запроса.
Функция getmypid() присутствует в PHP с очень ранних версий и остается стабильной. С момента появления в PHP 4, PHP 5 и PHP 7, вплоть до PHP 8, ее сигнатура и поведение не изменялись. Это надежная и предсказуемая функция.
Улучшение записей в лог за счет добавления идентификатора процесса.
<?php
function logWithPid($message) {
$pid = getmypid();
$logEntry = date('Y-m-d H:i:s') . " [PID: $pid] - $message" . PHP_EOL;
error_log($logEntry, 3, '/var/log/myapp.log');
}
logWithPid('Скрипт начал работу');
?>Создание файла-флага для предотвращения одновременного запуска нескольких экземпляров скрипта.
<?php
$lockFile = '/tmp/my_script.lock';
$fp = fopen($lockFile, 'w+');
if (!flock($fp, LOCK_EX | LOCK_NB)) {
// Не удалось получить блокировку, скрипт уже запущен.
fclose($fp);
die('Скрипт уже выполняется.');
}
// Записываем в файл блокировки PID текущего процесса.
ftruncate($fp, 0);
fwrite($fp, (string) getmypid());
fflush($fp);
// ... выполнение основной задачи ...
sleep(5);
// Освобождение блокировки.
flock($fp, LOCK_UN);
fclose($fp);
unlink($lockFile);
?>На Unix-системах можно проверить, жив ли процесс, который создал файл блокировки. Важно: это работает только в POSIX-совместимых средах.
<?php
$lockFile = '/tmp/my_script.lock';
if (file_exists($lockFile)) {
$oldPid = (int) file_get_contents($lockFile);
// Проверяем, существует ли процесс с таким PID.
if ($oldPid > 0 && posix_kill($oldPid, 0)) {
// Сигнал 0 не отправляется, но проверяет существование процесса.
die('Процесс уже выполняется (PID: ' . $oldPid . ').');
} else {
// Процесс не существует, можно удалить старый файл блокировки.
unlink($lockFile);
}
}
// Создаем новую блокировку.
file_put_contents($lockFile, getmypid());
?>Getmypid в Python
Используется модуль os и функция getpid().
import os
print(os.getpid())8742
В Node.js доступно свойство process.pid.
console.log(process.pid);8742
Используется специальная переменная $$.
echo $$8742
Getmypid в MySQL
Прямого аналога для получения PID процесса СУБД нет, но в SQL-запросе можно использовать функцию CONNECTION_ID() для получения уникального идентификатора соединения, который также может быть полезен для идентификации сессии.
SELECT CONNECTION_ID();112