Вот у меня тут проблемка произошла... На удаленном линуксовом серваке нахождится php-скрипт, который пишет логи в файл, находящийся рядом. Вот код скрипта: PHP: $text = date('H-i-s')."\n"; $file = fopen("logs.txt","a"); fwrite($file, $text); fclose($file); Скрипт наипростейший,) Он стабильно работал на протяжении года. Раз в неделю я логи удалял, т.е. файл логов принимал нулевой размер. 3 дня назад логи перестали записываться в пустой файл и спокойно попадают в него, когда размер файла логов не нулевой. Права на файл с логами - 666. В чем причина такого изменения?
2 qW1zer: Второй вариант некорректный, \n не может быть за пределами кавычек 2 mr.celt: Попробуй прежде чем писать в файл, проверять его на доступность: PHP: $text = date('H-i-s')."\n"; $file = fopen("logs.txt","a"); if ($file) fwrite($file, $text . "\r\n"); #<----- fclose($file);
Pashkela Спасибо за информацию! А вот про доступность,разве нельзя просто открыть файл с права a+ и если файла нет,он будет создан!Или я не прав?
http://php.net/manual/en/function.fopen.php + просто открывает еще и на чтение, доступность тут не причем. Если файл не существует, то создаться и при а и при а+ Доступностью в данном случае названа проверка того, что файл открылся на запись: $file = fopen("logs.txt","a"); if ($file) ... PS: Успел открыться (создаться), прежде чем в него начали что-то писать. Актуально при большом потоке логируемых данных, да и вообще так правильней делать
Зачем так много строк? И кстати насчет прав, а разве не 777 права нада для записи в файл? PHP: <?php file_put_contents('logs.txt',date('H-i-s')."\r\n",FILE_APPEND); ?>
b3 Твой вариант не на любой случай жизни расчитан. В PHP4 нету функции file_put_contents, поэтому вариант пашкелы тут более уместен.
Во варианте от Pashkela если файл не может быть открыт, то fclose вывалит warning. Плюс блочить доступ на запись к файлу неплохо, если в лог активно записи добавляются несколькими процессами. PHP: $text = date('H-i-s')."\n"; $file = fopen('logs.txt','a'); if ($file) { flock($file,LOCK_EX); fwrite($file, $text); flock($file,LOCK_UN); fclose($file); }
У меня более интересный случай.) Расскажу как я изголялся в своих проверках: 1. при открытии fopen дескриптор получаю, т.е. $file = fopen("text.txt", 'a'); if ($file) ... проверку прохожу 2. проверял на доступность записи функцией is_writeable - файл доступен на запись 3. использовал flock для блокирования файла - блокировать удавалось 4. как известно функция fwrite и ее псевдоним fputs возвращает количество записанных байтов, так вот если записывать в пустой файл, количество байтов = 0, а при не пустом файле = количеству записываемых (с функцией file_put_contents аналогичное происходит). Вот такая хрень... Ключевой момент в том, что удается записывать в непустой файл! Как это объяснить? Может какие настройки в интерпретаторе изменились или вообще на серваке? Но за свою практику впервые с таким сталкиваюсь. На локальном серваке такой же скрипт пишет в пустой файл без проблем.
)) Да, спасибо, подумаю над этим. Но если серьезно, когда подкидываешь свои скрипты в чужой домен для... так сказать доп.функции не хочется еще встраиваться в его базу. Черева-то будет.
Ну не в моем случае, логи пишутся в специальном формате и error_log не катит.... спустя 5 часов.. Не поверите, проблема решилась при помощи перезагрузки сервера Видно за 300 дней аптайма что-то слетело. Спасибо всем за обсуждалово.