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

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

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

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

file_put_contents() - указав третий параметр аппенд. дабы небыло много обращений, можно свой клас написать где логирование, реально добавит лишь в масив строку, а потом одним махом все елементы масива в строку и в лог файл аппендом.т.е. Ваш вариант спасает от гонки? Не знаю как работает FILE_APPEND, пусть ТС проверит что произойдет если несколько одновременно откроют один и тот же файл и начнут в него писать мегабайты, сомневаюсь что логи не вклинятся между собой.
• Насчет того чтоб писать в разные файлы а перед смертью сливать, та же проблема.
• С мютекстом тоже беда, Вы не можете ждать пока файлик освободится, для того чтоб эксклюзивно записать, возможно скрипт умрет раньше.
Рекомендую БД , но если принципиально файл, то тогда чуть модифицируем вариант r u, каждый пишет в свой фалик, а потом приходит крон и клеит их.
...
Рейтинг: 0 / 0
Конкурентная запись в файл
    #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
Конкурентная запись в файл
    #38616599
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторif($name === null) {$name = self::$_default_name;}
не пишите так больше.
...
Рейтинг: 0 / 0
Конкурентная запись в файл
    #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
Конкурентная запись в файл
    #38616603
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторpublic function __destructor()
{
file_put_contents($this->_name,explode("\r\n\",$this->_logs,FILE_APPEND);
}

а вот это вообще бред.
...
Рейтинг: 0 / 0
Конкурентная запись в файл
    #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
Конкурентная запись в файл
    #38616623
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторизвините, нетбинс когда я путаю эти функция подсказывает описанием что она делает, и я исправляюсь
тут вопрос не в этом. а в принципе.
...
Рейтинг: 0 / 0
Конкурентная запись в файл
    #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
Конкурентная запись в файл
    #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
Конкурентная запись в файл
    #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
Конкурентная запись в файл
    #38617560
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и действия атомарные, одна запись в файл на скрипт, тоесть блокировка будет не больше, а даже меньше чем блокировки файла сесии если такое используеться. :)
...
Рейтинг: 0 / 0
Конкурентная запись в файл
    #38617574
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и главное, насколько я понимаю, (могу ошибаться, ибо знаю со слов других)
при такой записи в файл на сервере физически происходит следующее

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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