Добрый день, уважаемые форумчане. Задача у меня стоит следующая. Есть 6 сайтов, которые используют один и тот же каталог. Очень неудобно вносить изменения в каталог на каждом сайте в отдельности. Хочу унифицировать, т.е. разместить каталог на основном сайте, а с других просто брать из него данные. Все сайты размещены на одном хостинге (1gb.ru, хотя хочу его сменить). Размер таблицы (MySQL) с каталогом около 30тыс.записей. Вот думаю, как будет правильнее поступить - делать прямое подключение к БД и брать данные, как и раньше. Или же написать API, который будет возвращать данные в виде XML. Первый вариант, мне кажется, будет быстрее работать (не надо формировать XML, читать ответ и потом разбирать его на части). Хотя, порывшись в сети, неоднократно встретил рекомендации использовать именно API. Но почему именно - так и не понял. Скажите, пожалуйста, как бы в этой ситуации поступили Вы, и почему? Или, может, у Вас есть третий вариант решения этой задачи? Заранее благодарю за ответ
Если основной проект и спецпроекты у вас приспособлены для такого разделения, то да, вы можете разделить проекты, обращаясь к базовому домену за данными по api. Для этого, помимо правильной структуры, долженбыть написан api взаимодействия для получения всех необходимых для спецпроектов данных. Иными словами, должен быть написан полноценный веб-сервис. Если проекты написаны на объектной модели, а не тонны инклудов с процедурным кодом, то задача рефакторинга будет немного проще. Чем меньше спец-проекты или сателлиты отличаются от основного сайта, тем проще будет их отделение. Если у вас основной проект и спутники связаны только общими данными в бд и имеют полностью независимые и никак не связанные друг с другом объекты, тогда разумеется, достаточно просто своего подключения к СУБД и можно растаскивать все проекты по разным серверам/доменам/каталогам. Если же у вас спецпроекты наследуют базовые сущности основного проекта, где помимо подключения к бд могут быть сущности пользователя, раздела, статьи, не говоря уже о базовых контроллерах, то, соответственно, это уже совершенно другая задача реализация которой может заключаться в создании базовых классов спецпроекта, взаимодействующие с основным ресурсом через api. Формат обмена данными как и протокол реализации веб-сервиса - это уже детали реализации которые выбираются исходя из конкретной специфики вашего проекта, которую нужно знать чтобы рекомендовать конкретный выбор. В классическом исполнении это разработка REST api для всех данных проекта, которые востребованы сателлитами и реализация базовых классов, общих для сателлитов, их получающих.
Спасибо за развернутый ответ. Сайты никак не связаны. Т.е. создание второго подключения к б.д. с другим названием не вызовет никаких проблем: Код (Text): // Подключаемся к БД сайта $site = mysql_connect("localhost", "name", "password"); mysql_select_db("db1", $site ); // Подключаемся к БД сайта основного сайта (где база) $maingroupsite = mysql_connect("localhost", "name2", "password2"); mysql_select_db("db2", $maingroupsite); // Выбираем данные mysql_query("SELECT text FROM content WHERE id=7", $site)); // Какой-то текст из базы текущего сайта mysql_query("SELECT title FROM catalog WHERE id=5", $maingroupsite)); // Какой-то товар из базы основного сайта Вот пример конструкции, какая может встретить на сайте. Первым запросом мы выбрали из первой базы, вторым запросом - из второй. Все это отлично работает, и я уже делал нечто подобное. Вы считаете, что таким образом будет лучше, чем отдельный API, верно я понял?
это уже зависит от того насколько разные данные запрашивают ваши сателлиты. Кто будет вести дальнейшую разработку, как часто предстоит модернизировать проекты, пишут они в базу или нет. Через api вы получите единую точку входа для всех запросов с сателлитов что предоставляет определённые преимущества и накладные расходы на разработку и взаимодействе не напрямую с бд. Выбор зависит уже от конкретной специфики ваших проектов. Опять же, нужно учесть и ограничение площадки, ведь в случае с подключением напрямую к бд всех 6 сайтов вы займете сразу 6 соединений, при том что на многих площадках хостинга число этих соединений может быть лимитировано несколькими десятками. В общем случае, если работает и каши не просит, то пусть работает ибо к таким глобальным изменениям, как единый api, нужно приходить четко видя в них потребность.
Веду проекты я и в ближайшем будущем вести тоже буду я. Мне предстоит в любом случае переделывать, просто стоит вопрос, идти одним или вторым путем. А что будет лучше по быстродействию? Хостинг 1gb.ru меня огорчает скоростью работы, а когда получится его вменить - неизвестно (не от меня зависит). Поэтому надо много внимания уделять этому вопросу.
Что быстрее выполнится запрос к СУБД на извлечение строки из таблицы или запрос к контроллеру REST-api на получение этой же строки? Вопрос в другом. Важны-ли доли секунды или правильно поставленная и безопасная разработка независимых связанных проектов. И есть-ли реальная потребность и ресурсы для реализации последнего.
Понятно, что прямой запрос быстрее. Вопрос в том, насколько Видимо, стоит сделать один и второй вариант, погонять на разных хостах и решить для себя, что лучше. Если разница не существенная, то склонюсь, наверное, к АПИ. Если же разница большая (а при росте БД в будущем еще и увеличиваться будет), то лучше прямой запрос. Кстати, небольшой вопрос на тему "рост БД". В БД есть две основных категории, где много товаров (скажем, по 15тыс.), и далее мелкие категории, где по сотне. Есть ли смысл две основные категории отделить от общей таблицы. Сделать в БД три таблицы: table_catalog table_catalog1 table_catalog2 Если использовать API для получения данных, очень легко в самом начале определить, из какой таблицы брать данные: Код (Text): if (category == 1) $tablename = 'catalog1'; else if (category == 2) $tablename = 'catalog2'; else $tablename = 'catalog'; Как Вы думаете, скажется ли это существенно на скорости выбора данных из таблиц? Или не стоит заморачиваться? В принципе, 30тыс товаров - это не сильно много. Индексы для столбов id и parent_id проставлены
не сильно. в идеале разница пара-тройка мс в пользу прямого запроса. С другой стороны апи позволит сделать хоть сто запросов локально, а выдать один ответ сразу. Какое у вас время пересылки пакетов между серваками?
Сайты находятся на одном сервере. Мне кажется, соединение со второй базой времени не отнимает совсем. По крайней мере счетчик показывает примерно одно время выполнения как в своей базе, так и в другой
блин. Тогда и вопрос надо формулировать так "все сайты на одном сервере, подключаться ли локально к локальной бд?"...
Что значит "на каком"? Они же все на одном. Добавлено спустя 1 минуту 57 секунд: Сервер это не хостинг. Хостинг это не сервер. Так один сервер или один хостинг?
Не знаю, на одном или нет. Хостинг один. А физически на разных машинах или нет - не знаю. Вероятно, что на разных. Подбиваю хозяина сайта сменить хост, а то 1gb глючный очень. Но когда это случится - неизвестно.
К этому и пришли выше. Завтра напишу простенький апи и померяю разницу в скорости выполнения. При условии, что разница минимальна, что бы предпочли лично Вы - АПИ или прямое подключение? И почему?