Лучший способ проверить, существует ли поддомен без использования запроса к базе данных или файла hosts

Я использую symfony2 и в своем приложении для размещения студентов я создаю динамические субдомены для каждого университета, я настраиваю виртуальный хост с помощью подстановочной записи субдомена, чтобы любой субдомен был действительным.

Как я могу проверить, зарегистрирован ли поддомен и принадлежит ли он университету, и как мне отличить его от случайно набранного пользователь не зарегистрирован субдомен эффективно?

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

Пожалуйста, предложите эффективный способ сделать это, используя php или symfony или любые другие методы, о которых вы, ребята, знаете

(дополнительная информация) будет опция «Бесплатная пробная версия», что приведет к большому количеству поддоменов, так как каждый и каждый начнут бесплатную пробную версию, очень хороший пример того, чего я пытаюсь достичь, будь это StudyStays

-Спасибо

0

Решение

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

Также при добавлении / удалении / обновлении вашего объекта поддомен вы можете обновить значение кэша, чтобы поддерживать его в актуальном состоянии.

приложение / Config / config.yml

Установите поставщика услуг для Doctrine Cache Bundle, для получения дополнительной информации см. документы (очевидно, вам необходимо добавить Doctrine Cache Bundle вашим поставщикам и AppKernel).

doctrine_cache:
providers:
acme_subdomain:
type: filesystem # apc, array, redis, etc
namespace: acme_subdomain

Acme \ YourBundle \ Registry \ SubdomainRegistry

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

use Doctrine\Common\Cache\Cache;
use Doctrine\Common\Persistence\ObjectManager;

class SubdomainRegistry implements SubdomainRegistry
{
const REGISTERED   = 'registered';
const UNREGISTERED = 'unregistered';

/**
* @param ObjectManager
*/
protected $manager;

/**
* @param Cache
*/
protected $cache;

public function __construct(ObjectManager $manager, Cache $cache)
{
$this->manager = $manager;
$this->cache = $cache;
}

/**
* @param string $subdomain
* @return boolean
*/
public function isSubdomainRegistered($subdomain)
{
// If subdomain is not in cache update cache
if (!$this->cache->has($subdomain)) {
$this->updateRegistry($subdomain);
}

return self::REGISTERED === $this->cache->get($subdomain);
}

/**
* @param string $subdomain
* @return boolean
*/
public function registerSubdomain($subdomain)
{
$this->cache->set($subdomain, self::REGISTERED);

return $this;
}

/**
* @param string $subdomain
* @return boolean
*/
public function unregisterSubdomain($subdomain)
{
$this->cache->set($subdomain, self::UNREGISTERED);

return $this;
}

/**
* @param string $subdomain
* @return null
*/
private function updateRegistry($subdomain)
{
$object = $this->manager->findOneBy(array('subdomain' => $subdomain);

// $object->isActive() assume you are storing all subdomains after cancelling
// and setting it to inactive. You could put your own real logic here
if (null === $object || !$object->isActive()) {
$this->unregisterSubdomain($subdomain);

return null;
}

$this->registerSubdomain($subdomain);
}

Затем, когда вы регистрируете или отменяете регистрацию своего субдомена, вы можете добавить вызов в реестр в методе.

Например…

$subdomain = new Subdomain();
// Subdomain as a property of subdomain seems weird to me
// but as I can't immediately think of anything better I'll go with it
$subdomain->setSubdomain('acme');
// .. subdomain details
$this->manager->persist($subdomain);
$this->manager->flush();
$this->registry->registerSubdomain($subdomain->getSubdomain());
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]