2008-07-25

PHP: Уменьшаем исходящий трафик (или изобретаем очередной велосипед)

В связи с разработкой мобильной версии сайта столкнулся с проблемой - передается много данных, как следствие на мобильном телефоне тратится много денег, было решено написать несколько функций предназначенных для уменьшения передаваемых данных Во первых было уменьшен размер отдаваемого HTML, с помощью простого класса:

class OutBufferFilter {
function OutBufferFilter() {
if( @ob_start( array(&$this, 'filter') ) ) {
register_shutdown_function( array(&$this, 'shutdown') );
}
}
function filter( $chunk, $mode ) {
return(
str_replace( '> <', '><',
ereg_replace( "[ \t\r\n]{2,}", ' ',
$chunk
)
)
);
}
function shutdown() {
while( @ob_end_flush() );
}
}

Понятное дело, что метод filter не идеален, но на том HTML-коде который есть у меня он работает (в дизайне не используется теги типа pre)

Потом была добавлена компрессия gzip-ом:

class OutBufferFilterGZ extends OutBufferFilter {
var $use_gzhandler = false;

function OutBufferFilterGZ() {
$this->use_gzhandler = function_exists('ob_gzhandler');

if( @ob_start( array(&$this, 'filter') ) ) {
register_shutdown_function( array(&$this, 'shutdown') );
}
}
function filter( $chunk, $mode ) {
return(
$this->use_gzhandler ?
ob_gzhandler( parent::filter( $chunk ), $mode ) :
parent::filter( $chunk )
);
}
}

Потом класс был расширен на предмет того что-бы кешировать полученные страницы в memcached-е, и если в качестве frontend-а используется nginx, то контент отдавался без участия php, а напрямую из memecache

class OutBufferCached extends OutBufferFilterGZ {
var $memcache = false;
var $content = '';
var $timeout = 10;

function key() {
global $_SERVER;

return( ( isset( $_SERVER )
and isset( $_SERVER["REQUEST_METHOD"] )
and $_SERVER["REQUEST_METHOD"] == 'GET'
) ?
( 'pda:html:'
. (isset( $_SERVER["SCRIPT_NAME"] ) ? $_SERVER["SCRIPT_NAME"] : '')
. (isset( $_SERVER["PATH_INFO"] ) ? $_SERVER["PATH_INFO"] : '' )
. '?'
. (isset( $_SERVER["REQUEST_URI"] ) ? $_SERVER["REQUEST_URI"] : '' )
) :
''
);
}
function OutBufferCached( $memcache = false ) {
$key = $this->key();

if( !empty($key) and $memcache and @$memcache->getVersion() !== false ) {
$this->memcache = $memcache;
$this->content = $this->memcache->get( $key );

if( $this->content !== false ) {
$this->shutdown( false );
exit();
}
else {
$this->content = '';
}
}
if( @ob_start( array(&$this, 'filter') ) ) {
register_shutdown_function( array(&$this, 'shutdown') );
}
}
function filter( $chunk, $mode ) {
$this->content .= parent::filter( $chunk, $mode );

return(null);
}
function shutdown( $store = true ) {
parent::shutdown();
$this->output();
if( $store ) {
$key = $this->key();

if( $this->memcache and !empty($key) and $this->timeout ) {
$this->memcache->set(
$key,
$this->content,
MEMCACHE_COMPRESSED,
$this->timeout
);
}
}
$this->content = '';
}
function output() {
echo $this->content;
flush();
}
function timeout( $t = 10 ) {
$this->timeout = $t;
}
function nocache() {
$this->timeout( 0 );
}
}

Все тестировалось на PHP4 и PHP5, в качестве http-сервера использовалось: apache, nginx + php/fastCGI - пока проблем не возникло.
Собственно хотелось-бы узнать насколько интересен изобретенный мною велосипед ?

28 комментариев:

Анонимный комментирует...

[url=http://wmtraffs.ru/]WMTraffs.ru[/url] - зарабатывай баксы, разставляя ссылки с этой партнёрке
Сайт WMTraffs.ru предоставляет Вам возможность зарабатывать на на ссылках, без своего сайта. Такженаша партнерская программа предлагает покупку трафика с сайтов сети интернет технологий popunder, clickunder, растяжка в шапке, обычные баннера.

Анонимный комментирует...

Племяннице моего мужа исполняется четыре годика, размышляем, что презентовать на ДР порекомендуйте, что занимательно в таком возрасте детям. У нее обожаемая игрушка - умный щенок, намереваемся, может презентовать медведя Куби www.sweetwear.ru. Или посоветуйте что-нибудь ещё.

Анонимный комментирует...

Какая познавательная статья вышла! Респект автору! :)

Анонимный комментирует...

