Как обрабатывать медиа, хранящиеся на отдельном сервере (PHP) - PullRequest
2 голосов
/ 31 марта 2010

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

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

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 
}

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

Ответы [ 5 ]

2 голосов
/ 01 апреля 2010

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

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

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

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

1 голос
/ 01 апреля 2010

Чтобы узнать, существует ли удаленный файл, выполните запрос 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 голос
/ 01 апреля 2010

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

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

0 голосов
/ 01 апреля 2010

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

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

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

C.

0 голосов
/ 01 апреля 2010

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

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

...