Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Конкурентная запись в файл / 20 сообщений из 20, страница 1 из 1
07.04.2014, 13:56
    #38607233
big-trot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конкурентная запись в файл
Выполняю логирование с помощью функции error_log (). Второй параметр равен 3, т.е. запись веду в свой файл. Наблюдается иногда такая ситуация, что идет параллельная запись, т.е. разные процессы одновременно получают доступ к файлу (файл при этом не блокируется) и одновременно пишут, и сохраняется то сообщение, которое записано последнее, если это последнее сообщение меньше первого, то от первого остается "хвост".
Как с этим бороться?
Спасибо.
...
Рейтинг: 0 / 0
14.04.2014, 18:02
    #38614581
SmeL_md
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конкурентная запись в файл
...
Рейтинг: 0 / 0
16.04.2014, 11:24
    #38616220
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конкурентная запись в файл
SmeL_md,

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

file_put_contents() - указав третий параметр аппенд. дабы небыло много обращений, можно свой клас написать где логирование, реально добавит лишь в масив строку, а потом одним махом все елементы масива в строку и в лог файл аппендом.
...
Рейтинг: 0 / 0
16.04.2014, 11:27
    #38616224
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конкурентная запись в файл
big-trotт.е. разные процессы одновременно получают доступ к файлу
вариант: каждый процесс пишет лог в свой файл. а перед смертью сливает свой лог в общий лог.
зависит от специфики задачи. какие объемы логов. частота добавления. что за процессы, как долго живут....
...
Рейтинг: 0 / 0
16.04.2014, 12:04
    #38616284
SmeL_md
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конкурентная запись в файл
alex564657498765453SmeL_md,

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

file_put_contents() - указав третий параметр аппенд. дабы небыло много обращений, можно свой клас написать где логирование, реально добавит лишь в масив строку, а потом одним махом все елементы масива в строку и в лог файл аппендом.т.е. Ваш вариант спасает от гонки? Не знаю как работает FILE_APPEND, пусть ТС проверит что произойдет если несколько одновременно откроют один и тот же файл и начнут в него писать мегабайты, сомневаюсь что логи не вклинятся между собой.
• Насчет того чтоб писать в разные файлы а перед смертью сливать, та же проблема.
• С мютекстом тоже беда, Вы не можете ждать пока файлик освободится, для того чтоб эксклюзивно записать, возможно скрипт умрет раньше.
Рекомендую БД , но если принципиально файл, то тогда чуть модифицируем вариант r u, каждый пишет в свой фалик, а потом приходит крон и клеит их.
...
Рейтинг: 0 / 0
16.04.2014, 15:11
    #38616587
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конкурентная запись в файл
SmeL_mdalex564657498765453SmeL_md,

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

file_put_contents() - указав третий параметр аппенд. дабы небыло много обращений, можно свой клас написать где логирование, реально добавит лишь в масив строку, а потом одним махом все елементы масива в строку и в лог файл аппендом.т.е. Ваш вариант спасает от гонки? Не знаю как работает FILE_APPEND, пусть ТС проверит что произойдет если несколько одновременно откроют один и тот же файл и начнут в него писать мегабайты, сомневаюсь что логи не вклинятся между собой.
• Насчет того чтоб писать в разные файлы а перед смертью сливать, та же проблема.
• С мютекстом тоже беда, Вы не можете ждать пока файлик освободится, для того чтоб эксклюзивно записать, возможно скрипт умрет раньше.
Рекомендую БД , но если принципиально файл, то тогда чуть модифицируем вариант r u, каждый пишет в свой фалик, а потом приходит крон и клеит их.

вы не дочитали, file_put_contents() & FILE_APPEND

И свой класс для сброса логов.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
class Logger{

static protected $_default_name = 'php';

static protected $_loggers = array();

protected $_logs = array();
protected $_name = '';

public static function instance($name = null)
{
if($name === null) {$name = self::$_default_name;}

$name = (string)$name;

if (!isset(self::$_loggers[$name]))
  self::$_loggers[$name] = new self($name);
}

return self::$_loggers[$name];
}

protected function __constructor($name)
{
$this->_name = $name;
}

public function log($log_str)
{
array_push($this->_logs, $log_str);
return $this;
}

