Go to file
2026-02-19 16:37:51 +03:00
data Init photo gallery with auto-indexing, thumbs, UI, deploy script 2026-02-19 16:37:51 +03:00
photos Init photo gallery with auto-indexing, thumbs, UI, deploy script 2026-02-19 16:37:51 +03:00
scripts Init photo gallery with auto-indexing, thumbs, UI, deploy script 2026-02-19 16:37:51 +03:00
thumbs Init photo gallery with auto-indexing, thumbs, UI, deploy script 2026-02-19 16:37:51 +03:00
.gitignore Init photo gallery with auto-indexing, thumbs, UI, deploy script 2026-02-19 16:37:51 +03:00
app.js Init photo gallery with auto-indexing, thumbs, UI, deploy script 2026-02-19 16:37:51 +03:00
index.php Init photo gallery with auto-indexing, thumbs, UI, deploy script 2026-02-19 16:37:51 +03:00
README.md Init photo gallery with auto-indexing, thumbs, UI, deploy script 2026-02-19 16:37:51 +03:00
style.css Init photo gallery with auto-indexing, thumbs, UI, deploy script 2026-02-19 16:37:51 +03:00

Галерея фотографий (PHP)

Локальный проект галереи, который:

  • читает категории и фото из photos/ (туда можно загружать по FTP),
  • при каждом открытии страницы проверяет, появились ли новые/обновлённые фото,
  • создаёт и обновляет превью в thumbs/,
  • показывает категории и фото в веб-интерфейсе,
  • открывает большую фотографию в лайтбоксе или в новой вкладке.

Структура

photo-gallery/
├─ index.php              # основной скрипт: индексация + HTML
├─ style.css              # стили (material-like, строгий)
├─ app.js                 # лайтбокс
├─ photos/                # исходные фото по категориям (папкам)
├─ thumbs/                # автогенерируемые превью
└─ data/
   └─ last_indexed.txt    # timestamp последней индексации

Как работает индексация

  1. Скрипт читает data/last_indexed.txt.
  2. Сканирует photos/<категория>/.
  3. Для каждого изображения (jpg/jpeg/png/webp/gif):
    • если файл новее last_indexed,
    • или превью не существует,
    • или превью старее оригинала, тогда создаётся/обновляется превью (.jpg) в thumbs/<категория>/.
  4. Записывает новый timestamp в last_indexed.txt.

Индексация выполняется на каждом обращении к index.php.

Требования

  • PHP 8.2+ (8.3 тоже ок)
  • Расширение GD или Imagick
    • если есть Imagick — будет использоваться он,
    • иначе используется GD.

Локальный запуск

Из папки photo-gallery:

php -S 127.0.0.1:8080

Открыть в браузере:

  • http://127.0.0.1:8080

Загрузка фото

Через FTP кладите файлы в:

  • photos/Свадьба/001.jpg
  • photos/Портреты/img_10.png
  • и т.д.

Папка верхнего уровня = категория.

Деплой (Timeweb shared hosting)

В проекте есть скрипт:

  • scripts/deploy.sh

Он:

  1. делает git fetch,
  2. жёстко переключает код на origin/<branch>,
  3. сохраняет runtime-папки (photos, thumbs, data),
  4. создаёт data/last_indexed.txt при первом запуске.

Запуск на хостинге:

cd ~/www/photo-gallery
bash scripts/deploy.sh

По умолчанию ветка main. Для другой ветки:

BRANCH=master bash scripts/deploy.sh

Примечания

  • Превью генерируются в формате JPEG с качеством ~82.
  • При первом заходе на большую папку возможно небольшое ожидание (генерация превью).
  • Для production обычно лучше вынести индексацию в cron/очередь, но для текущей задачи это intentionally on-request.