Как повысить скорость перенаправления на поддомен в зависимости от языка пользователя? - PullRequest
0 голосов
/ 16 февраля 2011

Я оптимизирую нашу веб-страницу, и мы заметили что-то, что мы хотим значительно улучшить. Мы используем Symfony 1.3.

Когда пользователь загружает example.com, фильтры (рендеринг, безопасность и запоминание) выполняются. Затем мы выполняем наш поддомен фильтра . Если пользователь впервые здесь, мы получаем предпочтительный язык его браузера и перенаправляем страницу на en.example.com или es.example.com. Если у пользователя есть сеанс, мы получаем язык из его сеанса; и мы перенаправляем на поддомен. Затем страница en.example.com загружается снова.

Мы теряем около 1,5 секунд на этом перенаправлении. En.example.com загружается иногда быстрее, чем это. Как мы можем избавиться от этой задержки? Изменение index.php и выполнение запросов browser-memcache-or-db напрямую без загрузки symfony?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 26 февраля 2011

Я наконец сделал перенаправление на index.php.От 1 до 1,5 секунд до 40 мс.Что-то вроде:

<?php

$host = $_SERVER['HTTP_HOST'];
$host_a = explode('.', $host);

// if subdomain is not in the supported langs
$langs = array('en', 'es');
if( !in_array($host_a[0], $langs) ){

  // try to get the cookie and the user culture
  $cookie = $_COOKIE['symfony'];
  list($id, $signature) = explode(':', $cookie, 2);
  if( $signature == sha1($id.':'.'secret_cookie') )
  {
    // get cookie data from memcache
    $memcache_obj = memcache_connect('localhost', 11211);

    // the cookie is built with two parts separated by :
    // - md5 of the sfCache directory
    // - $id from the user
    $md5_dir = md5(dirname(dirname(dirname(__FILE__)).'/lib/vendor/symfony/lib/cache/sfCache.class.php'));
    $session = memcache_get($memcache_obj, $md5_dir.':'.$id);
    $user_lang = $session['symfony/user/sfUser/culture'];
    if( !in_array($user_lang, $langs) ) $user_lang = 'en';

  // if not, get browser lang
  }else{
    $user_lang = prefered_language($langs);
  }

  // build url
  $url = 'http://'.$user_lang.'.'.str_replace('www.', '', $_SERVER['HTTP_HOST']).$_SERVER['REQUEST_URI'];

  // and redirect
  Header( "HTTP/1.1 301 Moved Permanently" );
  Header( "Location: ".$url);
  die();
}

require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');

$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false);
sfContext::createInstance($configuration)->dispatch();
0 голосов
/ 17 февраля 2011

Вы можете использовать mod_rewrite следующим образом

RewriteCond %{HTTP:Accept-Language} ^es [NC]
RewriteRule ^(.*)$ http://es\.example\.com/$1 [R=301,L]

для каждого поддерживаемого языка.PHP не требуется, сеанс не требуется, просто быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...