Ответ 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? Я бы серьезно подумал о другом хозяине. Это может даже решить эту конкретную проблему.
Я добавлю больше вещей, как я думаю об этом.