http://sulfurzona.com/
News
Service
Magazine
Software (Battle City Game, Wallpaper manager, Superpad, VG-NOW, Puzzle Game, Netler Internet Browser, ..)
Dune Game (Dune III, Dune IV, Cheats, Forum, ..)
Games free
Turbo Pascal (Assembler, Docs, Sources, Debbugers, ..)
Books (Docs for developers)
Forum
Guest book
Компьютерная диагностика двигателя автомобиля (адаптер К-линии)Компьютерная диагностика двигателя автомобиля (адаптер К-линии)
 
 
 

PHP и WEB для новичков: сжатие страниц и файлов

 
PHP и WEB для новичков
Ранее в моем журнале я обратился к читателям с просьбой откликнуться и поддержать данный цикл статей, поскольку было намерение завершать его, ведь данный сериал статей выходит уже очень давно, с 2009 года и мог порядком наскучить нашим читателям. Но в ответ стали приходить отклики читателей:
 
Тема: Продолжение PHP
Сообщение: Отличные статьи, продолжайте дальше публиковать. Это один из самых интересных разделов.
Юрий
 
Тема: Мнение о разделе "PHP и WEB для новичков"
Сообщение: Ваш раздел "PHP и WEB для новичков" очень полезен лично для меня и я уверен для других читателей тоже.
Андрей
 
Ну что же? Раз надо - значит надо! Продолжаем ;)
 
Как много уже было рассказано в данном цикле статей о языке программирования PHP, но мы ещё не касались темы сжатия веб-страниц и файлов. Сегодня хочу ввести вас в курс дела и на простых примерах показать, как это работает.
 

Сжатие веб-страниц

 
Обычная работа веб-сервера Apache в упрощенном виде сводится к выполнению скрипта и выдаче в браузер посетителя HTML-кода веб-страницы, сформированной этим скриптом.
Веб-страницы бывают разные. Одни представляют собой компактный HTML-код каталогизированных данных, например, а другие содержат краткие или длинные статьи на какую-то тему.
 
Те или иные можно передавать браузеру не только в исходном виде, но и в сжатом при помощи алгоритмов сжатия. При этом оба участника веб-серфинга – сервер и посетитель сайта получают выгоды:
1) сжатая веб-страница имеет размер в байтах меньший, чем не сжатая и передается в веб-браузер по каналу связи быстрее;
2) трафик сервера разгружается;
3) пользователь тратит меньше трафика, и при лимитированном тарифе меньше платит за скачанный контент;
 
При этом нагрузка на веб-сервер повышается незначительно, поскольку HTML-код веб-страницы представляет собой текстовые данные, а как мы знаем, текст очень быстро и эффективно сжимается современными алгоритмами сжатия.
Для сжатия веб-страниц будем применять функцию ob_start (www.php.su/functions/?ob-start), которая может принимать или не принимать единственный параметр (функцию обратного вызова или, как ее еще называют, callback-функцию) и включает буферизацию вывода. Если буферизация вывода включена этой функцией, то никакой вывод скрипта в браузер не высылается (кроме шапок/headers), при этом вывод сохраняется во внутреннем буфере сервера.
 
В качестве callback-функции укажем ob_gzhandler – это callback-функция (www.php.su/functions/?ob-gzhandler) для буфера вывода gzip. Функция ob_gzhandler обеспечивает отправку gz-кодированных данных браузерам, поддерживающим сжатие web-страниц.
Предварительно ob_gzhandler определяет, какой тип кодирования содержимого поддерживает (понимает) браузер ("gzip", "deflate" или никакой), и возвратит его содержимое соответствующим образом. Поддерживаются все браузеры, отправляющие корректную шапку/header о том, что они принимают сжатые web-страницы.
 
В качестве подопытной статьи давайте возьмем (на моем сайте файл sql_book.rar) книгу о языке запросов SQL, которая в распаковке занимает 740 Кб. Ее текст включим в следующий PHP-код нашей тестовой страницы test_gzip.php:
 
<?
   ob_start("ob_gzhandler");
?>
      СОДЕРЖАНИЕ ГЛАВ КНИГИ
 
Для большей точности измерения трафика можно воспользоваться удобной программой BitMeter (http://codebox.org.uk/pages/home). Итак, благодаря конструкции ob_start("ob_gzhandler") наша книга загрузится в 3,5 раза быстрее, чем без сжатия.
 

Сжатие файлов

 
Как и сжатие веб-страниц, веб-программисту доступно сжатие файлов, например, алгоритмом ZIP. Вся необходимая документация собрана на страницах http://ru.php.net/manual/ru/book.zip.php и http://ru.php.net/manual/ru/class.ziparchive.php.
 
Как вы понимаете, журнал не резиновый, много в нем не уместишь, и прочие бла-бла-бла… ;) Поэтому могу лишь показать на кратких примерах, как и чего тут надо делать. А если вам понадобится что-то усложнить, то читайте документацию.
Следуя традиции упрощения всего сложного, язык PHP дарит нам очередное упрощение.
 
<?
$zip = new ZipArchive();
$filename = "test.zip";
 
if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {
    echo "Не могу открыть файл '".$filename."'";
    exit;
   }
 
$text = file_get_contents("test_gzip.php");
 
$zip->addFromString("test_gzip.txt", $text);
$zip->addFromString("testfile2.txt", "This is a test string added as testfile2.txt.n");
$zip->addFile("test_gzip.php", "test_gzip2.txt");
echo "numfiles: ".$zip->numFiles."n";
echo "status:".$zip->status."n";
$zip->close();
?>
 
