История изменений
Исправление wandrien, (текущая версия) :
Файловый деcкриптор забыл закрыть.
Вспомнил, о чем я думал. Его сборщик мусора приберёт. Это же не просто дескриптор, а в GC всё завернуто.
Но когда он его приберёт, хз, так что лучше явно закрыть.
А насчёт остального.
- С гарантией убедиться, что данные корректны, мы всё равно не сможем.
- Даже если мы как-то убедились в этом, процесс мог сдохнуть сразу после чтения нами PID. И вызывая
kill
, вовсе не факт, что мы стреляем в нужного.
Ну можно добавить один уровень костылей, хотя смысла особо нет:
function _readPidfile($pidfile) {
/* XXX: Race conditions are everywhere. But who cares? */
if (!file_exists($pidfile)) {
/* No such file - daemon not running */
return false;
}
$f = fopen($pidfile, "r");
if (!$f) {
/* Failed to open file - daemon probably not running */
return false;
}
if (flock($f, LOCK_EX | LOCK_NB)) {
/* Able to acuire lock - daemon not running */
fclose($f);
return false;
}
/* Return PID */
$pid = fgets($f);
fclose($f);
return $pid;
}
function readPidfile($pidfile) {
$pid1 = false;
$pid2 = true;
while ($pid1 !== $pid2) {
$pid1 = _readPidfile($pidfile);
sleep(0.1);
$pid2 = _readPidfile($pidfile);
}
return $pid1;
}
Исходная версия wandrien, :
Файловый деcкриптор забыл закрыть.
Вспомнил, о чем я думал. Его сборщик мусора приберёт. Это же не просто дескриптор, а в GC всё завернуто.
Но когда он его приберёт, хз, так что лучше явно закрыть.
А насчёт остального.
- С гарантией убедиться, что данные корректны, мы всё равно не сможем.
- Даже если мы как-то убедились в этом, процесс мог сдохнуть сразу после чтения нами PID. И вызывая
kill
, вовсе не факт, что мы стреляем в нужного.
Ну можно добавить один уровень костылей, хотя смысла особо нет:
function _readPidfile($pidfile) {
/* XXX: Race conditions are everywhere. But who cares? */
if (!file_exists($pidfile)) {
/* No such file - daemon not running */
return false;
}
$f = fopen($pidfile, "r");
if (!$f) {
/* Failed to open file - daemon probably not running */
return false;
}
if (flock($f, LOCK_EX | LOCK_NB)) {
/* Able to acuire lock - daemon not running */
fclose($f);
return false;
}
/* Return PID */
$pid = fgets($f);
fclose($f);
return $pid;
}
function readPidfile($pidfile) {
$pid1 = false;
$pid2 = true;
while ($pid1 !== $pid2) {
$pid1 = _readPidfile($pidfile);
sleep(0.1);
$pid2 = _readPidfile($pidfile);
}
return $pid1;
}