|
| |||||||||||||||||
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 аниматор, пакетный конвертор изображений, редактор электрических схем, программа для скриншотов, диспетчер тем рабочего стола и другие.
На нашем сайте можно не только бесплатно скачать игры, но и документацию и книги по программированию на MIDLetPascal, Turbo Pascal 6, Turbo Pascal 7, Borland Pascal, по программированию устройств Sound Blaster, Adlib, VESA BIOS, справочник Norton Guide и много другой полезной информации для программистов, включая примеры решения реальных задач по созданию резидентных программ.
Журнал > Программирование > PHP и WEB для новичков (HTML, JavaScript, PHP, MySQL) > PHP и WEB для новичков: сжатие страниц и файлов
| ||||||||||||||||||
|
||||||||||||||||||