Экспорт:
Папки

/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();


?>
Участвуй в наполнении сайта, создай свое дерево знаний. Регистрация

@include_encode 2015