public function __destructor()
{
file_put_contents($this->_name,explode("\r\n\",$this->_logs,FILE_APPEND);
}



как то так
...
Рейтинг: 0 / 0
16.04.2014, 15:20
    #38616599
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конкурентная запись в файл
авторif($name === null) {$name = self::$_default_name;}
не пишите так больше.
...
Рейтинг: 0 / 0
16.04.2014, 15:20
    #38616600
SmeL_md
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конкурентная запись в файл
alex564657498765453вы не дочитали, file_put_contents() & FILE_APPEND

И свой класс для сброса логов.

Код: php
1.
2.
3.
4.
5.
6.
class Logger{
...
public function __destructor()
{
file_put_contents($this->_name,explode("\r\n\",$this->_logs,FILE_APPEND);
}

как то такт.е. всем раздать по файлику для логов?
...
Рейтинг: 0 / 0
16.04.2014, 15:21
    #38616603
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конкурентная запись в файл
авторpublic function __destructor()
{
file_put_contents($this->_name,explode("\r\n\",$this->_logs,FILE_APPEND);
}

а вот это вообще бред.
...
Рейтинг: 0 / 0
16.04.2014, 15:29
    #38616616
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конкурентная запись в файл
ScareCrowавторpublic function __destructor()
{
file_put_contents($this->_name,explode("\r\n\",$this->_logs,FILE_APPEND);
}

а вот это вообще бред.

file_put_contents($this->_name,implode("\r\n\",$this->_logs)."\r\n",FILE_APPEND);

извините, нетбинс когда я путаю эти функция подсказывает описанием что она делает, и я исправляюсь:) 4 года пишу, и 4 года путаю эти две, пуш поп, и...чтото ещо я постояно путаю в пхп.

Ну идея ведь ясна?!
...
Рейтинг: 0 / 0
16.04.2014, 15:34
    #38616623
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конкурентная запись в файл
авторизвините, нетбинс когда я путаю эти функция подсказывает описанием что она делает, и я исправляюсь
тут вопрос не в этом. а в принципе.
...
Рейтинг: 0 / 0
17.04.2014, 12:47
    #38617409
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конкурентная запись в файл
SmeL_mdalex564657498765453вы не дочитали, file_put_contents() & FILE_APPEND

И свой класс для сброса логов.

Код: php
1.
2.
3.
4.
5.
6.
class Logger{
...
public function __destructor()
{
file_put_contents($this->_name,explode("\r\n\",$this->_logs,FILE_APPEND);
}

как то такт.е. всем раздать по файлику для логов?

хочешь делаешь так
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$result = Database::instance()->query('select * from table limit 10');
Logger::instance('db')->log('get result from database');

if(!$result) { Logger::instance('db-error')->log('result from database is bad');}


//хочешь общий
/*
лично я счас использую подобное для лога ошибок, но есть ещо профайлер который сам логирует в свои файлы, вот хочу перевести на это, и будет 4 разные файла, если надо ещо чтото, короче как душа желает.
*/
...
Рейтинг: 0 / 0
17.04.2014, 13:18
    #38617455
SmeL_md
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конкурентная запись в файл
alex564657498765453,
И что вы тут мне показали :) если в конце используется
Код: php
1.
2.
3.
public function __destructor()
{
file_put_contents($this->_name,explode("\r\n\",$this->_logs,FILE_APPEND);}

Пусть даже с корректным синтаксисом, и даже корректным заложенным смыслом, то это все равно ж, и не решает проблему автора.
...
Рейтинг: 0 / 0
17.04.2014, 14:20
    #38617551
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конкурентная запись в файл
SmeL_mdalex564657498765453,
И что вы тут мне показали :) если в конце используется
Код: php
1.
2.
3.
public function __destructor()
{
file_put_contents($this->_name,explode("\r\n\",$this->_logs,FILE_APPEND);}

Пусть даже с корректным синтаксисом, и даже корректным заложенным смыслом, то это все равно ж, и не решает проблему автора.

и цитата от автора

автори одновременно пишут, и сохраняется то сообщение, которое записано последнее, если это последнее сообщение меньше первого, то от первого остается "хвост".
Как с этим бороться?

веришь что в даном случае никаких хвастов не будет, логи каждого процеса в файле будут кучкой, а не так

Код: plaintext
1.
2.
3.
4.
5.
open file
read file
query from db
write file
close file
и это все логи 5 разных процесов, хотя выглядит как будто мы чтото прочитали из файла на основании этого запрос в базу и чтото записали в файл
...
Рейтинг: 0 / 0
17.04.2014, 14:22
    #38617560
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конкурентная запись в файл
ну и действия атомарные, одна запись в файл на скрипт, тоесть блокировка будет не больше, а даже меньше чем блокировки файла сесии если такое используеться. :)
...
Рейтинг: 0 / 0
17.04.2014, 14:29
    #38617574
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конкурентная запись в файл
и главное, насколько я понимаю, (могу ошибаться, ибо знаю со слов других)
при такой записи в файл на сервере физически происходит следующее

file_put_contents();
посылка команды ОС линукс
получение ответа не ссыте хлопцы все записано
и скрипт идёт дальше. реально же запись была сделана в файловый поток, и реально на шдд может попасть когда уже скрипт завершит работу.

любой вариант с fopen fclose будет работать иначе. пока реальной записи не произойдёт =сброс файлового буфера, ответ от fclose от ОС мы не получим.

тоесть если ещо есть проблемы с шдд изза большого числа дисковых операций, код отработает всёравно быстро.(предполагаем что логируем мы не по гектару текста за один запуск скрипта) - хотя и в этом случае может получиться так что гиг будет в буфере лежать(файловый буфер) а код уже завершил свою работу. я лично наблюдал такое, скрипт перегонял полтора гига, на момент завершения работы реально записано было в приёмник только 400 метров, 1.1 гига находилось в файловом буфере.
...
Рейтинг: 0 / 0
17.04.2014, 16:30
    #38617745
SmeL_md
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конкурентная запись в файл
alex564657498765453,
Неужели Вы не видите проблем? Возможно Ваш логгер работает на Ваших скриптах, и Вы уверены в нем на 100%, но он будет работать только на ваших нагрузках.
А теперь ваши идеи о логгере, т.е. собираем логи в единый массив и в деструкторе пишем. Т.о. если ваш код отлажен вы увидите лог, если возможны фатальные ошибки, ваш лог на данную ситуацию ни прольет ни капли.
Теперь о панацеи FILE_APPEND. Все клиенты пишут в одни и тежи файлы. 1 клиент пришел пишет, пришел второй оказывается 1-й пишет дергаем пока не освободится, пришел третий вот не задача файлик то занят ничего страшного подергаем до тайм аута еще живем, и надеяться на методы LIFO FIFO тут не приходится повезет как карты лягут. Т.е. если все штатно лог Вам это и покажет, а если не штатно то смотрим логи сервера :)
...
Рейтинг: 0 / 0
17.04.2014, 18:12
    #38617899
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конкурентная запись в файл
SmeL_md,

я не понял главного, есть другой вариант? можно писать в файл одновременно не пересекаясь чтобы не ждать?

есть идея не копить логи а делать 100 записей в файл независимых за работу скрипта?

я альтернативу вашу не понял...

сислог не стривает ибо вперемешку пишет...надо чтото своё. пишите своё демон логирования в чом дело??? и таки работать он будет по тому же принципу, подкопил логов, скинул, подкопил скинул, а не писать по 200 байт при разрмере кластера 4Кб.

чувствуете мысль?
предлагаете автору демон свой написать? или что?
...
Рейтинг: 0 / 0
17.04.2014, 18:23
    #38617915
SmeL_md
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конкурентная запись в файл
alex564657498765453SmeL_md,

я не понял главного, есть другой вариант? можно писать в файл одновременно не пересекаясь чтобы не ждать?

есть идея не копить логи а делать 100 записей в файл независимых за работу скрипта?

я альтернативу вашу не понял...

сислог не стривает ибо вперемешку пишет...надо чтото своё. пишите своё демон логирования в чом дело??? и таки работать он будет по тому же принципу, подкопил логов, скинул, подкопил скинул, а не писать по 200 байт при разрмере кластера 4Кб.

чувствуете мысль?
предлагаете автору демон свой написать? или что? 15889834 ,Как то вы не здорово реагируете :), там оно подчеркнуто, и даже есть именно для любителей файликов
...
Рейтинг: 0 / 0
17.04.2014, 18:33
    #38617929
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конкурентная запись в файл
SmeL_md 15889834 ,Как то вы не здорово реагируете :), там оно подчеркнуто, и даже есть именно для любителей файликов

:)а тю...эт я на работе...я счас на все реагирую подорвано.... :)

писать в кучу разных файлов медленее чем дозапись в один.

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

разные процессы - процес один! мастер процес, всегда заведует всем открытыми файлами, а процесам лишь даёт на время по очереди.

даже если процесы разные, влюбом случае чтобы записать чтото в файл, надо его октрыть, писать и закрыть.
и делать это в разные файлы, это ос ещо октрывать и закрывать с дозаписью файлы каталогов.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Конкурентная запись в файл / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]