PHP Script занимает почти 15 секунд для загрузки - PullRequest
2 голосов
/ 12 ноября 2011

Я написал PHP-скрипт, который перебирает данную папку, извлекает из нее все изображения и отображает их на HTML-странице (в виде тегов).Размер страницы составляет около 14 КБ, но она занимает страницу почти 15 секунд.

Вот код:

function displayGallery( $gallery, $rel, $first_image ) {
    $prefix = "http://www.example.com/";
    $path_to_gallery = "gallery_albums/" . $gallery . "/";
    $handler = opendir( $path_to_gallery ); //opens directory
    while ( ( $file = readdir( $handler ) ) !== false ) { 
        if ( strcmp( $file, "." ) != 0 && strcmp( $file, ".." ) !=0 ) { 
            //check for "." and ".." files
            if ( isImage( $prefix . $path_to_gallery . $file ) ) {
                echo '<a href="' . $path_to_gallery . $file . '"></a>';
            } 
        }
    }
    closedir( $handler ); //closes directory
}

function isImage($image_file) {
  if (getimagesize($image_file)!==false) {
    return true;
  } else {
    return false;
  }
}

Я просматривал другие посты, но большинство из них имеют дело с запросами SQL, и это не мой случай.

Есть предложения, как это оптимизировать?

Ответы [ 5 ]

1 голос
/ 12 ноября 2011

Предложение вне поля здесь. Вы не указываете, как вы синхронизируете время выполнения. Если вы синхронизируете его в браузере, например, если загрузка страницы по ссылке занимает 15 секунд, проблема может не иметь никакого отношения к вашему сценарию. Я видел, как люди в прошлом создавали похожие страницы, пытаясь использовать изображения в качестве тегов, и они загружались вечно, потому что, даже если они отображают изображение с размером миниатюры или меньше, само изображение по-прежнему имеет размер 800 x 600 или около того. Я знаю, это звучит глупо, но убедитесь, что вы не просто отображаете большие изображения небольшого размера. Для скрипта было бы вполне разумно потребовать 15 секунд для загрузки и отображения 76 800 x 600 jpegs.

1 голос
/ 12 ноября 2011

Полагаю, это потому, что вы добавили префикс $ в вызове isImage. Таким образом, эта функция фактически загружает все ваши изображения прямо с вашего веб-сервера, а не ищет их локально.

Вы можете использовать функцию getimagesize (), она выдает E_NOTICE и возвращает FALSE, если файл не относится к типу изображения.

1 голос
/ 12 ноября 2011

Вы можете использовать PHP-профилировщик, например http://xdebug.org/docs/profiler, чтобы найти, какая часть скрипта работает вечно. Это может быть излишним для этой проблемы, но в долгосрочной перспективе вы можете быть рады, что потратили время на ее настройку.

0 голосов
/ 12 ноября 2011

проблема с getimagesize, она заняла 99,1% времени скрипта.

Версия № 1 - Оригинальный футляр enter image description here

Версия # 2 - Если вам действительно нужно использовать getimagesize с URL (http://)., тогда более быстрая альтернатива, найденная в http://www.php.net/manual/en/function.getimagesize.php#88793. Она читает только первые X байтов изображения. XHProf показывает, что это x10 Быстрее. Еще одной идеей может быть использование curl multi для параллельной загрузки https://stackoverflow.com/search?q=getimagesize+alternative

enter image description here

Версия # 3 - я думаю, что лучше всего подходит для вашего случая открывать файлы как обычные файловые системы без (http://). Это даже в x100 быстрее на Xhprof enter image description here

0 голосов
/ 12 ноября 2011

Я предполагаю, что проблема isImage.Я никогда не видел это раньше.Почему бы просто не проверить наличие определенных расширений файлов?Это довольно быстро.
Обновление: Вы также можете попробовать перейти на использование exif_imagetype(), которое, вероятно, быстрее, чем getimagesize() Помещение этой проверки в верхнюю функцию также будет быстрее.Ни одна из этих функций не должна была выполняться через веб-соединение - избегайте этого вообще.Лучше всего придерживаться расширения файла.

У вас еще нет прямого доступа к файлам?Каждый раз, когда вы что-то просматриваете в Интернете, это займет некоторое время - вам нужно ждать загрузки всего файла.Посмотрите файлы прямо в вашей системе.

Используйте scandir, чтобы сразу получить все имена файлов в массив и просмотреть их.Это, скорее всего, ускорит процесс, так как я предполагаю, что не будет туда-сюда, чтобы получить вещи по отдельности.

Вместо того, чтобы делать strcmp для . и .., просто делайте $file != '.' && $file != '..'

Кроме того, скорость будет зависеть от количества возвращаемых файлов, если их много, то будет медленным.Операционная система также может замедляться, если в каталоге слишком много файлов.Вы перебираете все файлы и каталоги, а не только изображения, так что это число, которое учитывается, а не только изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...