Проверка существования картинки

Тема в разделе "PHP", создана пользователем Matinier, 28 апр 2011.

Модераторы: latteo
  1. Matinier

    Matinier Постоялец

    Регистр.:
    5 окт 2009
    Сообщения:
    65
    Симпатии:
    4
    День добрый!

    Есть нагруженный проект. Пусть это будет электронный магазин, в коем товаров over 9000 и все были без картинок.
    Появилась необходимость поставить каждому товару в соответствие картинку, которая лежит в определенной папке на сервере.
    Нужно теперь определять есть ли у товара картинка или выводить заглушку.
    Я вижу 2 варианта:
    1) Сделать альтер таблицы с информацией о товаре и добавить поле с флагом о существовании картинки
    2) Каждый раз проверять существование файла с картинкой на сервере одной из встроенных функций ( file_exists, is_file, stat etc.), т.е. дергать файловую систему

    Внимание вопрос: что более правильно с архитектурной точки зрения и менее пагубно скажется на производительности?
     
  2. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    Как вариант в таблицу описания товара добавь поле в котором будет храниться путь к картинке. Инфу о товаре ты по любому будешь выгружать из таблицы полностью, при этом проверка на пустое поле практически никакого влияния не окажет на загрузку сервера...
     
  3. Matinier

    Matinier Постоялец

    Регистр.:
    5 окт 2009
    Сообщения:
    65
    Симпатии:
    4
    Понимаешь, тут вот какая проблема встает: если добавлять поле в таблицу, то нужно будет просмотреть код, что бы везде правильно были прописаны insert'ы в эту таблицу.
     
  4. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    Хм... а информация о том какая картинка какому продукту принадлежит у тебя где хранится? а insert должен быть только в двух местах - при добавлении продукта в базу ну и в редактировании существующего продукта...
     
  5. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    При редактировании будет апдейт, а не инсерт.
     
  6. -=Xardas=-

    -=Xardas=-

    Регистр.:
    17 сен 2008
    Сообщения:
    250
    Симпатии:
    58
    проверяй наличие файла методами реврайта, если файла нету выдавай заглушку
     
  7. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    990
    Симпатии:
    266
    PHP:
    if ( file_exists('путь до картинки') ){
    echo 
    '<img src="'.'путь до картинки'.'">'
    }
    else{
    echo 
    '<img src="'.'путь до заглушки'.'">'
    }
    при этом пути указываются для хостинга, на котором запускается php скрипт. Если указывать путь через http:// то работать не будет.

    Путь до картинки и до заглушки вы должны уже знать заранее.
     
  8. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    Ты читал вообще, что до тебя писали тут, нуб? Самый оптимальный вариант предложил Xardas. Пример для apache mod_rewrite:
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)\.jpg$ img/thumbnail.jpg [L]
     
  9. t3s

    t3s

    Регистр.:
    16 фев 2008
    Сообщения:
    719
    Симпатии:
    290
    имхо ФС придется дергать в любом случае, т.к. картинки хранятся именно на диске - верно?

    тогда почему вы не хотите попробовать вариант 2 с половиной? - например кешировать результаты проверки? ведь если проект высоконагруженный, то логично предположить что если картинку отдали юзеру А (получили true, т.е. картинка на месте) то для юзера Б результат проверки получится аналогичным (т.е. картинка никуда не денется)

    зы
    немного снизить нагрузку на ФС можно если раскидать файлы по категориям... имхо 9000 картинок в одном каталоге - это перебор...
     
  10. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    мои 5 копеек
    если выводится менее 100 картинок на страницу нагрузка на ФС (файловая система) минимальная. затраты по времени на проверку file_exists малы, более быстрый метод это проверка размера filesize() но он выдтает ошибку если фаила нет поэтому его придется закрыть "собакой" @filesize()
    при это ошибки не будет и ее лучше обрабатывать руками.

    либо как вариант проверять наличие лишь 1 раз, и потом при выводе проверять наличие значения поля нужной записи, те если поле пустое то выводить заглушки если что то есть то картинку ту что в поле. в этом случае можно перенести роль проверки в .ht* нагрузка в том случае возможо такая же или выше как при проверке в пхп. не проверял низнаю
    у меня проверка на этапе внесения записи и по крону при очистке раз 1 месяц. остальное из записи дергается.