Я написал простую функцию, используемую для определения того, запущен ли уже сценарий и предотвращения дублирования процессов:
class SomeClass{
public static function processLock($name)
{
$lockFile = "/tmp/" . $name;
$fp = fopen($lockFile, "w+");
if ($fp === false)
{
echo "Already running.\n";
exit;
}
else
{
if ( ! flock($fp, LOCK_EX | LOCK_NB))
{
echo "Already running.\n";
exit;
}
}
return $fp;
}
}
Затем я могу вызвать такую функцию вверху скрипта php:
Script_A:
<?
include_once "/SomeClass.php";
$lock = SomeClass::processLock("script_A_lock");
и это прекрасно работает ..... 99% времени. Однако иногда я обнаруживаю, что «script_A» не работает (он должен всегда работать).
Затем я запускаю lsof /tmp/script_A_lock
, чтобы понять, почему «script_A» не запускается.
Результаты не имеют смысла! Я получаю что-то вроде этого:
COMMAND PID ......... NAME
Script_B 234 ......... script_A_lock
Несвязанный скрипт "script_B" каким-то образом украл блокировку файла!
Итак:
- Как это происходит? Слово «script_A_lock» ТОЛЬКО появляется в Script_A (я искал весь проект), а Script_A НИКОГДА не включен.
- Как я могу предотвратить это? Очевидно, что только скрипт A должен содержать «script_A_lock».