Подтвердить что ты не робот

Почему мой 301 Redirect занимает так много времени?

В длинном усталом стремлении ускорить мой сайт, я выяснил, что что-то не так с перенаправлением: в настоящее время мой index.php обрабатывает все перенаправления домашней страницы через местоположение заголовка PHP 301 Перенаправление навсегда: website.comwebsite.com/en/home и website.dewebsite.de/de/home etcettera и т.д. (около 20 для этого многоязычного веб-сайта) для переадресации требуется от 200 мс до 6000 мс. Проверьте водопад!

После этого страница загружается молнией молнии! Какая пустая трата времени, не так ли? Что делает сервер все это время? После тщательного изучения, моя лучшая догадка: ЕГО ПРАЧЕЧНАЯ!

Я почти отказываюсь от PHP за это! Любые и все подсказки к моей загадочной проблеме очень приветствуются +1

а. Приведенные факты: Apache/2.0.54 Fedora, PHP 5.2.9. нет базы данных: только плоские php файлы, содержащие около 15 php, включают в себя завершение моей страницы с верхними и нижними колонтитулами). YSlow Класс: 92/100! Хорошая страница Скорость: 93/100! javascript и css максимально объединены. Кэш-контролы также хорошо настроены (как доказали оценки). Что не хватает в этих 7 пунктах из 100: не использовать Keep-Alive (на моем контроле в общем хостинге, а не в сети доставки контента. Я могу жить с теми, у кого отсутствует 7 очков, но это большой удар по скорости!

В. Кроме того: недавно мне было дано отличное представление о том, что я должен использовать переписывание URL через htacces. Точка взята, НО, возможно, здесь есть что-то неправильное, что я должен исправить, прежде чем переходить к более сложным синтаксическим синтаксическим синтаксическим синтаксическим синтаксическим синтаксическим синтаксическим синтаксическим синтаксическим синтаксическим синтаксическим синтаксическим синтаксическим синтаксическим синтаксическим синтаксическим метокам.

С. Более быстрый способ: когда я php include предназначенную домашнюю страницу, а не перенаправляет, то все загружается быстро, но URL-адрес не переписан: он находится на веб-сайте в браузере, тогда как я хочу, чтобы он стал веб-сайтом. ком/о/дома. Это возможно с PHP? Включить + изменить текущий адрес URL-адреса тоже?

screenshot

Выводы: вы можете перенаправить с помощью index.php или используя .htaccess. Софар из моих тестов (из гениальных ответов ниже! СПАСИБО КАЖДЫЙ!) Последний кажется непревзойденным по скорости: гораздо быстрее перенаправляет, чем перенаправление php! уменьшая перенаправление до более короткого, чем первый поиск dns.

см. здесь, как выполнить эту корреляцию для многоязычного сайта

4b9b3361

Ответ 1

Черт, я ненавижу застрять в этой проблеме. Вам нужно устранить некоторые переменные.

Сначала я должен указать, что PHP не будет очищать все свои собственные заголовки до тех пор, пока вы не начнете выводить какие-либо вещи (или, если директива output_buffering (?) ini установлена ​​в x байтов, пока вы не выведете x байтов). Таким образом, следующий script не завершит "отправку заголовков" до самого конца:

<?php
header('Content-Type: text/pants');
sleep(6);
header('Ding-Ding: time to put the socks in the dryer');
echo "z"; // headers are sent here

Что происходит с вызовом en/home, если вы положили exit; или echo "wheeeee"; exit; в самый верх этого PHP скрипт? Тогда что происходит, когда вы подставляете его простым, пустым файлом? Если PHP скрипт с exit медленный, но простой текстовый файл работает быстро, интерпретатор PHP, вероятно, играет забавные педерасты. Если вы все еще получаете задержку для обоих, вы устраняете фактическое генерирование ответа как причину (но я все еще пытаюсь придумать некоторые идеи, если это так).

Кроме того, можете ли вы ssh на сервер? Если да, можете ли вы попытаться запустить одну и ту же страницу изнутри сервера? Если вы можете без проблемы с скоростью, я бы посмотрел на сторону клиента. Если вы не можете SSH, вы можете попробовать сделать запрос с PHP, хотя я действительно не уверен, что это будет работать:

<?php
$context = stream_context_create(array(
    'http'=>array(
        // send request headers if you need to
        'header'=>array(
            'Foo: Bar',
            'Bar: Baz',
        ),
    ),
));
$start = microtime(true);
$response = file_get_contents('http://yourserver.com/', null, context);
$end = microtime(true) - $start;
var_dump($end);

// for some bizarre reason, PHP emits this variable into the local scope.
var_dump($http_response_header);

Вы пытались сделать тот же запрос с других машин или других мест в мире? Это может подтвердить или опровергнуть, если это только ваша машина.

Еще одна вещь, которую вы можете попробовать, если это поколение ответов, - это немного обработать хак-профилирование на производственном сервере. Мне не нравится делать это, но иногда ваш код просто отказывается вести себя на производственном сервере, как это происходит в вашей среде разработки или в стадии постановки. Сделайте это с помощью script, который генерирует /en/home:

<?php
// put this at the very top
$rqid = uniqid('', true);
$h = fopen(__DIR__.'/crap.log', 'a');
fwrite($h, $rqid.' [START] '.microtime(true).PHP_EOL);
fclose($h);

// do all that other wonderful stuff, like laundry or making a cup of tea

// put this at the very end
$h = fopen(__DIR__.'/crap.log', 'a');
fwrite($h, $rqid.' [END]   '.microtime(true).PHP_EOL.PHP_EOL);
fclose($h);

Запустите несколько запросов против него, убедитесь, что "crap.log" получает на него все написанное (проверьте разрешения!), а затем у вас появятся некоторые данные, которые покажут, есть ли что-то в вашем script, который должен быть исследован далее как причина медленности.

О, я упоминал индексы MySQL? Выполняете ли вы какие-либо запросы во время запроса? Добавили ли вы все необходимые индексы в таблицы?

Стивен Сюй поднимает хороший момент в комментариях к вашему вопросу - уверены ли вы, что программа, которую вы используете для создания водопада, дает вам хорошую информацию? Попробуйте установить Firebug, если вы еще этого не сделали, щелкните значок маленького значка firebug в правом нижнем углу Firefox и убедитесь, что панель "Сеть" открыт, затем повторно запустите свой запрос и проверьте, соответствует ли водопад результатам, которые вы видите в программе, которую вы использовали.

Кроме того, я знаю, что это своего рода прощальное предложение, и я извиняюсь, но я думаю, что нужно сказать: ваш хост не разрешает ssh и использует только PHP 4? Я бы серьезно подумал о другом хозяине. Это может даже решить эту конкретную проблему.

Я добавлю больше вещей, как я думаю об этом.

Ответ 2

Если на самом деле заголовки берут возраст, тогда ваш JS/CSS/HTML не имеет значения.

Вы можете выполнить переадресацию в .htaccess.

RewriteEngine On
RewriteRule ^$ en/home [R=301]

Это по существу отправит один и тот же заголовок, но сначала он не вызовет механизм PHP:)

Update

При ближайшем рассмотрении мне кажется, что ваша страница en/home занимает больше времени для загрузки.

Ответ 3

Я думаю, что у Игнасио Васкеса-Абрамса может быть ответ: после того, как вы вызываете header(), чтобы выполнить перенаправление, вам нужно вызвать exit(), чтобы остановить выполнение PHP script. Без этого script будет продолжать выполнение, отправляя вывод в браузер до конца. Поскольку браузер должен дождаться окончания серверной части script до выполнения перенаправления, которая может вызвать проблему.

Обновление

Просто прочитайте обновление Alex, и он кажется правильным. Домашняя страница /en/home - это время.