Медленно закрывается файл

HaichO

Новичок
Добрый день.
У меня проблема с записью данных в лог-файл под Windows. При размере файла около 15 Мегабайт, запись занимает примерно секунду-полторы. Код такой:
PHP:
	if ($log_file = @fopen($log_file_name, "ab")) {
		flock($log_file, LOCK_EX);
		fputs($log_file, $file_msg);
		flock($log_file, LOCK_UN);
		fclose($log_file);
	}
Оказалось, что основное время тратится в функции fclose(). Попробовал заменить всё на вызов
PHP:
error_log($file_msg, 3, $log_file_name);
- работает также медленно. Из-за чего такое может быть и как это исправить?
 

AmdY

Пью пиво
Команда форума
попробуй в начале эту конструкцию заменить на file_put_contents
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
наверное, fclose() неявно вызывает fsync
на самом деле, можешь его не закрывать, gc сам закроет файл после работы скрипт
 

HaichO

Новичок
наверное, fclose() неявно вызывает fsync
на самом деле, можешь его не закрывать, gc сам закроет файл после работы скрипт
Пробовал. Скрипт выполняется те же 1-1.5 секунды. Такое впечатление, что перед добавлением новых данных файл целиком перечитывается.
 

Фанат

oncle terrible
Команда форума
название топика неудержимо напоминает анекдот про поручика ржевского в роли Подколёсина :)
 

HaichO

Новичок
Попробовал писать в лог так
PHP:
file_put_contents($log_file_name, $file_msg, FILE_APPEND | LOCK_EX);
Ничего не изменилось :( Всё те же полторы секунды.

Спасибо за ссылку. Не сочтите за наглость, а вас не затруднит ткнуть меня непосредственно в решение моей проблемы? А то вопросы я вижу, а ответы нет :(
 

Фанат

oncle terrible
Команда форума
Тони, в гугле, похоже, они говорят про запись файла целиком.
а тут-то у него всего лишь дописывание.

есть какой-нибудь аналог strace под винду, интересно?
 

HaichO

Новичок
Проверил с помощью Process Monitor. Вроде ничего криминального:
PHP:
21:32:17,0297920	httpd.exe	3136	CreateFile	log_1207.php	SUCCESS	Desired Access: Generic Write, Read Attributes, Disposition: OpenIf, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: Read, Write, AllocationSize: 0, OpenResult: Opened
21:32:17,0306424	httpd.exe	3136	CreateFile	log_1207.php	SUCCESS	Desired Access: Read Attributes, Synchronize, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Complete If Oplocked, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
21:32:17,0316824	httpd.exe	3136	QueryFileInternalInformationFile	log_1207.php	SUCCESS	IndexNumber: 0x20000000598e2
21:32:17,0392302	httpd.exe	3136	CloseFile	log_1207.php	SUCCESS	
21:32:17,0401027	httpd.exe	3136	QueryNameInformationFile	log_1207.php	SUCCESS	Name: log_1207.php
21:32:17,0427399	httpd.exe	3136	UnlockFileSingle	log_1207.php	RANGE NOT LOCKED	Offset: 0, Length: 1
21:32:17,0434321	httpd.exe	3136	LockFile	log_1207.php	SUCCESS	Exclusive: True, Offset: 0, Length: 1, Fail Immediately: False
21:32:17,0455553	httpd.exe	3136	QueryStandardInformationFile	log_1207.php	SUCCESS	AllocationSize: 15 785 984, EndOfFile: 15 782 025, NumberOfLinks: 1, DeletePending: False, Directory: False
21:32:17,0462440	httpd.exe	3136	WriteFile	log_1207.php	SUCCESS	Offset: 15 782 025, Length: 23
21:32:17,0486148	httpd.exe	3136	UnlockFileSingle	log_1207.php	SUCCESS	Offset: 0, Length: 1
21:32:17,0510044	httpd.exe	3136	CloseFile	log_1207.php	SUCCESS	
21:32:18,1433318	httpd.exe	3136	...
Последний вызов CloseFile выполнялся 1.0914755 сек.
 
Сверху