(file_get_contents('./daemon.active')+3)<date('Ymdhi')
и выполняетping('http://'.$host.'/daemon.php')
, если выражение верно.$fp = fopen("/tmp/lock.txt", "r+");
if (flock($fp, LOCK_EX)) { // выполняем эксклюзивную блокировку
ftruncate($fp, 0); // очищаем файл
fwrite($fp, "Что-нибудь пишем сюда\n");
fflush($fp); // очищаем вывод перед отменой блокировки
flock($fp, LOCK_UN); // отпираем файл
} else {
echo "Не удалось получить блокировку !";
}
fclose($fp);
<?php
function ping($host, $action=false){
$http=@fsockopen($host, 80, $errno, $errstr, 1);
if($http){
fwrite($http, "GET /".$action." HTTP/1.0\r\nAccept: */*\r\nHost: ".$host."\r\n\r\n");
fclose($http);
return true;
}else{
return false;
}
}
$host=$_SERVER[HTTP_HOST];
$id=uniqid();
//write a query
file_put_contents('./id/'.$id, json_encode($_GET));
file_put_contents('./taskss.list', $id."\n", LOCK_EX');
//watchdog for daemon
$f=fopen('./daemon.active');
flock($f, LOCK_SH);
// timeout 3 min
if((file_get_contents($f)+3)<date('Ymdhi')){
ping('http://'.$host.'/daemon.php');
sleep(1);
}
flock($f, LOCK_UN);
fclose($f);
//waiting for answer
while(true){
sleep(1);
$answer=file_get_contents('./answer/'.$id);
if($answer){
echo $answer;
break;
}
}
wouldblock
Необязательный третий параметр будет установлен в 1, если блокировка будет блокирующей (код ошибки EWOULDBLOCK). (не поддерживается на Windows)
//watchdog for daemon
$f = fopen('./daemon.active', 'rb');
if (flock($f, LOCK_EX | LOCK_NB)) {
$row = (int) fgets($f);
// timeout 3 min
if(($row + 3) < date('Ymdhi')){
ping('http://' . $host . '/daemon.php');
sleep(1);
}
flock($f, LOCK_UN);
}
fclose($f);
flock($f, LOCK_EX | LOCK_NB);
// читаем из файла задачу (без блокировки)
$f = fopen('./queue.jobs', 'rb');
$job = fgets($f);
fclose($f);
if ($job) {
$f = fopen('./queue.jobs', 'rb');
// Пытаемся залочить файл
$retries = 1000; // кол-во попыток на открытие файла
do {
if ($retries > 0) {
usleep(rand(1, 10000));
}
} while (--$retries > 0 && !flock($f, LOCK_EX));
if ($retries <= 0) {
echo "Can not lock file", PHP_EOL;
exit(0);
}
// Тут внимание! Читаем еще раз задачу и проверяем
$job = fgets($f);
if ($job) {
// Тут выполняем свою работу
echo "Job: ", $job, PHP_EOL;
// Обновим файлик с задачами (запишем все без верхней строки)
$rows = [];
while ($row = fgets($f)) {
$rows[] = $row;
}
file_put_contents('./queue.jobs', implode(PHP_EOL, $rows));
}
flock($f, LOCK_UN);
fclose($f);
}
<?php
set_time_limit(10);
function ping($host, $action=false){
$http=@fsockopen($host, 80, $errno, $errstr, 1);
if($http){
fwrite($http, "GET /".$action." HTTP/1.0\r\nAccept: */*\r\nHost: ".$host."\r\n\r\n");
fclose($http);
return true;
}else{
return false;
}
}
$host=$_SERVER[HTTP_HOST];
$id=uniqid();
//write a query
file_put_contents('./id/'.$id, json_encode($_GET));
file_put_contents('./tasks.list', $id."\n", LOCK_EX');
//watchdog for daemon
$f=fopen('./daemon.active');
if(flock($f, LOCK_EX|LOCK_NB)){
ping('http://'.$host.'/daemon.php');
usleep(25000);
}
flock($f, LOCK_UN);
fclose($f);
//waiting for answer
$i=0;
while(true){
usleep(25000);
$answer=file_get_contents('./answer/'.$id);
if($answer){
echo $answer;
break;
}elseif($i>20){ //5 sec
echo 'Error. Timed out.';
break;
}
$i++;
}
<?php
set_time_limit(0);
$f=fopen('./daemon.active');
flock($f, LOCK_EX);
while(true){
usleep(25000);
//некоторый код
}
...
//watchdog for daemon
$f=fopen('./daemon.active');
if(flock($f, LOCK_EX|LOCK_NB)){
ping('http://'.$host.'/daemon.php');
usleep(25000);
}
flock($f, LOCK_UN);
fclose($f);
...
...
$f=fopen('./daemon.active');
flock($f, LOCK_EX);
...