[url=http://allmet.org]Веселые[/url] [url=http://avto-shop.biz]истории[/url] [url=http://jmarket.info]экран[/url] [url=http://otzv.net]покажет наш[/url] [url=http://vgashop.net]веселые истории[/url] [url=http://tvparty.biz]в журнале[/url] [url=http://vybory2012.com]ералаш[/url]

Анонимный комментирует...

[color=#6699cc]Артисты на праздник [url=http://dejavu-group.ru/artist.php]Дежа вю[/url] - это коллектив профессиональных вокалистов и музыкантов на праздник.
[url=http://dejavu-group.ru/index.php]Deja Vu[/url]- законодатель в области музыкального оформления торжеств, музыкальных мероприятий, корпоративок .
В репертуаре музыкантов на праздник Deja Vu около 3 тыс. произведений.
Живая музыка. Поп, хиты 70-80-90-х, диско, джаз, ретро, современная музыка, европейские хиты, фоновая музыка, шансон .
Артисты на праздник Dejavu-group располагает мощной качественной аппаратурой, которая позволяет наполнить плотным и приятным уху звуком как маленькое помещение (фуршет), так и огромное помещение (корпоратив до 1000 человек).

Андрей +7 910 483 8294, Игорь +7 916 623 4047 [/color]

Анонимный комментирует...

Good day, sun shines!
There have been times of troubles when I felt unhappy missing knowledge about opportunities of getting high yields on investments. I was a dump and downright pessimistic person.
I have never imagined that there weren't any need in large starting capital.
Nowadays, I feel good, I started to get real money.
It's all about how to select a proper companion who utilizes your money in a right way - that is incorporate it in real deals, parts and divides the income with me.

You may ask, if there are such firms? I'm obliged to tell the truth, YES, there are. Please get to know about one of them:
http://theinvestblog.com [url=http://theinvestblog.com]Online Investment Blog[/url]

Анонимный комментирует...

Не знаеш который час в твоём городе? мм.. есть cупер предложение по порталу http://www.Pi7.ru и ...

Думаю вам понравится у меня.

[url=http://www.pi7.ru/video/137-porno-video.html]Порно видео[/url]
[url=http://www.pi7.ru/video/136-grubo-derzko-neozhidanno.html]Грубо дерзко неожиданно[/url]

Анонимный комментирует...

[color=#6699cc]
Как дела? Может-быть... есть cупер мысль по[url=http://www.pi7.ru] видео[/url] порталу Думаю вам понравится

[url=http://www.pi7.ru]половое созревание у девочек видео скачать [/url]
aнекдот для разнообразия :)

Вернулся крестьянин в глухую деревню з Столицы. Собралось всё селщо.
Сидят, выпивают потихоньку.
Путешестевнник рссказывает:
- Был в таком магазине интересгом "еСкс-шоп" назыцвается! Ну и магаизн, скажу я вам!.. Девки надюувыне продаются!
Тут самаы бойкая на деревне тётка и спрашивает:
- А муики надувные есть?
Мужик:
- Скажу честино - муызиков не видел. Может, ен завезли? Но запчастей к ним - до е#ен...

Я 7 часов блуждала по сети, порка не вышела на ваш фоорум! Думаю, я здесь останусь надолго!
рошу прощения за опечтки.... очень малеьнкая клавиатура у PDA!

[/color]

Анонимный комментирует...

Восхищен

Анонимный комментирует...

Мне вот кажется, что такое написать мог то ли креативный гений, то ли героиновый наркоман :(

Анонимный комментирует...

У нас в Дагестане за такие слова могут и камням изакидать :(

Анонимный комментирует...

Не очень люблю такие тексты %:(

Анонимный комментирует...

В Вашей RSS нельзя получать полные тексты записей, что ли?

Анонимный комментирует...

Логотип мне нравится:)

Анонимный комментирует...

У Вас долго загружается блог - видимо, хостинг плоховат

Анонимный комментирует...

Об этом уже писал кто-то из моих ЖЖ-френдов :(

Анонимный комментирует...

Прошу прощения за оффтопик.
Вы продаете сквозные ссылки с сайта? Если да, свяжитесь со мной, плз!

Анонимный комментирует...

На словах ты Лев Толстой, а не деле ... простой!

Анонимный комментирует...

На словах ты Лев Толстой, а не деле ... простой!

Анонимный комментирует...

На словах ты Лев Толстой, а не деле ... простой!

Анонимный комментирует...

На словах ты Лев Толстой, а не деле ... простой!

Анонимный комментирует...

А сегодня день архивного работника. У вас на сайте есть "Архив"? Можете праздновать! :))

Анонимный комментирует...

А сегодня день архивного работника. У вас на сайте есть "Архив"? Можете праздновать! :))

Анонимный комментирует...

У нас в жж за такой пост бы закидали какашками в каментах:)

Анонимный комментирует...

У нас в жж за такой пост бы закидали какашками в каментах:)

Анонимный комментирует...

Подскажите, а у вас сквозную ссылку купить можно? Если да, сообщите цену на мыло, пожалуйста?

Анонимный комментирует...

Подскажите, а у вас сквозную ссылку купить можно? Если да, сообщите цену на мыло, пожалуйста?

Анонимный комментирует...

Хорошая статья. Действительно было интересно почитать. Не часто такое и встречается та.Наверное стоит подписаться на ваше RSS