Экспорт:
Папки
/446634661/yaziki-programmirovaniya/php/posledovatelniy-dostup
Не экспортировать закрытые директории
Преобразовывать заметки в html
Экспортировать
Применить |
![]() | ![]() |
| 2019-05-06 15:04:51 |
|
|
<?php
header('Content-Type: text/html; charset=utf-8', true);
// ini_set('error_reporting', E_ALL);
// ini_set('display_errors', 1);
// ini_set('display_startup_errors', 1);
// включаем буфер
ob_start();
function multi_access($data)
{
$data['count_try']++;
echo 'Попытка доступа: ' . $data['count_try'] . '<br>';
$hasFile = file_exists($data['lockFile']);
if($hasFile)
$filectime = filectime($data['lockFile']);
$data['lockFp'] = fopen($data['lockFile'], 'w');
//Будем ждать снятия блокировки по крайней мере сколько-то
$time_wait = 1;//Одну секунду
$usleep = 100000 * 3;// одна десятая якобы.. ну, умножим на 3 и получим одну 30-ую наверное...
$time_start = time();
$time_end = $time_start + 100;//Предохранитель.. т.е. по сути сколько ждем чужой скрипт прежде чем предпринимать меры. В рабочей версии можно секунд 100
$while = true;
$script_go = false;
$error_break = false;
while($while)
{
// Если блокировку получить не удалось, значит второй скрипт еще работает
if (!flock($data['lockFp'], LOCK_EX | LOCK_NB)) {
echo 'Доступ пока не получен, ждем... ' . date('H:i:s') . '<br>';
}
else
{
echo 'Доступ получен <br>';
$while = false;//Доступ получен
$script_go = true;
}
if(time() > $time_end)//Предохранитель
{
echo 'Вышли по предохранителю<br>';
$while = false;
$error_break = true;
}
usleep($usleep);
}
//Если мы тут - то либо все ок, либо вышли по предохранителю.
if ($hasFile)
{
echo 'На момент старта этого скрипта файл лока существовал. Вероятно работал другой скипт<br>';
if($error_break)
{
//Вышли по предохранителю.
//Время предохранителя заведомо больше предполагаемой отработки скрипта
echo 'Вышли по предохранителю.. значит надо удалять залоченный файл<br>';
if($filectime == filectime($data['lockFile']) && $filectime > 0)
{
echo 'Файл жив и все тот же<br>';
$time_live = time() - $filectime;
echo 'Файл живет ' . $time_live . ' секунд.<br>';
echo 'Убиваем<br>';
unlink($data['lockFile']);
$hasFile = file_exists($data['lockFile']);
if($hasFile)
{
echo 'Файл есть. Убить не получилось<br>';
//Это плохо.. нужно в лог записать..
log_multi_access(ob_get_contents());
if($data['ob_end_clean'])
ob_end_clean();// отключаем и очищаем буфер
}
else
{
echo 'Файл убит<br>';//Плохо, конечно.. нужно записать в лог
//В принципе на этом моменте можно заново пробовать создать файл получить доступ для отработки
log_multi_access(ob_get_contents());
if($data['ob_end_clean'])
ob_end_clean();// отключаем и очищаем буфер
if($data['count_try'] == 1)
return multi_access($data);//Один раз еще всего попробуем, чтобы в рекурсию не уйти
else
return $data;
}
}
}
else
$script_go = true;
}
if($script_go)
$data['access_run'] = true;
else
$data['access_run'] = false;
return $data;
}
function log_multi_access($log)
{
global $file_log;
$fp = fopen(realpath(__DIR__) . "/" . $file_log, 'a');
$trace = fwrite($fp, "\n " . date("Y-m-d H:i:s") . " log=" . $log . " \n");
fclose($fp);
}
$ob_end_clean = true;//Чистить ли буфер
$lockFile = __FILE__.'.lock';
$file_log = 'log_multi_access.txt';
$data_access = multi_access(array('count_try' => 0, 'lockFile' => $lockFile, 'ob_end_clean' => $ob_end_clean));
if($data_access['access_run'])
{
//Вот сюда заходим тока если (другой скрипт не держит или отпустил)
echo 'go: ' . date('H:i:s') . '<br>';
sleep(10);
echo 'end ' . date('H:i:s') . ' <br>';
$lockFp = $data_access['lockFp'];
// По окончании работы необходимо снять блокировку и удалить файл
register_shutdown_function(function() use ($lockFp, $lockFile) {
flock($lockFp, LOCK_UN);
if(file_exists($data['lockFile']))
unlink($lockFile);
});
}
?>| 2019-04-24 13:01:07 |
|
|
<?php
header('Content-Type: text/html; charset=utf-8', true);
// включаем буфер
ob_start();
function multi_access($count_try = 0)
{
global $ob_end_clean;
$count_try++;
echo 'Попытка доступа: ' . $count_try . '<br>';
$lockFile = __FILE__.'.lock';
$hasFile = file_exists($lockFile);
if($hasFile)
$filectime = filectime($lockFile);
$lockFp = fopen($lockFile, 'w');
//Будем ждать снятия блокировки по крайней мере сколько-то
$time_wait = 1;//Одну секунду
$usleep = 100000 * 3;// одна десятая якобы.. ну, умножим на 3 и получим одну 30-ую наверное...
$time_start = time();
$time_end = $time_start + 100;//Предохранитель.. т.е. по сути сколько ждем чужой скрипт прежде чем предпринимать меры. В рабочей версии можно секунд 100
$while = true;
$script_go = false;
$error_break = false;
while($while)
{
// Если блокировку получить не удалось, значит второй скрипт еще работает
if (!flock($lockFp, LOCK_EX | LOCK_NB)) {
echo 'Доступ пока не получен, ждем... ' . date('H:i:s') . '<br>';
}
else
{
echo 'Доступ получен <br>';
$while = false;//Доступ получен
$script_go = true;
}
if(time() > $time_end)//Предохранитель
{
echo 'Вышли по предохранителю<br>';
$while = false;
$error_break = true;
}
usleep($usleep);
}
//Если мы тут - то либо все ок, либо вышли по предохранителю.
if ($hasFile)
{
echo 'На момент старта этого скрипта файл лока существовал. Вероятно работал другой скипт<br>';
if($error_break)
{
//Вышли по предохранителю.
//Время предохранителя заведомо больше предполагаемой отработки скрипта
echo 'Вышли по предохранителю.. значит надо удалять залоченный файл<br>';
if($filectime == filectime($lockFile) && $filectime > 0)
{
echo 'Файл жив и все тот же<br>';
$time_live = time() - $filectime;
echo 'Файл живет ' . $time_live . ' секунд.<br>';
echo 'Убиваем<br>';
unlink($lockFile);
$hasFile = file_exists($lockFile);
if($hasFile)
{
echo 'Файл есть. Убить не получилось<br>';
//Это плохо.. нужно в лог записать..
log_multi_access(ob_get_contents());
if($ob_end_clean)
ob_end_clean();// отключаем и очищаем буфер
}
else
{
echo 'Файл убит<br>';//Плохо, конечно.. нужно записать в лог
//В принципе на этом моменте можно заново пробовать создать файл получить доступ для отработки
log_multi_access(ob_get_contents());
if($ob_end_clean)
ob_end_clean();// отключаем и очищаем буфер
if($count_try == 1)
multi_access($count_try);//Один раз еще всего попробуем, чтобы в рекурсию не уйти
else
return false;
}
}
}
else
$script_go = true;
}
if($ob_end_clean)
ob_end_clean();// отключаем и очищаем буфер
if($script_go)
content_fnc();
else
return false;
//================================
//================================
// По окончании работы необходимо снять блокировку и удалить файл
register_shutdown_function(function() use ($lockFp, $lockFile) {
flock($lockFp, LOCK_UN);
unlink($lockFile);
});
}
function log_multi_access($log)
{
global $file_log;
$fp = fopen(realpath(__DIR__) . "/" . $file_log, 'a');
$trace = fwrite($fp, "\n " . date("Y-m-d H:i:s") . " log=" . $log . " \n");
fclose($fp);
}
function content_fnc()
{
//Функция к которой нужно было обеспечить последовательный доступ
echo 'go: ' . date('H:i:s') . '<br>';
sleep(10);
echo 'end ' . date('H:i:s') . ' <br>';
}
$file_log = 'log_multi_access.txt';//Путь к файлу лога если будут какие ошибки
$ob_end_clean = true;//Чистить ли буфер
multi_access();
?>





