Применение для Яндекс.Диска

Встала задача где-то хранить кучу фотографий для сайта и других файлов. Покупать выделенный сервер для небольшого сайта, и тратить 5-10 тысяч рублей, совсем не разумно. Тут мне на глаза попался Яндекс.Диск, вместилище на 1тб тут стоит всего лишь 200 рублей. И я подумал, а почему бы и нет? Поковырял API, нашел симпатичную библиотеку yandex-php-library и на её основе сворганил свой набор скриптов для любимой MODX REVO. В итоге все работает в связке с pdoTools. Посмотреть как работает можно тут.
Как мне кажется идея достаточно не плохая. Пока все простенько, и недоработано, но уже прекрасно работает. Остается только получить токен и все, способ его получения хорошо описан в yandex-php-library. Для самых хитрых показываю код. Сразу скажу, в коде много не логичностей и откровенных ляпов, так как писал на скорую руку.
Сниппет getFileYandexDisc работает в паре с pdoPage
<?php
require_once MODX_CORE_PATH.'/components/yandexdisc/custom/yandex/vendor/autoload.php'; // Подключаем библиотеку yandex-php-library
require_once MODX_CORE_PATH.'/components/yandexdisc/model/yandexDisc.class.php'; // Я уже создал обертку для Yandex\Disk\DiskClient, но вы можете и не создавать её
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
$yandexDisc = new yandexDisc('Тут ваш токен, полученный через OAuth');
$yandexDisc->setServiceScheme(yandexDisc::HTTPS_SCHEME);
$dirContent = $yandexDisc->directoryContents('/elenamart/Album1/');
$arrayFiles = array();
if(empty($offset)){
$offset = 0;
}
if(empty($limit)){
$limit = 10;
}
$s = 0;
$output = '';
foreach ($dirContent as $podDirItem) {
if($podDirItem['href'] != '/elenamart/Album1/'){
$arrayFile[] = $podDirItem;
$itog = $offset + $limit;
if($s >= $offset AND $s < $itog){
$output .= $modx->parseChunk($tplRow, array('href' => $podDirItem['href']));;
}
$s++;
}
}
$count = count($arrayFile);
$modx->setPlaceholder('page.total', $count);
return $output;Будущая обертка для Yandex\Disk\DiskClient
<?php
use Yandex\Disk\DiskClient;
class yandexDisc extends Yandex\Disk\DiskClient{
var $diskClient;
var $modx;
// Получаем список файлов
function getListFiles(){
}
// Получаем содержимое файла
function getFileContent(){
}
}Файл для отрисовки изображения
<?php
define('MODX_API_MODE', true);
require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php';
require_once MODX_CORE_PATH.'/components/yandexdisc/custom/yandex/vendor/autoload.php'; // Подключаем библиотеку yandex-php-library
require_once MODX_CORE_PATH.'/components/yandexdisc/model/yandexDisc.class.php'; // Я уже создал обертку для Yandex\Disk\DiskClient, но вы можете и не создавать её
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
$yandexDisc = new yandexDisc('Токен вашего диска');
$yandexDisc->setServiceScheme(yandexDisc::HTTPS_SCHEME);
$size = 'XXXL';
if(isset($_GET['size'])){
$size = $_GET['size'];
}
if(isset($_GET['target'])){
$target = $_GET['target'];
$file = $yandexDisc->getImagePreview($target, $size);
header('Content-Description: File Transfer');
header('Connection: Keep-Alive');
header('Expires: 0');
header('Content-Type: '.$file['headers']['content-type']);
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Date: ' . $file['headers']['date']);
header('Content-Length: ' . $file['headers']['content-length']);
header('Accept-Ranges: ' . $file['headers']['accept-ranges']);
echo $file['body'];
}Вызываем сниппет getFileYandexDisc с пагинацией
[[!pdoPage?
&limit=`12`
&parents=`0`
&element=`getFileYandexDisc`
&tplRow=`portfolioRow`
]]
[[!+page.nav]]Код чанка
<img src="/assets/components/yandexdisc/echoFile.php?target=[[+href]]&size=350x350" alt="">PS: если сообществу интересно, то могу доработать расширение и залить на modstore, за сравнительно небольшую цену. Если кому то интересно и кто то приобрел пишите в комментариях.SDK для работы с api Яндекс.Диск тут.
Оригинал статьи тут.
Комментарии: 18
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
То есть, работать это будет медленнее, плюс возможны битые ссылки при нагрузке, если API Яндекса начнёт подрезать лимиты запросов.
Ну и не совсем понятно, насколько хорошо эти картинки будут кэшироваться, хоть я и вижу соотвествующие заголовки. Может, есть где-то демосайт погонять?
А если делать кэш на HDD сервера — то какой смысл выносить картинки в Яндекс? В общем, идея интересная, но для реального применения скорости будет маловато.
Я просто пытаюсь объяснить, что это сейчас страница генерируется 0.5 сек, для одного пользователя. Если же их будет больше, то эта цифра вырастет. Ну а если кто-то даст ссылку на твой сайт на Хабре или Реддите, то будет очень много запросов и Яндекс наверняка отключит тебе доступ на некоторое время.
Неспроста у них нет прямых ссылок на файлы.
А вот это уже гораздо лучше!
Правда дальше всё равно файлы опять отдаются через отдельный скрипт echoFile.php, но на загрузку самой страницы оно не влияет.
Вот пример картинки.
Посмотрим, если эта картинка тут провисит неделю — значит всё ок, прямые ссылки работают. Но, опять же, нужно проверить ограничения API.
Эта картинка с гуглфоток с октября не умирает — проверяю раз в месяц, примерно.
Осталось теперь по лимитам протестировать.
Если есть желание можно на этой картинке потестировать.