Несоответствие длины PHP контента с пользовательским скриптом доставки контента


Добрый день всем,

При разработке сайта хобби я столкнулся со следующей проблемой. Чтобы предотвратить несанкционированный доступ пользователей к файлам изображений на сервере, я установил папку, содержащую изображения, чтобы запретить-все в nginx. Это работает нормально, но когда я использую следующий PHP-скрипт для доступа к файлам изображений в папке, Chrome случайным образом отказывается загружать их, выдавая следующую ошибку: "net:: ERR_CONTENT_LENGTH_MISMATCH". С random я имею в виду, что иногда изображения будут загружаться нормально. Я пытался очистить выходной буфер до и после вызова readfile (), но ничего не решает проблему. Заранее спасибо за помощь!

PS: Если вы хотите увидеть больше исходного кода / конфигурационных файлов, просто дайте мне знать.

Скрипт PHP:

<?php
if(!empty($_GET['tconst'])) {

        //Included login script contains this method
        if(login_check($mysqlisecure)) {
            $tconst = preg_replace( '#[^.w]#', '', $_GET['tconst'] );

            $file = "{$_SERVER['DOCUMENT_ROOT']}/content/posters/{$tconst}.jpg";

            if (file_exists($file)) {

                $filesize = filesize($file);

                header('Expires: '.gmdate('D, d M Y H:i:s GMT', time() + (60 * 60 * 24)));
                header("Content-Type: image/jpeg");
                header("Content-Length: ".$filesize);

                readfile($file);
            }
        }
}
exit();
2 2

2 ответа:

В конечном счете это была более глубокая проблема, чем просто PHP-скрипты. При последовательной загрузке изображений PHP5-fpm создает кэш, из которого он, вероятно, может обрабатывать запросы быстрее. Проблема заключалась в том, что папка кэша была сгенерирована во время тестирования конфигурационных файлов для nginx, работающего от имени root. Когда я переключился на "производство", PHP5-fpm и nginx не могли получить полный доступ для чтения/записи через эту папку с помощью user: www-data. Когда запрос на загрузку изображения повторялся несколько раз, PHP5-fpm попытался получить доступ к папкам кэша, но не смог и поэтому не завершил запрос, отправив клиенту только 65 536 байт. Простое исправление состояло в том, чтобы удалить папку кэша, расположенную по адресу /etc/nginx/fastcgi_temp, позволить PHP5-fpm регенерировать ее, и все работало.

Чтение лог-файлов nginx действительно помогло мне в этот раз

Вместо filesize ($file); используйте filesize ($fileLocation) .то же, что и для функцию ReadFile($filelocation, который); Это сработало для меня.

    header('Content-Length: '.filesize($fileLocation)); 
    ob_clean();
    flush();
    readfile($fileLocation);