баг: CFileLogRoute и проверка существования файла

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
502
Сообщения: 36
Зарегистрирован: 2011.07.15, 10:07

баг: CFileLogRoute и проверка существования файла

Сообщение 502 »

CFileLogRoute

Код: Выделить всё

protected function processLogs($logs)
    {
        $logFile=$this->getLogPath().DIRECTORY_SEPARATOR.$this->getLogFile();
        if(@filesize($logFile)>$this->getMaxFileSize()*1024)  // вот тут, если файла нет, будет 'PHP warning' на 'filesize'
            $this->rotateFiles();
        $fp=@fopen($logFile,'a');
        @flock($fp,LOCK_EX);
        foreach($logs as $log)
            @fwrite($fp,$this->formatLogMessage($log[0],$log[1],$log[2],$log[3]));
        @flock($fp,LOCK_UN);
        @fclose($fp);
    }
 
Skiller
Сообщения: 627
Зарегистрирован: 2011.11.27, 00:21

Re: баг: CFileLogRoute и проверка существования файла

Сообщение Skiller »

Поэтому там стоит @
502
Сообщения: 36
Зарегистрирован: 2011.07.15, 10:07

Re: баг: CFileLogRoute и проверка существования файла

Сообщение 502 »

Skiller писал(а):Поэтому там стоит @
да но срабатывает 'register_shutdown_function' + 'error_get_last'
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: баг: CFileLogRoute и проверка существования файла

Сообщение samdark »

Ммм… а можно тесткейс сделать, чтобы вживую посмотреть на последствия?
502
Сообщения: 36
Зарегистрирован: 2011.07.15, 10:07

Re: баг: CFileLogRoute и проверка существования файла

Сообщение 502 »

Код: Выделить всё

class MyWebApplication extends CWebApplication
{
    public function __construct($config=null)
    {
        parent::__construct($config);
        register_shutdown_function(array($this, 'shutdown'));
    }

    public function shutdown()
    {
        if (YII_ENABLE_ERROR_HANDLER && ($error = error_get_last()))
        {
            $this->handleError($error['type'], $error['message'], $error['file'], $error['line']);
        }
    }
}

Код: Выделить всё

Yii::createApplication('MyWebApplication', $config)->run();

Код: Выделить всё

public function actionError()
    {
        $error = Yii::app()->errorHandler->error;
// тут рендерится инфо от том что была ошибка, хотя на сайте все нормально
    }
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: баг: CFileLogRoute и проверка существования файла

Сообщение samdark »

А, ну так сами обработчик написали… хотя, если знаете, как красиво сделать без @, можно убрать.
502
Сообщения: 36
Зарегистрирован: 2011.07.15, 10:07

Re: баг: CFileLogRoute и проверка существования файла

Сообщение 502 »

Sam Dark писал(а):А, ну так сами обработчик написали… хотя, если знаете, как красиво сделать без @, можно убрать.

Код: Выделить всё

if(file_exists($logFile) && filesize($logFile)>$this->getMaxFileSize()*1024)
 
вроде так
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: баг: CFileLogRoute и проверка существования файла

Сообщение samdark »

Порыл чуть поглубже. Получается разница в скорости работы кода в случае если файл существует (а это у нас случай наиболее частый) в 0.0001721 секунды, что на большом количестве файлов может привести к снижению производительности. В нашем случае код вызывается единожды, так что особой разницы не будет. Вот только я сомневаюсь, что file_exists покрывает все warning-и, которые кидает filesize. Например, что будет, если файл имеется, но читать его прав нет?
502
Сообщения: 36
Зарегистрирован: 2011.07.15, 10:07

Re: баг: CFileLogRoute и проверка существования файла

Сообщение 502 »

Sam Dark писал(а):Вот только я сомневаюсь, что file_exists покрывает все warning-и, которые кидает filesize. Например, что будет, если файл имеется, но читать его прав нет?

Код: Выделить всё

        $logFile=$this->getLogPath().DIRECTORY_SEPARATOR.$this->getLogFile();
        if (is_writable($this->getLogPath()) && ($fp=@fopen($logFile,'a')))
        {
            if(filesize($logFile)>$this->getMaxFileSize()*1024)
                $this->rotateFiles();
            @flock($fp,LOCK_EX);
            // ...
            @fclose($fp);
        }
 
а так?

мне вот только немного не понятно что делает метод 'rotateFiles'
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: баг: CFileLogRoute и проверка существования файла

Сообщение samdark »

А так у вас ругнётся fopen :) Из него тоже @ придётся убрать.

rotateFiles заставляет логгер писать в следующий файл, если текущий стал слишком жирным.
502
Сообщения: 36
Зарегистрирован: 2011.07.15, 10:07

Re: баг: CFileLogRoute и проверка существования файла

Сообщение 502 »

Sam Dark писал(а):А так у вас ругнётся fopen
я добавил проверку 'is_writable'
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: баг: CFileLogRoute и проверка существования файла

Сообщение samdark »

logPath может быть writable, а сам существующий файл нет.
502
Сообщения: 36
Зарегистрирован: 2011.07.15, 10:07

Re: баг: CFileLogRoute и проверка существования файла

Сообщение 502 »

ну, можно ещё добавить 'is_writable' для файла
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: баг: CFileLogRoute и проверка существования файла

Сообщение SiZE »

Sam Dark писал(а):rotateFiles заставляет логгер писать в следующий файл, если текущий стал слишком жирным.
Сейчас искал по этому поводу информацию. Наткнулся на данную тему, создавать новую не буду.

У меня под Win 8.1 пишет лог в один файл, т.е. rotateFiles никогда не вызывается. Когда заливаю проект на никсовый сервер, все ок. Не удобно, когда лезешь почитать лог, а он с десяток метров, надо удалить и перезапустить скрипт, чтобы почитать.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: баг: CFileLogRoute и проверка существования файла

Сообщение samdark »

Можно зарепортить на github? Я проверю как время будет. У меня как раз Win 8.1 есть.
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: баг: CFileLogRoute и проверка существования файла

Сообщение SiZE »

Sam Dark писал(а):Можно зарепортить на github? Я проверю как время будет. У меня как раз Win 8.1 есть.
Я подебажил. Может кому пригодится. В rotateFiles заходит, но метод rename не выполняется из-за отсутствия прав под виндой. Попробовал добавить copy unlink, результата не дало. Через exec DEL тоже. Заработало только когда выставил в конфиге параметр rotateByCopy=true.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: баг: CFileLogRoute и проверка существования файла

Сообщение samdark »

Всё равно стоит зарепортить с результатами исследований.
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: баг: CFileLogRoute и проверка существования файла

Сообщение SiZE »

Sam Dark писал(а):Всё равно стоит зарепортить с результатами исследований.
Я извиняюсь за дилетантский вопрос. А репортить через issue ин инглишь? Я понял в чем косяк.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: баг: CFileLogRoute и проверка существования файла

Сообщение samdark »

Желательно, но можно и на русском.
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: баг: CFileLogRoute и проверка существования файла

Сообщение SiZE »

Sam Dark писал(а):Желательно, но можно и на русском.
https://github.com/yiisoft/yii/issues/3642
Ответить