Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2014, 08:14   #1
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию Помогите с синхронизацией работы скрипта

Всем Добрый день!

Дело вот в чём: есть скрипт, в котором реализована работа с файлом.
Файл бывает большого размера, поэтом иногда эта работа занимает от секунды, до минуты!

Но бывает так, что в одно время в файле сразу два скрипта пытаются выполнить работу, в результате сохраняется результат только одного из скриптов - того, который отработает последним.

Как заставить второй скрипт полностью подождать выполнения первого?

Пример:

Код:
	function AddInformation($FileName,$data,$dup) {
		clearstatcache();
		$a=0;
		$result=is_writable($FileName);
		while (($result==False)and($a<15)) {
			sleep(1);
			$a=$a+1;
			$result=is_writable($FileName);
		}
		if ($result==True) {
			if ($dup==False) {
				$f = fopen($FileName,"a");
				fwrite($f,$data);
				fclose($f);
			} else {
				$fp=file($FileName);
				$arrData=array_unique(array_merge(array_map("trim",$fp),explode(PHP_EOL,$data)));
				$f = fopen($FileName,"w+");
				fwrite($f,implode(PHP_EOL,$arrData));
				fclose($f);
			}
		}
	}
Функция добавляет в файл только те строки, которых нет в файле.
Если файл большой, функция может выполняться минуту и более.
Но вызвана она может быть за минуту раза 3, в итоге сохраняется результат обработки последнего вызова.
Как исправить проблему?

P.S. Просто добавлять строки уникальные тоже нельзя - могут быть повторы если одновременно скрипт выполняется.
Нужно именно дождаться полного завершения работы первого вызова функции,потом только выполнять.

Последний раз редактировалось lollollollol; 13.05.2014 в 08:16.
lollollollol вне форума Ответить с цитированием
Старый 13.05.2014, 10:48   #2
buriat
Форумчанин
 
Регистрация: 28.06.2010
Сообщений: 189
По умолчанию

http://www.php.net/manual/ru/function.flock.php
buriat вне форума Ответить с цитированием
Старый 13.05.2014, 11:28   #3
Леди Кошка
Пользователь
 
Регистрация: 02.03.2009
Сообщений: 47
По умолчанию

Чисто ради любопытства - если получивший блокировку скрипт рухнет, что тогда делают? Конкурирующие скрипты вообще не получат доступ к файлу, пока не вмешается администратор? Не вижу в этой функции способа установить таймаут.
Леди Кошка вне форума Ответить с цитированием
Старый 13.05.2014, 12:10   #4
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

Как вариант чтобы не рухнул скрипт, установить время выполнения безконечное.
рано или поздно отработает.

Ещё думал может в БД записать Имя файла, время, и статус 1-занят
А скрипт будет раз в секунду проверять и ждать пока статус будет Свободен.


Хотя велосипед получается, думал мож есть какие стандартные метды, может чтото типа глобальных переменных или ещё чего
lollollollol вне форума Ответить с цитированием
Старый 13.05.2014, 14:10   #5
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,150
По умолчанию

гы.. если можно использовать БД - зачем использовать файлы?
ADSoft вне форума Ответить с цитированием
Старый 13.05.2014, 14:19   #6
Леди Кошка
Пользователь
 
Регистрация: 02.03.2009
Сообщений: 47
По умолчанию

Да нет, меня во-первых интересует вообще вылет скрипта по какой-то ошибке (не Вашего, в принципе), а не просто "слишком долгая работа" - нельзя исключить такую вероятность. А во-вторых, никакой велосипед от этого не спасает. flock как раз реализует этот подход - объявить файл "занятым" навсегда, пока занявший не освободит. А занявший может помер уже давно, а блокировку снять не успел. В других языках/фреймворках где-то встречала возможность задать в блокирующем процессе максимальное время блокировки, после которого ресурс автоматически освобождается. Принудительно снимать блокировку, установленную "скриптом-конкурентом", после некоего времени ожидания - не выход, ибо можно не заметить, что "конкурент" уже поменялся, и файл держит уже другой скрипт. Вообще война получится )))
Леди Кошка вне форума Ответить с цитированием
Старый 13.05.2014, 14:22   #7
Леди Кошка
Пользователь
 
Регистрация: 02.03.2009
Сообщений: 47
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
гы.. если можно использовать БД - зачем использовать файлы?
Вот кстати да. В БД механизм блокировок и транзакций уже реализован до нас, а при необходимости выполнить выгрузку данных в human-readable вид - совсем несложно, проще, чем так вот моск ломать.
Леди Кошка вне форума Ответить с цитированием
Старый 13.05.2014, 14:35   #8
buriat
Форумчанин
 
Регистрация: 28.06.2010
Сообщений: 189
По умолчанию

Цитата:
Сообщение от Леди Кошка Посмотреть сообщение
Чисто ради любопытства - если получивший блокировку скрипт рухнет, что тогда делают? Конкурирующие скрипты вообще не получат доступ к файлу, пока не вмешается администратор? Не вижу в этой функции способа установить таймаут.
Даю 99% что когда скрипт заканчивает работу, то происходит unlock вне зависимости от того упал он или завершил без ошибок.

Цитата:
Сообщение от ADSoft
гы.. если можно использовать БД - зачем использовать файлы?
+
buriat вне форума Ответить с цитированием
Старый 13.05.2014, 17:20   #9
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

Сделал синхронизацию через БД.

Ещё вопрос, по этой теме.

Допустим в текстовом файле есть 100 000 строк. В переменной $data 1 000 строк.
Функцией которая выше я добавляю в файл эти 1 000 строк, исключая из них те, которые уже есть в файле, т.е. дубликаты.
По сути получается что я каждую строку из 1 000 сравниваю со всеми 100к в файле, иначе никак.

Собственно вопрос:
Если вначале эти строки загнать в базу данных, и выполнять проверку на совпадение строк через БД, а потом сохранять в файл, будет быстрее или нет?

т.е. мой вариант
1. Загружаю в память файл
2. Проверяю какие строки припишем к файлу
3. Сохраняю всё это

Или с БД
1. Загружаю файл в БД
2. Проверяю через БД что нужно записать
3. Дописываю нужные строки к файлу через "a+"

Как думаете, какой подход более верный, в плане скорости выполнения и нагрузки?
lollollollol вне форума Ответить с цитированием
Старый 13.05.2014, 17:33   #10
buriat
Форумчанин
 
Регистрация: 28.06.2010
Сообщений: 189
По умолчанию

Зачем вобще файлы?
buriat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Timer. Считаем время работы скрипта bilibian Общие вопросы Delphi 6 27.02.2014 22:11
результат работы скрипта в ячейке таблицы MixanMM PHP 1 31.10.2013 23:27
Уменьшение скорости работы скрипта amdbodia PHP 3 16.01.2011 20:49
Логироване работы TIdTCPServer, проблема с синхронизацией Altera Работа с сетью в Delphi 0 05.09.2010 19:42
ajax индикатор работы скрипта ssdm JavaScript, Ajax 3 08.04.2010 17:04