В данном скрипте вызовом конструктора ZipArchive создаем объект $zip, как экземпляр. Далее в переменной $filename указываем имя файла создаваемого нами архива.
 
 
 
 
 
После этого в условном операторе вызовом метода open нашего объекта открываем файл архива, указывая его имя и константу ZIPARCHIVE::CREATE. Т.е. этим действием создаем архив, если такого файла ещё не существует. Для более компактного написания этой строки кода, вместо константы можно подставить единицу.
 
Затем командой file_get_contents считываем содержимое предыдущего скрипта (test_gzip.php), ведь он же файл, вот и будем его сжимать для тренировки ;)
 
Итак, в архив можно добавить обычную текстовую строку как файл. Мы этим воспользуемся и вызовом метода addFromString добавим в наш архив новую запись под именем файла "test_gzip.txt", а содержимое для него пускай возьмет из переменной $text.
 
В качестве следующего файла, добавляемого в архив, укажем произвольную строку и укажем, что ее следует считать файлом "testfile2.txt".
Вот мы и добавили уже два файла в архив. Но это некий текст, а как добавить реальный файл, расположенный на сервере, не загружая его? Для этого вызовем метод addFile, и укажем, что следует взять на сервере реальный файл "test_gzip.php", и добавить его в архив под именем "test_gzip2.txt".
 
Не пугайтесь, что берем один файл, а добавляем его в архив уже под другим именем. Можно добавлять и под его собственным именем, но я хочу показать, что при добавлении в архив имеется возможность дать сжимаемому файлу другое имя, если это необходимо.
Ну и в завершение нашего примера выводим информацию о количестве добавленных в архив файлов и закрываем архив методом close. В результате получим в браузере строку “numfiles: 3 status: 0”.
 
Замечу, что если файл архива с таким именем уже существует, то файлы будут добавлены в него.
 

Вывод списка файлов архива

 
Бывает необходимо уметь не только создавать архив, но и прочитать его содержимое. Следующий простой пример покажет это:
 
<?
$zip = new ZipArchive();
$zip->open('test.zip');
 
for( $i = 0; $i < $zip->numFiles; $i++ ){
      $stat = $zip->statIndex( $i );
      echo "<BR>".basename( $stat['name']);
    }
?>
 
В результате открытия уже созданного нами ранее архива “test.zip” и перебора его содержимого получим список входящих в него файлов:
 
test_gzip.txt
testfile2.txt
test_gzip2.txt
 

Вывод подробной информации об архиве

 
Дальше – больше, но не на много сложнее. Создаем объект, открываем файл архива, выводим структуру объекта конструкцией print_r($zip). Затем перебираем каждую запись архива и выводим ее структуру командой print_r($zip->statIndex($i)).
 
<?
$zip = new ZipArchive();
 
$zip->open('test.zip');
echo "<pre>";
print_r($zip);
echo "</pre>";
 
for ($i=0; $i<$zip->numFiles;$i++) {
echo "<pre>";
print_r($zip->statIndex($i));
echo "</pre>";
}
echo "numFile:".$zip->numFiles."n";
?>
 
В итоге получаем в браузере информацию о структуре данных архива, позволяющую понять, где и какие данные брать:
 
ZipArchive Object (
    [status] => 0
    [statusSys] => 0
    [numFiles] => 3
    [filename] => /home/myhosting/public_html/mysite/test.zip
    [comment] =>
)
 
Здесь мы видим, что поле numFiles объекта содержит число добавленных в архив файлов, поле filename содержит полный путь к открытому архиву.
Затем наблюдаем структуру трех файлов, добавленных нами в архив test.zip. А тут для каждого файла в поле name хранится его имя, в поле index порядковый номер в архиве, в поле crc контрольная сумма для проверки целостности хранимых данных, поле size указывает на размер несжатых данных, поле mtime хранит время добавления в архив (извлечь дату и время в понятном виде можно командой date), поле comp_size содержит размер сжатых данных и поле comp_method уровень компрессии.
 
Array (
    [name] => test_gzip.txt
    [index] => 0
    [crc] => 323277245
    [size] => 726694
    [mtime] => 1319696726
    [comp_size] => 204207
    [comp_method] => 8
)
Array (
    [name] => testfile2.txt
    [index] => 1
)
Array (
    [name] => test_gzip2.txt
    [index] => 2
)
numFile:3
 
Пожалуй, не рассказал лишь о том, как извлечь данные из архива. Но это вы уже попробуйте сами сделать в качестве домашнего задания.
 
© Владислав Демьянишин
 
 
Вы находитесь на официальном сайте Владислава Демьянишина - разработчика игры Dune IV (Dune 4). На нашем сайте можно бесплатно скачать игры Dune IV (Dune 4), Battle City (Танчики с Dendy/Nintendo), читы к играм и многое другое. Также Вы можете скачать бесплатно программы и полезные утилиты. Среди доступных программ есть мобильная читалка книг, менеджер переноса файлов с фото- и видеокамер на компьютер, текстовый редактор, WYSIWYG редактор, 3D аниматор, GIF аниматор, AVI аниматор, пакетный конвертор изображений, редактор электрических схем, программа для скриншотов, диспетчер тем рабочего стола и другие. Предлагаю также посетить Марья искусница - сайт о рукоделии (http://mariya-iskusnica.ru).
 
 

Журнал > Программирование > PHP и WEB для новичков (HTML, JavaScript, PHP, MySQL) > PHP и WEB для новичков: сжатие страниц и файлов
 
 
 
48
 
ВКонтакте
Facebook
 
 
 
На главную страницу На предыдущую страницу На начало страницы
 
 
Украинский портАл Украина онлайн Рейтинг@Mail.ru Рейтинг Сайтов YandeG Rambler's Top100