Повышение производительности при использовании php по сравнению с html с помощью img src - PullRequest
1 голос
/ 08 января 2012

Я показываю галерею изображений, которые я сохраняю ниже корня для безопасности. Есть эскизы для каждого JPEG. При отображении галереи я успешно установил

<img src='./php/getfile.php?file=xyz-thumb.jpg'></a>

getfile.php обрабатывает каждую миниатюру со следующим кодом. При нажатии на миниатюру тот же код загружает увеличенную версию изображения.

Я уже могу сказать, что этот код работает медленнее, чем HTML, и с потенциально 20-30 миниатюрами на странице я спорю, нужно ли мне сохранять миниатюры видимыми для public_html для повышения производительности. Есть ли более быстрый способ отображения миниатюр? Является ли fpassthru () более быстрым или желательным по другим причинам?

        // File Exists?
    if( file_exists($fullfilename)){

        // Parse Info / Get Extension
        $fsize = filesize($fullfilename);
        $path_parts = pathinfo($fullfilename);
        $ext = strtolower($path_parts["extension"]);

        // Determine Content Type
        switch ($ext) {
            case "pdf": $ctype="application/pdf"; break;
            case "exe": $ctype="application/octet-stream"; break;
            case "zip": $ctype="application/zip"; break;
            case "doc": $ctype="application/msword"; break;
            case "xls": $ctype="application/vnd.ms-excel"; break;
            case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
            case "gif": $ctype="image/gif"; break;
            case "png": $ctype="image/png"; break;
            case "jpeg":
            case "jpg": $ctype="image/jpg"; break;
            default: $ctype="application/force-download";
        }

        header("Pragma: public"); // required
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: private",false); // required for certain browsers
        header("Content-Type: $ctype");

        if ($mode == "view"){
            // View file
            header('Content-Disposition: inline; filename='.basename($fullfilename));
        } 
        else {
            // Download file
            header('Content-Disposition: attachment; filename='.basename($fullfilename));
        }

        header("Content-Transfer-Encoding: binary");
        header("Content-Length: ".$fsize);
        ob_clean();
        flush();
        readfile( $fullfilename );

    } else
        die('File Not Found:' . $fullfilename);

Ответы [ 2 ]

1 голос
/ 08 января 2012

Исходя из ваших комментариев выше, я бы сказал, что это звучит как очень неэффективный способ сделать это, в основном потому, что он останавливает нормальное кэширование.Если кто-то может автоматизировать очистку ваших полноразмерных изображений, он найдет способ обойти это (например, Selenium RC).

Если вас беспокоит только то, что кто-то снимает изображения, используйте другое решение.,Вот некоторые другие решения:

Honeypot - очень распространенная реализация.

0 голосов
/ 08 января 2012

Все, что связано с PHP, будет иметь заметное снижение производительности, особенно если вы проверяете базу данных для проверки учетных данных и т. Д.

Вы можете улучшить свой код, установив правильные заголовки кэша и т. Д. Но на самом делеЛучшее решение состоит в том, чтобы позволить apache обслуживать изображения как статические файлы.Apache невероятно хорош в обслуживании статических файлов, вы никогда не будете создавать PHP-скрипт, который работает так же хорошо, как Apache.

Один из способов обеспечить разумную защиту статических файлов - это поместить очень длинную и случайную строку вURL.Поэтому вместо:

./php/getfile.php?file=xyz-thumb.jpg

Используйте это как URL:

./files/usBmN5CssIL47qRroC77n90juaQoREThBbFZUddGneEH5jOuX6JpU5cH6zH1Xa5-thumb.jpg

И убедитесь, что индексы каталогов запрещены (чтобы пользователь не мог просто посетить ./files/.

Со случайным длинным именем файла, даже если хакер смог угадать миллиард URL-адресов в секунду , вселенная все равно бы закончилась задолго до того, как угадал все возможные URL-адреса.

Если вы беспокоитесь о том, что поисковые системы / etc каким-то образом индексируют URL-адреса файлов после какого-либо другого нарушения безопасности, вы можете поместить все файлы в каталог с другим случайным именем - и регулярно менять имя этого каталога (возможно, ежедневно, возможно, каждые 10 минут).В этом случае вам следует оставить старый функционал URL на короткое время после его переименования (возможно, с помощью символической ссылки на новое имя каталога?).

На первый взгляд это может показаться менее безопаснымчем проверка учетных данных пользователя. Но на самом деле, случайное имя файла вроде этого намного более безопасно, чем любое имя пользователя / пароль.

...