...
//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);
...
<?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);
//некоторый код
}
wouldblock
Необязательный третий параметр будет установлен в 1, если блокировка будет блокирующей (код ошибки EWOULDBLOCK). (не поддерживается на Windows)