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

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

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

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

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

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

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

Скриншот

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

см. здесь, как это сделать для многоязычного сайта

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

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

     <?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; 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); 

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

    Еще одна вещь, которую вы можете попробовать, если это поколение ответов, состоит в том, чтобы немного обработать профилирование на производственном сервере. Мне не нравится делать это, но иногда ваш код просто отказывается вести себя на производственном сервере, как это происходит в вашей среде разработки или в стадии постановки. Сделайте это для скрипта, который генерирует /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» получает материал, написанный на нем (проверьте разрешения!), А затем у вас появятся некоторые данные, которые покажут, есть ли что-то в вашем скрипте, далее исследуется как причина медленности.

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

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

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

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

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

    Обновить

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

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

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

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

    Это по сути отправит один и тот же заголовок, но сначала он не будет запускать PHP-движок 🙂

    Обновить

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