autosoft
Новичок
Запуск уникального процесса
Понадобилось написать скрипт, который не допускал бы параллельное выполнение самого себя в одно и тоже время.
Сделал с использованием PID - в Unix все как надо, а вот в Windows появились вопросы.
Как в Windows узнать существует процесс с заданным PID или нет?
Для Windows расширения posix_* и pcntl_* недоступны.
Скрипт для иллюстрации к сказанному:
Понадобилось написать скрипт, который не допускал бы параллельное выполнение самого себя в одно и тоже время.
Сделал с использованием PID - в Unix все как надо, а вот в Windows появились вопросы.
Как в Windows узнать существует процесс с заданным PID или нет?
Для Windows расширения posix_* и pcntl_* недоступны.
Скрипт для иллюстрации к сказанному:
PHP:
<?php
function process_instance($cmd) {
$posix = function_exists("posix_getpid");
$file = ".lock";
$result = false;
switch ($cmd) {
case "isset":
if (@file_exists($file)) if ($posix) {
if (is_numeric($pid = @file_get_contents($file)))
if ($pid == (integer) $pid) $result = posix_kill($pid, 0);
} else $result = true;
break;
case "create":
if ($posix &&
@file_exists($file) &&
is_numeric($pid = @file_get_contents($file)) &&
$pid == (integer) $pid &&
!posix_kill($pid, 0)) @unlink($file);
if (!@file_exists($file) && ($file = @fopen($file, "a"))) {
$result = $posix ? @fwrite($file, posix_getpid()) : true;
$result = @fclose($file) && $result;
}
break;
case "free":
$result = @file_exists($file) ? @unlink($file) : true;
break;
}
return $result;
}
if (process_instance("create")) {
// ...
process_instance("free");
}
?>
