Я профилировал производительность своего веб-сайта PHP и был удивлен, обнаружив, что шея бутылки была функцией header
.Почему функция header() очень медленная?
Я работаю на PHP 5.3 и Apache 2.4.
Я сравнивал два простых файла с ab
и обнаружил, что первый - исполняющий phpinfo()
- был значительно быстрее второго - вызывал header
.
Первый файл (способный работать на более чем 1000 запросов в секунду): (! Способен только 12 запросов в секунду)
<?php phpinfo(); ?>
Второй файл:
<?php header('HTTP/1.1 200 OK'); ?>
Полный ab
выход из первая проверка:
C:\work\apache24\bin>ab -n 1000 -c 200 http://q.localhost/test.php
This is ApacheBench, Version 2.3 <$Revision: 1663405 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking q.localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software: Apache/2.4.16
Server Hostname: q.localhost
Server Port: 80
Document Path: /test.php
Document Length: 69600 bytes
Server Software: Apache/2.4.16
Server Hostname: q.localhost
Server Port: 80
Document Path: /test.php
Document Length: 69600 bytes
Concurrency Level: 200
Time taken for tests: 0.984 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 69768000 bytes
HTML transferred: 69600000 bytes
Requests per second: 1015.82 [#/sec] (mean)
Time per request: 196.885 [ms] (mean)
Time per request: 0.984 [ms] (mean, across all concurrent requests)
Transfer rate: 69210.84 [Kbytes/sec] received
Завершить ab
результат с th е второй тест:
C:\work\apache24\bin>ab -n 1000 -c 200 http://q.localhost/test.php
This is ApacheBench, Version 2.3 <$Revision: 1663405 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking q.localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software: Apache/2.4.16
Server Hostname: q.localhost
Server Port: 80
Document Path: /test.php
Document Length: 0 bytes
Concurrency Level: 200
Time taken for tests: 80.099 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 168000 bytes
HTML transferred: 0 bytes
Requests per second: 12.48 [#/sec] (mean)
Time per request: 16019.840 [ms] (mean)
Time per request: 80.099 [ms] (mean, across all concurrent requests)
Transfer rate: 2.05 [Kbytes/sec] received
Простой вызов функции header
приносит производительность вплоть до 12 запросов в секунду. Меня это потрясло.
Почему функция header()
работает так медленно, и есть ли что-нибудь, что я могу изменить в своей конфигурации, чтобы исправить ее?
Очень интересно ... Я могу воспроизвести это на моей машине (Ubuntu). * Не * делать с отсутствием выхода тела; ' php echo 'foo'; ?> 'быстрый, но' php header ('HTTP/1.1 200 OK'); echo 'foo'; ?> 'все еще медленный. –
Что произойдет, если вы добавите в свой код следующее? 'Заподлицо(); ob_flush(); ' – Paolo
@Paolo не помогает; вообще не изменяет результаты. (Кстати, логически эти флеши должны быть наоборот, то есть 'ob_flush(); flush()', так как буфер ob_ доходит до буфера записи. Однако это тоже не помогает.) –