проблема записи логов в файл (php)

Discussion in 'PHP' started by mr.celt, 1 Nov 2009.

  1. mr.celt

    mr.celt Elder - Старейшина

    Joined:
    6 Feb 2008
    Messages:
    133
    Likes Received:
    16
    Reputations:
    12
    Вот у меня тут проблемка произошла...
    На удаленном линуксовом серваке нахождится php-скрипт, который пишет логи в файл, находящийся рядом. Вот код скрипта:

    PHP:
    $text date('H-i-s')."\n"
    $file fopen("logs.txt","a"); 
    fwrite($file$text);
    fclose($file);
    Скрипт наипростейший,) Он стабильно работал на протяжении года. Раз в неделю я логи удалял, т.е. файл логов принимал нулевой размер. 3 дня назад логи перестали записываться в пустой файл и спокойно попадают в него, когда размер файла логов не нулевой.
    Права на файл с логами - 666. В чем причина такого изменения?
     
    #1 mr.celt, 1 Nov 2009
    Last edited: 1 Nov 2009
  2. qW1zer

    qW1zer Member

    Joined:
    24 Aug 2009
    Messages:
    129
    Likes Received:
    15
    Reputations:
    5
    Попробуй так или
    Так
     
  3. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    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);
     
  4. qW1zer

    qW1zer Member

    Joined:
    24 Aug 2009
    Messages:
    129
    Likes Received:
    15
    Reputations:
    5
    Pashkela
    Спасибо за информацию!
    А вот про доступность,разве нельзя просто открыть файл с права a+ и если файла нет,он будет создан!Или я не прав?
     
  5. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    http://php.net/manual/en/function.fopen.php

    + просто открывает еще и на чтение, доступность тут не причем. Если файл не существует, то создаться и при а и при а+

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

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

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

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,174
    Likes Received:
    1,157
    Reputations:
    202
    Зачем так много строк? И кстати насчет прав, а разве не 777 права нада для записи в файл?
    PHP:
    <?php
    file_put_contents
    ('logs.txt',date('H-i-s')."\r\n",FILE_APPEND);
    ?>
     
  7. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    даже 644 достаточно

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

    Deathdreams Elder - Старейшина

    Joined:
    8 Nov 2008
    Messages:
    342
    Likes Received:
    116
    Reputations:
    5
    b3

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

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    Во варианте от 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);
    }
     
    2 people like this.
  10. cyanoвый

    cyanoвый Banned

    Joined:
    29 Oct 2009
    Messages:
    10
    Likes Received:
    2
    Reputations:
    0
    ну или использовать функцию file_put_contents и не париться с fopen/flock
     
  11. mr.celt

    mr.celt Elder - Старейшина

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

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

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

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

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

    mr.celt Elder - Старейшина

    Joined:
    6 Feb 2008
    Messages:
    133
    Likes Received:
    16
    Reputations:
    12
    )) Да, спасибо, подумаю над этим. Но если серьезно, когда подкидываешь свои скрипты в чужой домен для... так сказать доп.функции не хочется еще встраиваться в его базу. Черева-то будет.
     
  13. betakley

    betakley Member

    Joined:
    29 Dec 2008
    Messages:
    18
    Likes Received:
    7
    Reputations:
    0
    а чем error_log не устраивает? эффект вроде как тотже.
     
  14. mr.celt

    mr.celt Elder - Старейшина

    Joined:
    6 Feb 2008
    Messages:
    133
    Likes Received:
    16
    Reputations:
    12
    Ну не в моем случае, логи пишутся в специальном формате и error_log не катит.... спустя 5 часов..

    Не поверите, проблема решилась при помощи перезагрузки сервера :)
    Видно за 300 дней аптайма что-то слетело.
    Спасибо всем за обсуждалово.
     
    #14 mr.celt, 3 Nov 2009
    Last edited: 3 Nov 2009