Сжатие содержимого с помощью PHP ob_start () vs Apache Deflate / Gzip?

Большинство сайтов хотят сжать свой контент, чтобы сэкономить на пропускной способности. Однако, когда дело доходит до серверов Apache, работающих под управлением PHP, есть два способа сделать это – с PHP или с apache. Итак, какой из них быстрее или проще на вашем сервере?

Например, в PHP я запускаю следующую функцию в начале моих страниц, чтобы включить ее:

/** * Gzip compress page output * Original function came from wordpress.org */ function gzip_compression() { //If no encoding was given - then it must not be able to accept gzip pages if( empty($_SERVER['HTTP_ACCEPT_ENCODING']) ) { return false; } //If zlib is not ALREADY compressing the page - and ob_gzhandler is set if (( ini_get('zlib.output_compression') == 'On' OR ini_get('zlib.output_compression_level') > 0 ) OR ini_get('output_handler') == 'ob_gzhandler' ) { return false; } //Else if zlib is loaded start the compression. if ( extension_loaded( 'zlib' ) AND (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) ) { ob_start('ob_gzhandler'); } } 

Другой вариант – использовать Apache deflate или gzip (оба они очень близки ). Чтобы включить их, вы можете добавить что-то подобное в ваш файл .htaccess.

 AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php 

Поскольку PHP является языком сценариев (который должен быть загружен PHP), я бы предположил, что метод apache будет 1) более стабильным и 2) быстрее. Но предположения не имеют большого смысла в реальном мире.

В конце концов, вы бы предположили, что с огромными финансовыми окнами поддержки … мы не поедем туда.

Мы запускаем … много веб-серверов, обрабатывающих 60M / uniques / day. Обычно это не стоит упоминать, но ваш вопрос кажется основанным на опыте.

Мы работаем с этим в Apache. То, что выходит, на другом конце того же (или достаточно близко, чтобы не иметь значения), независимо от выбранного вами метода.

Мы выбираем apache по нескольким причинам:

  • Нулевое обслуживание, мы просто включили его. Никто не должен поддерживать некоторую структуру дела
  • Производительность, на наших тестовых серверах, где Apache выполнял работу незначительно лучше.
  • Apache будет применять выходной фильтр ко всему, в отличие от PHP. В некоторых случаях на одном сервере хранятся другие типы контента, мы хотели бы сжать наши .css и .js

Одно предупреждение, некоторые браузеры или другие приложения целенаправленно управляют заголовками клиентов, указывающими, что поддерживается сжатие. Некоторые делают это, чтобы облегчить свою работу с точки зрения безопасности на стороне клиента (например, такие приложения, как norton internet security и т. Д.). Вы можете либо проигнорировать это, либо попытаться добавить лишние случаи для повторной записи запросов, чтобы выглядеть нормальным (браузеры поддерживают его, приложение или прокси-сервер просто futzed для облегчения своей жизни).

В качестве альтернативы, если вы используете команду flush () для отправки вывода в браузер раньше, и вы применяете сжатие, вам может потребоваться заполнить конец строки пробелом, чтобы убедить сервер отправить данные раньше.