97 lines
3.4 KiB
Markdown
97 lines
3.4 KiB
Markdown
# Галерея фотографий (PHP)
|
||
|
||
Локальный проект галереи, который:
|
||
|
||
- читает категории и фото из `photos/` (туда можно загружать по FTP),
|
||
- при каждом открытии страницы проверяет, появились ли новые/обновлённые фото,
|
||
- создаёт и обновляет превью в `thumbs/`,
|
||
- показывает категории и фото в веб-интерфейсе,
|
||
- открывает большую фотографию в лайтбоксе или в новой вкладке.
|
||
|
||
## Структура
|
||
|
||
```text
|
||
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`:
|
||
|
||
```bash
|
||
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` при первом запуске.
|
||
|
||
Запуск на хостинге:
|
||
|
||
```bash
|
||
cd ~/www/photo-gallery
|
||
bash scripts/deploy.sh
|
||
```
|
||
|
||
По умолчанию ветка `main`. Для другой ветки:
|
||
|
||
```bash
|
||
BRANCH=master bash scripts/deploy.sh
|
||
```
|
||
|
||
## Примечания
|
||
|
||
- Превью генерируются в формате JPEG с качеством ~82.
|
||
- При первом заходе на большую папку возможно небольшое ожидание (генерация превью).
|
||
- Для production обычно лучше вынести индексацию в cron/очередь, но для текущей задачи это intentionally on-request.
|