Раскидать картинки по папкам.

Redjik

Падаван
Сильно лень велосипедить.
Дайте алгоритм на равномерное распределение по id (int).
 

fixxxer

К.О.
Партнер клуба
%100 - это не равномерно. :) Можно, например, брать crc32 (а от него уже сколько надо бит)
 

Redjik

Падаван
хм, а если с nginx еще? =)
имеем сервер изображений в качестве CDN

обращаемся к картинке img src="$preset.$image->image_server_id.'.jpg'"
пресеты и так на соглашениях, не хочется еще алгоритм разкидывания по папкам в качестве соглашения использовать
 

fixxxer

К.О.
Партнер клуба
Что nginx?

Урлы надо генерировать из приложения, а не городить говнореврайты.
 

Вурдалак

I'd like to model your domain
А зачем так каждый раз писать? Почему не
Код:
{{ image_url(image) }}
с инкапсуляцией сколько угодно сложной логики генерации URL'а?
 

Redjik

Падаван
да какая разница куда обертку для генерации пихать?
главное - приложение не может и не должно знать, в какую подпапку закинул файл сервер изображений.
сейчас у меня сервер изображений возвращает только id.
 

fixxxer

К.О.
Партнер клуба
Надуманные проблемы.

Ну, допустим, окей, так зачем-то надо. Пусть твой сервер изображений тогда по адресу вида /get/image/123 и отдает это изображение номер 123, а {{ image_url(image) }} такой url генерирует, откуда тут какие то
img src="$preset.$image->image_server_id.'.jpg'"
?
 

Redjik

Падаван
дак а подпапку то куда зафигачить? =))))
короче сервер изображений будет возвращать путь с подпапкой вместо id, тогда норм по идее

вообще что делает сервер изображение - сохраняет изображение, генерит по запросу картинки для пресетов

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

сейчас у меня такой алгоритм в голове (и частично в коде)

1) приложение отправляет картинку
2) сервер изображений режет ее 1200 на 1200 и сохраняет в папка/для/оригиналов + папка/остаток/от/деления + pk картинки на сервере изображений + .jpg
3) сервер изображений возращает папка/остаток/от/деления + pk картинки на сервере изображений + .jpg
4) Потом приложение обращается к картинке /800x600/ + папка/остаток/от/деления + pk картинки на сервере изображений + .jpg
5) nginx пытается отдать статику, не находит - переадресует на сервер изображений
6) сервер изображения вычленяет из /800x600/ + папка/остаток/от/деления + pk картинки на сервере изображений + .jpg - пресет, ресайзит и кидает изображение в папку с соответствующим названием, чтобы nginx в будущем отдал уже сататикой
 

fixxxer

К.О.
Партнер клуба
приложение не может и не должно знать, в какую подпапку закинул файл сервер изображений.
сейчас у меня сервер изображений возвращает только id.
дак а подпапку то куда зафигачить?
Ты уж определись. :)
 

Redjik

Падаван
а про то как формировать url - у меня сейчас две сущности LocalImage (в сессии и в папке приложения) и модель Image, оба они implements IImage
Код:
interface IImage
{
    /**
    * @var string $preset
    * @return string
    */
    public function getUrl($preset = null);

    public function getId();

}
и получается в шаблоне img src = "{{image.getUrl('800x600')}}"
 

Активист

Активист
Команда форума
PHP:
$key = $id & 0xff ;
$directory = "/upload/" . $key . "/";
На миллион изображений будет создано 256 директорий. (Это примерно 3900 файлов в каждой директории при сумме 1 млн изображений).

Для ext4 херня, а не количества.
 

WMix

герр M:)ller
Партнер клуба
Код:
 $  cat /etc/apache2/sites-enabled/mx.local
<VirtualHost *:80>

    ServerAdmin webmaster@localhost
    ServerName mx.local
    DocumentRoot /var/www/mx

    <Directory /var/www/mx>
        Options Indexes FollowSymLinks
        AllowOverride All
        allow from all
    </Directory>

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteMap img "prg:/var/www/mx/rewrite.php"
        RewriteRule ^(.*)$ /${img:$1}
    </IfModule>

</VirtualHost>

$  php -r 'echo md5("/1")."\n";'
5b58b532f06f1613c2ecf6f2c0c09230

$  tree /var/www/mx/
/var/www/mx/
├── cache
│   └── 5
│      └── b
│          └── 5
│              └── 5b58b532f06f1613c2ecf6f2c0c09230
└── rewrite.php

4 directories, 2 files

$  cat rewrite.php
#!/usr/bin/php
<?php
set_time_limit(0);
$keyboard = fopen("php://stdin","r");
while (1) {
    $file = md5(trim(fgets($keyboard)));
    echo '/cache/'.$file[0].'/'.$file[1].'/'.$file[2].'/'.$file."\n";;
}

$  cat cache/5/b/5/5b58b532f06f1613c2ecf6f2c0c09230
1 aaa

$  wget -O- -q mx.local/1
1 aaa
 
Сверху