Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   проблема записи логов в файл (php) (https://forum.antichat.xyz/showthread.php?t=152810)

mr.celt 01.11.2009 10:21

проблема записи логов в файл (php)
 
Вот у меня тут проблемка произошла...
На удаленном линуксовом серваке нахождится php-скрипт, который пишет логи в файл, находящийся рядом. Вот код скрипта:

PHP код:

$text date('H-i-s')."\n"
$file fopen("logs.txt","a"); 
fwrite($file$text);
fclose($file); 

Скрипт наипростейший,) Он стабильно работал на протяжении года. Раз в неделю я логи удалял, т.е. файл логов принимал нулевой размер. 3 дня назад логи перестали записываться в пустой файл и спокойно попадают в него, когда размер файла логов не нулевой.
Права на файл с логами - 666. В чем причина такого изменения?

qW1zer 01.11.2009 11:25

Цитата:

$text = date('H-i-s');
$file = fopen("logs.txt","a");
fwrite($file, "$text\n");
fclose($file);
Попробуй так или
Цитата:

$text = date('H-i-s');
$file = fopen("logs.txt","a");
fwrite($file, "$text"\n);
fclose($file);
Так

Pashkela 01.11.2009 11:32

2 qW1zer:

Второй вариант некорректный, \n не может быть за пределами кавычек

2 mr.celt:

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

PHP код:

$text date('H-i-s')."\n";  
$file fopen("logs.txt","a");  
if (
$filefwrite($file$text "\r\n");  #<-----
fclose($file); 


qW1zer 01.11.2009 11:38

Pashkela
Спасибо за информацию!
А вот про доступность,разве нельзя просто открыть файл с права a+ и если файла нет,он будет создан!Или я не прав?

Pashkela 01.11.2009 11:42

http://php.net/manual/en/function.fopen.php

Цитата:

'a' Open for writing only; place the file pointer at the end of the file. If the file does not exist, attempt to create it.
'a+' Open for reading and writing; place the file pointer at the end of the file. If the file does not exist, attempt to create it.
+ просто открывает еще и на чтение, доступность тут не причем. Если файл не существует, то создаться и при а и при а+

Доступностью в данном случае названа проверка того, что файл открылся на запись:

$file = fopen("logs.txt","a");
if ($file) ...

PS: Успел открыться (создаться), прежде чем в него начали что-то писать. Актуально при большом потоке логируемых данных, да и вообще так правильней делать

b3 01.11.2009 12:03

Зачем так много строк? И кстати насчет прав, а разве не 777 права нада для записи в файл?
PHP код:

<?php
file_put_contents
('logs.txt',date('H-i-s')."\r\n",FILE_APPEND);
?>


Pashkela 01.11.2009 12:05

даже 644 достаточно

PS: Вообще иметь на хосте что-либо 755 или 777 чревато

Deathdreams 01.11.2009 12:59

b3

Твой вариант не на любой случай жизни расчитан.
В PHP4 нету функции file_put_contents, поэтому вариант пашкелы тут более уместен.

m0Hze 01.11.2009 13:03

Цитата:

Сообщение от Deathdreams
b3

Твой вариант не на любой случай жизни расчитан.
В PHP4 нету функции file_put_contents, поэтому вариант пашкелы тут более уместен.

За 2 года сайто строительства,встреча php4 всего 2-3 раза.

d_x 01.11.2009 13:49

Во варианте от 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);



cyanoвый 01.11.2009 14:19

ну или использовать функцию file_put_contents и не париться с fopen/flock

m0Hze 01.11.2009 15:00

Цитата:

Сообщение от cyanoвый
ну или использовать функцию file_put_contents и не париться с fopen/flock

...
Цитата:

Сообщение от b3
Зачем так много строк? И кстати насчет прав, а разве не 777 права нада для записи в файл?
PHP код:

<?php
file_put_contents
('logs.txt',date('H-i-s')."\r\n",FILE_APPEND);
?>


...
Цитата:

b3

Твой вариант не на любой случай жизни расчитан.
В PHP4 нету функции file_put_contents, поэтому вариант пашкелы тут более уместен.
Учимся читать

mr.celt 01.11.2009 23:29

Цитата:

Сообщение от Pashkela
Попробуй прежде чем писать в файл, проверять его на доступность:

У меня более интересный случай.) Расскажу как я изголялся в своих проверках:
1. при открытии fopen дескриптор получаю, т.е.
$file = fopen("text.txt", 'a');
if ($file) ... проверку прохожу

2. проверял на доступность записи функцией is_writeable - файл доступен на запись

3. использовал flock для блокирования файла - блокировать удавалось

4. как известно функция fwrite и ее псевдоним fputs возвращает количество записанных байтов, так вот если записывать в пустой файл, количество байтов = 0, а при не пустом файле = количеству записываемых (с функцией file_put_contents аналогичное происходит). Вот такая хрень...

Ключевой момент в том, что удается записывать в непустой файл!
Как это объяснить? Может какие настройки в интерпретаторе изменились или вообще на серваке? Но за свою практику впервые с таким сталкиваюсь. На локальном серваке такой же скрипт пишет в пустой файл без проблем.

m0Hze 01.11.2009 23:32

Цитата:

Сообщение от mr.celt
У меня более интересный случай.) Расскажу как я изголялся в своих проверках:
1. при открытии fopen дескриптор получаю, т.е.
$file = fopen("text.txt", 'a');
if ($file) ... проверку прохожу

2. проверял на доступность записи функцией is_writeable - файл доступен на запись

3. использовал flock для блокирования файла - блокировать удавалось

4. как известно функция fwrite и ее псевдоним fputs возвращает количество записанных байтов, так вот если записывать в пустой файл, количество байтов = 0, а при не пустом файле = количеству записываемых (с функцией file_put_contents аналогичное происходит). Вот такая хрень...

Ключевой момент в том, что удается записывать в непустой файл!
Как это объяснить? Может какие настройки в интерпретаторе изменились или вообще на серваке? Но за свою практику впервые с таким сталкиваюсь. На локальном серваке такой же скрипт пишет в пустой файл без проблем.

предлогаю войти в 21 век широким шагоми перейти на БД,например на mysql.

mr.celt 01.11.2009 23:39

Цитата:

Сообщение от m0Hze
предлогаю войти в 21 век широким шагоми перейти на БД,например на mysql.

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

rushter 02.11.2009 00:31

Самый правильный вариант от d_x,т.к при частых обращениях фаил просто будет чиститься.

betakley 03.11.2009 05:27

а чем error_log не устраивает? эффект вроде как тотже.

mr.celt 03.11.2009 11:43

Цитата:

Сообщение от betakley
а чем error_log не устраивает? эффект вроде как тотже.

Ну не в моем случае, логи пишутся в специальном формате и error_log не катит.... спустя 5 часов..

Не поверите, проблема решилась при помощи перезагрузки сервера :)
Видно за 300 дней аптайма что-то слетело.
Спасибо всем за обсуждалово.


Время: 00:18