Как обрабатывать носители, хранящиеся на отдельном сервере (PHP)


Итак, у меня есть три сервера, и идея состояла в том, чтобы хранить все носители (изображения, файлы, фильмы) на медиасервере. У меня так и не нашлось времени сделать это, но я думаю, что, вероятно, мне следует это сделать.

Итак, это три сервера:

WWW-сервер Сервер БД Медиа-сервер

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

Чего я не знаю, так это как обрабатывать такие функции, как file_exists() и определять размеры изображения, когда это необходимо, еще до того, как в игру вступит какое-либо управление изображениями. Должен ли я передавать все эти команды на другой сервер по протоколу HTTP? Я думал о том, как это сделать следующим образом:

function image(##ARGS##){
    if ($GLOBALS["media_host"] != "localhost"){
        list ($src, $width, height) = file('http://$GLOBALS[media_host]/imgfunc.php?args=##ARGS##');
        return "<img src='$src' height and width >";
    }
    .... do other stuff here 
}

Я подхожу к этому неправильно? Есть ли лучший способ сделать это?

Author: Sandman, 2010-03-31

5 answers

Представьте медиасервер в виде корзины S3, это, вероятно, облегчит вам понимание того, что и где должно происходить. Установите lighthttpd на медиасервер и отправляйте изображения непосредственно оттуда. Для хранения обработайте изображение на главном сервере, загрузите изображение на медиасервер, сохраните всю информацию, связанную с изображением, в базе данных, чтобы, когда вы захотите его предоставить, у вас уже была вся доступная информация, и вы предполагаете по всем правильным причинам, что изображение все еще находится в базе данных. там:)

Что касается того, как вы хотите это сделать, я думаю, что это вызовет серьезное узкое место и увеличит объем сетевого трафика, вы как бы пытаетесь реализовать "сообщения", найденные в распределенных системах, и мы все знаем, какие подводные камни там присутствуют. Я говорю, чтобы все было просто!

 1
Author: Sabeen Malik, 2010-03-31 21:11:30

Не уверен, что вы собираетесь делать, но я также храню медиафайлы на отдельном сервере от своего кода:

Я использую Amazon S3 для хранения своих медиафайлов, и я просто включаю базовый тег в заголовок своего HTML-файла, чтобы все это работало. В принципе, он принимает все относительные файлы/ссылки и указывает эти относительные пути на другой сервер.

<base href="https://s3.amazonaws.com/BUCKET/PROJECT/FOLDER/" />

Есть некоторые, кто, вероятно, будет возражать против использования мной базового тега href таким образом, но для меня это действительно хорошо работает. Таким образом, я могу направлять вся пропускная способность загрузки изображений на Amazon и с моего сервера.

 2
Author: swt83, 2010-03-31 20:18:21

Чтобы узнать, существует ли удаленный файл, выполните запрос HEAD:

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "url here");
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_NOBODY, true);
curl_exec($curl);
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);

if($code == 200)
    // The file exists.
 1
Author: mattbasta, 2010-04-01 01:13:22

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

Я предполагаю, что любая информация о медиафайлах не хранится в базе данных.

 0
Author: webbiedave, 2010-03-31 20:19:42

Если вы не добиваетесь значительной экономии средств за счет использования немого (не скриптового) хоста, это плохая идея - это удваивает вероятность того, что ваша система выйдет из строя. Если у вас есть 2 хоста, лучшим решением будет использовать их в качестве точных зеркал. Если вам нужна репликация сеанса/данных, то это приведет к небольшим накладным расходам, но это того стоит. Распределяйте нагрузку через циклический DNS. Кроме того, это означает, что вам нужно создать резервную копию только одного сайта и его масштабируемости с одного сервера (например, ваша коробка для разработки) до....ну, много.

Я бы также рекомендовал вам не хранить измененные версии отправленных файлов (за исключением первоначального преобразования, чтобы они не публиковали на вашем сервере то, что вам не нужно). Затем преобразуйте контент по требованию (и используйте кэширование на стороне сервера).

Одним из преимуществ наличия контента, доступного через разные DNS-имена, является то, что большинство браузеров будут выполнять больше запросов параллельно, но вы все равно можете сделать это с помощью клонированного сервера, использование нескольких vhosts или подстановочных vhosts.

C.

 0
Author: symcbean, 2010-04-01 09:28:55