Getmypid: примеры (PHP)

Функция getmypid в PHP: примеры применения для работы с процессами
Раздел: Информация о 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
Похожие функции в PHP
getmyuid() и getmygid()

Возвращают идентификатор пользователя и группы, от имени которых выполняется текущий скрипт. Полезны для проверки прав доступа.

Возвращает имя владельца текущего скрипта. Менее информативно, чем getmyuid().

posix_getpid()

Функция из расширения POSIX, выполняет ту же задачу, что и getmypid(). Использование getmypid() предпочтительнее, так как не требует отдельного расширения и является частью ядра PHP.

Типичные ошибки
Ожидание постоянства PID

PID процесса меняется при каждом запуске скрипта. Ошибкой является его сохранение для идентификации между сеансами выполнения.

<?php
// Неправильно: PID будет разным при следующем запуске.
$lockFile = "/tmp/my_script_" . getmypid() . ".lock";
// Правильно: использовать постоянный уникальный идентификатор.
$lockFile = "/tmp/my_script_" . uniqid('', true) . ".lock";
?>
Использование в неподходящем контексте

В веб-среде каждый HTTP-запрос может обрабатываться отдельным процессом (например, в режиме PHP-FPM). PID может быть одинаковым для нескольких запросов, если они обрабатываются одним и тем же рабочим процессом, что не делает его уникальным идентификатором запроса.

Изменения в версиях PHP

Функция getmypid() присутствует в PHP с очень ранних версий и остается стабильной. С момента появления в PHP 4, PHP 5 и PHP 7, вплоть до PHP 8, ее сигнатура и поведение не изменялись. Это надежная и предсказуемая функция.

Расширенные примеры
Логирование с PID

Улучшение записей в лог за счет добавления идентификатора процесса.

Пример php
<?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
<?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
<?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
JavaScript (Node.js)

В Node.js доступно свойство process.pid.

console.log(process.pid);
8742
Bash/Shell

Используется специальная переменная $$.

echo $$
8742

Getmypid в MySQL

Прямого аналога для получения PID процесса СУБД нет, но в SQL-запросе можно использовать функцию CONNECTION_ID() для получения уникального идентификатора соединения, который также может быть полезен для идентификации сессии.

SELECT CONNECTION_ID();
112

PHP getmypid function comments

En
Getmypid Gets PHP's process ID