<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Блог web-мастера</title>
	<atom:link href="http://blog.webmasterschool.ru/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.webmasterschool.ru</link>
	<description>PHP, MySQL, JavaScript, AJAX, HTML и CSS</description>
	<pubDate>Fri, 13 May 2011 05:51:27 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Установка FreeBSD. Часть 1</title>
		<link>http://blog.webmasterschool.ru/freebsd/251/</link>
		<comments>http://blog.webmasterschool.ru/freebsd/251/#comments</comments>
		<pubDate>Sat, 13 Jun 2009 11:52:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[FreeBSD]]></category>

		<guid isPermaLink="false">http://blog.webmasterschool.ru/?p=251</guid>
		<description><![CDATA[В этой заметке мы рассмотрим установку FreeBSD на новую машину (в том смысле, что не содержащую другую операционную систему) с дистрибутивного DVD. Устаноновка и постинсталляционное конфигурирование FreeBSD осуществляются программмой sysinstall. В функции sysinstall входят подготовка дисковых разделов, установка базовых компонентов системы и дополнительных пакетов, управление пользователями, установка языковой поддержки и множество дополнительных настроек.
Программа sysinstall запускается [...]]]></description>
			<content:encoded><![CDATA[<p>В этой заметке мы рассмотрим установку FreeBSD на новую машину (в том смысле, что не содержащую другую операционную систему) с дистрибутивного DVD. Устаноновка и постинсталляционное конфигурирование FreeBSD осуществляются программмой <strong>sysinstall</strong>. В функции <strong>sysinstall</strong> входят подготовка дисковых разделов, установка базовых компонентов системы и дополнительных пакетов, управление пользователями, установка языковой поддержки и множество дополнительных настроек.</p>
<p>Программа <strong>sysinstall</strong> запускается автоматически с установочного DVD после перезагрузки машины (после включения соответствующей опции в BIOS Setup). После выбора страны  - <strong>Russian Federation</strong> (Российская Федерация)</p>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_1.jpg' rel="lightbox-post251"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_1-300x187.jpg" alt="" title="freebsd_install_1" width="300" height="187" class="alignnone size-medium wp-image-252" /></a></p>
<p>и раскладки клавиатуры - <strong>Russia KOI8-R</strong> </p>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_2.jpg' rel="lightbox-post251"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_2-300x187.jpg" alt="" title="freebsd_install_2" width="300" height="187" class="alignnone size-medium wp-image-253" /></a></p>
<p>попадаем в главное меню программы <strong>sysinstall</strong> - <strong style="color:darkred">Sysinstall Main Menu</strong>:</p>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_3.jpg' rel="lightbox-post251"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_3-300x187.jpg" alt="" title="freebsd_install_3" width="300" height="187" class="alignnone size-medium wp-image-254" /></a></p>
<p><strong>Sysinstall</strong> - программа текстового режима с интерфейсом, оформленным псевдографикой. Выбор опций осуществляется в меню исключительно стрелками перемещения курсора, клавишами [Tab], [Spacebar] и [Enter]. </p>
<p>Первым пунктом в нем (<strong style="color:darkred">Usage</strong>) следует краткая справка по использованию программы. Следующие три пункта - <strong style="color:darkred">Standard</strong> (Стандартная), <strong style="color:darkred">Express</strong> (Быстрая) и <strong style="color:darkred">Custom</strong> (Выборочная) - предлагают три типа установки: стандартный, быстрый и заказной. Первые два варианта мы рассматривать не будем - зачем устанавливать программы, которые нам не нужны. Поэтому выбираем третий тип установки.</p>
<p>При выборе его вызывается меню <strong style="color:darkgreen">Choose Custom Installation Options</strong> позволяющее выбрать опции заказной установки:</p>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_4.jpg' rel="lightbox-post251"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_4-300x187.jpg" alt="" title="freebsd_install_4" width="300" height="187" class="alignnone size-medium wp-image-255" /></a></p>
<ul>
<li><strong style="color:darkgreen">Options</strong> (Опции)</li>
<li><strong style="color:darkgreen">Partition</strong> (Создание слайсов)</li>
<li><strong style="color:darkgreen">Label</strong> (Создание разделов)</li>
<li><strong style="color:darkgreen">Distributions</strong> (Основные компоненты)</li>
<li><strong style="color:darkgreen">Media</strong> (Источники установки)</li>
<li><strong style="color:darkgreen">Commit</strong> (Подтверждение)</li>
</ul>
<p>Пункт <strong style="color:darkgreen">Options</strong> (Опции) вызывает редактор опций - таких как сетевые параметры, тип терминала, редактор по умолчанию и т.п. Пропустим пока этот пункт.</p>
<p>При выборе следующего пункта - <strong style="color:darkgreen">Partition</strong> (Создание слайсов), на экране появится окно редактора слайсов:</p>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_5.jpg' rel="lightbox-post251"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_5-300x187.jpg" alt="" title="freebsd_install_5" width="300" height="187" class="alignnone size-medium wp-image-256" /></a></p>
<p>Поскольку на компьютере не предполагается использование других ОС, можно ограничиться одним слайсом для FreeBSD. Так что выбираем опцию <strong>A = Entire disk</strong> (Полный диск) и выходим из редактора - <strong>Q = Finish</strong>.</p>
<p>После этого нам будет предложено установить загрузчик FreeBSD:</p>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_6.jpg' rel="lightbox-post251"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_6-300x187.jpg" alt="" title="freebsd_install_6" width="300" height="187" class="alignnone size-medium wp-image-257" /></a></p>
<ul>
<li>BootMgr - установить менеджер загрузок FreeBSD</li>
<li>Standard - стандартная MBR</li>
<li>None - не трогать MBR</li>
</ul>
<p>Поскольку на машине будет только одна операционная система, нет необходимости устанавливать менеджер загрузки - поэтому выбираем второй пункт.</p>
<p>Теперь нам нужен пункт <strong style="color:darkgreen">Label</strong> (Создание разделов)</p>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_7.jpg' rel="lightbox-post251"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_7-300x187.jpg" alt="" title="freebsd_install_7" width="300" height="187" class="alignnone size-medium wp-image-258" /></a></p>
<p>чтобы разбить слайс FreeBSD на разделы:</p>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_8.jpg' rel="lightbox-post251"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_8-300x187.jpg" alt="" title="freebsd_install_8" width="300" height="187" class="alignnone size-medium wp-image-259" /></a></p>
<p>Выбираем <strong>A = Auto Defaults</strong> и <strong>Q = Finish</strong> для выхода.</p>
<p>Пункт <strong style="color:darkgreen">Distributions</strong> (Основные компоненты)</p>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_9.jpg' rel="lightbox-post251"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_9-300x187.jpg" alt="" title="freebsd_install_9" width="300" height="187" class="alignnone size-medium wp-image-260" /></a></p>
<p>отвечает за выбор базовых компонентов установки: </p>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_10.jpg' rel="lightbox-post251"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_10-300x187.jpg" alt="" title="freebsd_install_10" width="300" height="187" class="alignnone size-medium wp-image-261" /></a></p>
<p>Все они сгруппированы в некие предопределенные наборы - для разработчиков и пользователей разного профиля, минимально необходимый набор. Есть возможность сделать выбор вручную или установить весь штатный комплект. Выбираем пункт <strong>Minimal</strong> с помощью клавишы [SpaseBar], с помощью [Tab] выбираем <strong>[OK]</strong>, жмем [Enter].</p>
<p>В пункте <strong style="color:darkgreen">Media</strong> (Источники установки)</p>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_11.jpg' rel="lightbox-post251"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_11-300x187.jpg" alt="" title="freebsd_install_11" width="300" height="187" class="alignnone size-medium wp-image-262" /></a></p>
<p>выбираем источник инсталляции - CD/DVD, FTP в активном или пассивном режиме и т.п. При запуске <strong>sysinstall</strong> с инсталляционного DVD необходимости в выборе первого пункта нет - он включен по умолчанию. </p>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_12.jpg' rel="lightbox-post251"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_12-300x187.jpg" alt="" title="freebsd_install_12" width="300" height="187" class="alignnone size-medium wp-image-263" /></a></p>
<p>Смысл этого пункта в возможности смены источника в процессе установки.</p>
<p>Наконец, пунктом <strong style="color:darkgreen">Commit</strong> (Подтверждение) завершается процесс базовой установки:</p>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_13.jpg' rel="lightbox-post251"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_13-300x187.jpg" alt="" title="freebsd_install_13" width="300" height="187" class="alignnone size-medium wp-image-264" /></a></p>
<p>Он запрашивает подтверждение на выполнение всех заказанных опций и действий. В том числе - и на создание дисковых разделов и файловых систем на них. До того, как такое подтверждение последует, с диском физически ничего не происходит.</p>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_14.jpg' rel="lightbox-post251"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_14-300x187.jpg" alt="" title="freebsd_install_14" width="300" height="187" class="alignnone size-medium wp-image-265" /></a></p>
<p>После подтверждения диск разбивается на разделы, на них создаются файловые системы и начинается установка выбранных компонентов:</p>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_15.jpg' rel="lightbox-post251"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_15-300x187.jpg" alt="" title="freebsd_install_15" width="300" height="187" class="alignnone size-medium wp-image-266" /></a></p>
<p>После завершения установки мы увидим сообщение с предложением выполнить постинсталляционное конфигурирование системы:</p>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_16.jpg' rel="lightbox-post251"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_16-300x187.jpg" alt="" title="freebsd_install_16" width="300" height="187" class="alignnone size-medium wp-image-267" /></a></p>
<p>Мы сделаем это немного позже - после перезагрузки, поэтому выбираем <strong>[No]</strong> и попадаем опять в <strong style="color:darkgreen">Choose Custom Installation Options</strong></p>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_17.jpg' rel="lightbox-post251"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_17-300x187.jpg" alt="" title="freebsd_install_17" width="300" height="187" class="alignnone size-medium wp-image-268" /></a></p>
<p>Выбираем <strong style="color:darkgreen">Exit</strong>, чтобы вернуться в главное меню программы <strong>sysinstall</strong>. Теперь можно выйти из программы установки, выбрав <strong style="color:darkred">Exit Install</strong> (Завершение установки)</p>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_18.jpg' rel="lightbox-post251"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_18-300x187.jpg" alt="" title="freebsd_install_18" width="300" height="187" class="alignnone size-medium wp-image-269" /></a></p>
<p>что автоматически влечет за собой перезагрузку системы</p>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_19.jpg' rel="lightbox-post251"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_19-300x187.jpg" alt="" title="freebsd_install_19" width="300" height="187" class="alignnone size-medium wp-image-270" /></a></p>
<p>Не забудьте вынуть DVD из привода или изменить установки BIOS!</p>
<p>После того, как система загрузится, будет предложено ввести логин пользователя - <strong>root</strong>:</p>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_20.jpg' rel="lightbox-post251"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/06/freebsd_install_20-300x187.jpg" alt="" title="freebsd_install_20" width="300" height="187" class="alignnone size-medium wp-image-271" /></a></p>
<p>На сегодня, пожалуй, все. Чтобы завершить работу и выключить питание компьютера, набираем в командной строке:</p>
<div class="codecolorer-container bash" style="height:35px;"><div class="codecolorer" style="font-family: monospace;">shutdown -p now</div></div>
<p>Продолжение следует&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webmasterschool.ru/freebsd/251/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Скачивание файлов по временным ссылкам</title>
		<link>http://blog.webmasterschool.ru/php/250/</link>
		<comments>http://blog.webmasterschool.ru/php/250/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 11:31:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.webmasterschool.ru/?p=250</guid>
		<description><![CDATA[Наверное каждому приходилось сталкиваться с временными ссылками при скачивании фильмов, музыки, программ и т.п. Зачем это делается? Да чтобы другие сайты не размещали ссылки на файлы, которые расположены на нашем сайте. Давайте посмотрим, как написать скрипт, который будет генерить временные ссылки.
В качестве хранения информации о файлах и временных ссылках, будем использовать БД. Таблица files хранит [...]]]></description>
			<content:encoded><![CDATA[<p>Наверное каждому приходилось сталкиваться с временными ссылками при скачивании фильмов, музыки, программ и т.п. Зачем это делается? Да чтобы другие сайты не размещали ссылки на файлы, которые расположены на нашем сайте. Давайте посмотрим, как написать скрипт, который будет генерить временные ссылки.</p>
<p>В качестве хранения информации о файлах и временных ссылках, будем использовать БД. Таблица files хранит информацию о файлах:</p>
<div class="codecolorer-container mysql"><div class="codecolorer" style="font-family: monospace;"><span class="kw1">CREATE TABLE</span> `files` <span class="br0">&#40;</span><br />
&nbsp; `id` <span class="kw2">INT</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span> <span class="kw1">PRIMARY KEY</span>,<br />
&nbsp; `title` <span class="kw2">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> <span class="kw3">NOT NULL</span> <span class="kw3">DEFAULT</span> <span class="st0">''</span>,<br />
&nbsp; `description` <span class="kw2">TEXT</span> <span class="kw3">NOT NULL</span> <span class="kw3">DEFAULT</span> <span class="st0">''</span>,<br />
&nbsp; `filename` <span class="kw2">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">64</span><span class="br0">&#41;</span> <span class="kw3">NOT NULL</span> <span class="kw3">DEFAULT</span> <span class="st0">''</span>,<br />
&nbsp; `mimetype` <span class="kw2">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">8</span><span class="br0">&#41;</span> <span class="kw3">NOT NULL</span> <span class="kw3">DEFAULT</span> <span class="st0">''</span><br />
<span class="br0">&#41;</span> ENGINE=<span class="kw1">INNODB</span> <span class="kw3">DEFAULT</span> <span class="kw3">CHARSET</span>=cp1251;</div></div>
<p>Здесь</p>
<ul>
<li>id - уникальный ID файла</li>
<li>title - название файла, например, &#8220;<em>Текстовой редактор NotePad++</em>&#8220;</li>
<li>description - описание файла, например, &#8220;<em>Бесплатный редактор текстовых файлов (замена стандартного Блокнота) с поддержкой синтаксиса большого количества языков программирования, ориентирован для работы в операционной системе MS Windows</em>&#8220;</li>
<li>filename - имя файла для скачивания, например, NotePadPP.zip</li>
<li>mimetype - MIME-тип файла</li>
</ul>
<p>Таблица downloads хранит информацию о временных ссылках:</p>
<div class="codecolorer-container mysql"><div class="codecolorer" style="font-family: monospace;"><span class="kw1">CREATE TABLE</span> `downloads` <span class="br0">&#40;</span><br />
&nbsp; `file_id` <span class="kw2">INT</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span> <span class="kw3">NOT NULL</span> <span class="kw3">DEFAULT</span> <span class="nu0">0</span>,<br />
&nbsp; `uniq_id` <span class="kw2">VARCHAR</span><span class="br0">&#40;</span><span class="nu0">32</span><span class="br0">&#41;</span> <span class="kw3">NOT NULL</span> <span class="kw3">DEFAULT</span> <span class="st0">''</span>,<br />
&nbsp; `puttime` <span class="kw2">DATETIME</span> <span class="kw3">NOT NULL</span> <span class="kw3">DEFAULT</span> <span class="st0">'0000-00-00 00:00:00'</span><br />
<span class="br0">&#41;</span> ENGINE=<span class="kw1">INNODB</span> <span class="kw3">DEFAULT</span> <span class="kw3">CHARSET</span>=cp1251;</div></div>
<p>Здесь</p>
<ul>
<li>file_id – уникальный ID файла</li>
<li>uniq_id – временная ссылка
<li>puttime - время создания ссылки</li>
</ul>
<p>Файлы для скачивания расположены в директории DOCUMENT_ROOT/download/files/. Эта директория должна быть защищена с помощью .htaccess:</p>
<div class="codecolorer-container html4strict"><div class="codecolorer" style="font-family: monospace;">Order Allow,Deny<br />
Deny from All</div></div>
<p>Скрипт, который будет выполнять всю работу - выводить список файлов, генерить временные ссылки, и отдавать файлы на скачивание - DOCUMENT_ROOT/download/index.php</p>
<div class="codecolorer-container php" style="height:280px;"><div class="codecolorer" style="font-family: monospace;"><span class="kw2">&lt;?php</span><br />
<br />
<span class="co1">// Соединяемся с сервером БД</span><br />
<span class="kw3">mysql_connect</span> <span class="br0">&#40;</span> <span class="st0">'localhost'</span>, <span class="st0">'root'</span>, <span class="st0">''</span> <span class="br0">&#41;</span>;<br />
<span class="kw3">mysql_query</span><span class="br0">&#40;</span> <span class="st0">'SET NAMES cp1251'</span> <span class="br0">&#41;</span>;<br />
<span class="kw3">mysql_select_db</span> <span class="br0">&#40;</span> <span class="st0">'downloads'</span> <span class="br0">&#41;</span>;<br />
<br />
<span class="co1">// удаляем устаревшие записи в таблице БД downloads</span><br />
<span class="re0">$query</span> = <span class="st0">'DELETE FROM downloads WHERE puttime &lt; (NOW() - INTERVAL 12 HOUR)'</span>;<br />
<span class="kw3">mysql_query</span><span class="br0">&#40;</span> <span class="re0">$query</span> <span class="br0">&#41;</span>;<br />
<br />
<span class="re0">$actions</span> = <span class="kw3">array</span><span class="br0">&#40;</span> <span class="st0">'fileslist'</span>, <span class="st0">'getlink'</span>, <span class="st0">'download'</span> <span class="br0">&#41;</span>;<br />
<br />
<span class="re0">$action</span> = <span class="st0">'fileslist'</span>;<br />
<span class="kw1">if</span><span class="br0">&#40;</span> <span class="kw3">isset</span><span class="br0">&#40;</span> <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">'action'</span><span class="br0">&#93;</span> <span class="br0">&#41;</span> and <span class="kw3">in_array</span><span class="br0">&#40;</span> <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">'action'</span><span class="br0">&#93;</span>, <span class="re0">$actions</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="re0">$action</span> = <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">'action'</span><span class="br0">&#93;</span>;<br />
<br />
<span class="kw1">switch</span><span class="br0">&#40;</span> <span class="re0">$action</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">case</span> <span class="st0">'fileslist'</span>:&nbsp; &nbsp; &nbsp; <span class="co1">// список файлов для скачивания</span><br />
&nbsp; &nbsp; fileslist<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="kw1">break</span>;<br />
&nbsp; <span class="kw1">case</span> <span class="st0">'getlink'</span>:&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// создаем временную ссылку</span><br />
&nbsp; &nbsp; getlink<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="kw1">break</span>;<br />
&nbsp; <span class="kw1">case</span> <span class="st0">'download'</span>:&nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">// отдаем файл на скачивание</span><br />
&nbsp; &nbsp; download<span class="br0">&#40;</span><span class="br0">&#41;</span>;&nbsp; <span class="kw1">break</span>;<br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw2">function</span> fileslist<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<br />
&nbsp; <span class="kw3">echo</span> <span class="st0">'&lt;h3&gt;Файлы для скачивания&lt;/h3&gt;'</span>.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;<br />
&nbsp; <span class="re0">$query</span> = <span class="st0">'SELECT id, title, description, mimetype FROM `files` WHERE 1 ORDER BY title'</span>;<br />
&nbsp; <span class="re0">$res</span> = <span class="kw3">mysql_query</span><span class="br0">&#40;</span> <span class="re0">$query</span> <span class="br0">&#41;</span>;<br />
<br />
&nbsp; <span class="kw3">echo</span> <span class="st0">'&lt;table border=&quot;1&quot;&gt;'</span>.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;<br />
&nbsp; <span class="kw3">echo</span> <span class="st0">'&lt;tr&gt;&lt;th&gt;№&lt;/th&gt;&lt;th&gt;Наименование&lt;/th&gt;&lt;th&gt;Описание&lt;/th&gt;&lt;th&gt;Тип&lt;/th&gt;&lt;th&gt;Скачать&lt;/th&gt;&lt;/tr&gt;'</span>.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;<br />
&nbsp; <span class="re0">$i</span> = <span class="nu0">1</span>;<br />
&nbsp; <span class="kw1">while</span><span class="br0">&#40;</span> <span class="re0">$file</span> = <span class="kw3">mysql_fetch_array</span><span class="br0">&#40;</span> <span class="re0">$res</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">'&lt;tr&gt;'</span>;<br />
&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">'&lt;td&gt;'</span>.<span class="re0">$i</span>.<span class="st0">'&lt;/td&gt;'</span>;<br />
&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">'&lt;td&gt;'</span>.<span class="re0">$file</span><span class="br0">&#91;</span><span class="st0">'title'</span><span class="br0">&#93;</span>.<span class="st0">'&lt;/td&gt;'</span>;<br />
&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">'&lt;td&gt;'</span>.<span class="re0">$file</span><span class="br0">&#91;</span><span class="st0">'description'</span><span class="br0">&#93;</span>.<span class="st0">'&lt;/td&gt;'</span>;<br />
&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">'&lt;td&gt;'</span>.<span class="re0">$file</span><span class="br0">&#91;</span><span class="st0">'mimetype'</span><span class="br0">&#93;</span>.<span class="st0">'&lt;/td&gt;'</span>;<br />
&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">'&lt;td&gt;&lt;a href=&quot;'</span>.<span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">'PHP_SELF'</span><span class="br0">&#93;</span>.<span class="st0">'?action=getlink&amp;id='</span>.<span class="re0">$file</span><span class="br0">&#91;</span><span class="st0">'id'</span><span class="br0">&#93;</span>.<span class="st0">'&quot;&gt;Скачать&lt;/a&gt;&lt;/td&gt;'</span>;<br />
&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">'&lt;/tr&gt;'</span>.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;<br />
&nbsp; &nbsp; <span class="re0">$i</span>++;<br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="kw3">echo</span> <span class="st0">'&lt;/table&gt;'</span>.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;<br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw2">function</span> getlink<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<br />
&nbsp; <span class="co1">// если не передан уникальный ID файла - значит пользователь попал сюда по ошибке</span><br />
&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span> !<span class="kw3">isset</span><span class="br0">&#40;</span> <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">'id'</span><span class="br0">&#93;</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw3">header</span><span class="br0">&#40;</span> <span class="st0">'Location: '</span>.<span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">'PHP_SELF'</span><span class="br0">&#93;</span>.<span class="st0">'?action=fileslist'</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="kw3">die</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="re0">$id</span> = <span class="br0">&#40;</span>int<span class="br0">&#41;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">'id'</span><span class="br0">&#93;</span>;<br />
<br />
&nbsp; <span class="co1">// прежде чем генерить временную ссылку, проверяем, что есть такая запись в таблице БД</span><br />
&nbsp; <span class="re0">$query</span> = <span class="st0">'SELECT 1 FROM `files` WHERE id='</span>.<span class="re0">$id</span>;<br />
&nbsp; <span class="re0">$res</span> = <span class="kw3">mysql_query</span><span class="br0">&#40;</span> <span class="re0">$query</span> <span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span> <span class="kw3">mysql_num_rows</span><span class="br0">&#40;</span> <span class="re0">$res</span> <span class="br0">&#41;</span> == <span class="nu0">0</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw3">header</span> <span class="br0">&#40;</span> <span class="st0">'HTTP/1.1 404 Not Found'</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="kw3">die</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;&nbsp; <br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp;<br />
&nbsp; <span class="re0">$uniq_id</span> = <span class="kw3">md5</span><span class="br0">&#40;</span> <span class="kw3">uniqid</span><span class="br0">&#40;</span><span class="kw3">rand</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>;<br />
&nbsp; <span class="re0">$query</span> = <span class="st0">&quot;INSERT INTO downloads (file_id, uniq_id, puttime) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VALUES (&quot;</span>.<span class="re0">$id</span>.<span class="st0">&quot;, '&quot;</span>.<span class="re0">$uniq_id</span>.<span class="st0">&quot;', NOW())&quot;</span>;<br />
&nbsp; <span class="kw3">mysql_query</span><span class="br0">&#40;</span> <span class="re0">$query</span> <span class="br0">&#41;</span>;<br />
&nbsp;<br />
&nbsp; <span class="re0">$link</span> = <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">'PHP_SELF'</span><span class="br0">&#93;</span>.<span class="st0">'?action=download&amp;id='</span>.<span class="re0">$id</span>.<span class="st0">'&amp;code='</span>.<span class="re0">$uniq_id</span>;<br />
&nbsp; <span class="kw3">echo</span> <span class="st0">'&lt;p&gt;Для загрузки файла перейдите по &lt;a href=&quot;'</span>.<span class="re0">$link</span>.<span class="st0">'&quot;&gt;этой ссылке&lt;/a&gt;. '</span>; <br />
&nbsp; <span class="kw3">echo</span> <span class="st0">'Ссылка действительна в течение 12 часов.&lt;/p&gt;'</span>.<span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;<br />
<br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw2">function</span> download<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; <br />
&nbsp; <span class="co1">// если не передан уникальный ID файла - значит пользователь попал сюда по ошибке</span><br />
&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span> !<span class="kw3">isset</span><span class="br0">&#40;</span> <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">'id'</span><span class="br0">&#93;</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw3">header</span><span class="br0">&#40;</span> <span class="st0">'Location: '</span>.<span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">'PHP_SELF'</span><span class="br0">&#93;</span>.<span class="st0">'?action=fileslist'</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="kw3">die</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="re0">$id</span> = <span class="br0">&#40;</span>int<span class="br0">&#41;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">'id'</span><span class="br0">&#93;</span>;<br />
&nbsp; <br />
&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span> !<span class="kw3">isset</span><span class="br0">&#40;</span> <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">'code'</span><span class="br0">&#93;</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span>&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw3">header</span><span class="br0">&#40;</span> <span class="st0">'Location: '</span>.<span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">'PHP_SELF'</span><span class="br0">&#93;</span>.<span class="st0">'?action=fileslist'</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="kw3">die</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; <br />
&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span> !<span class="kw3">preg_match</span><span class="br0">&#40;</span> <span class="st0">'#[a-f0-9]{32}#'</span>, <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">'code'</span><span class="br0">&#93;</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span>&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw3">header</span> <span class="br0">&#40;</span> <span class="st0">'HTTP/1.1 404 Not Found'</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="kw3">die</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; <br />
&nbsp; <span class="re0">$query</span> = <span class="st0">&quot;SELECT 1 FROM downloads WHERE file_id=&quot;</span>.<span class="re0">$id</span>.<span class="st0">&quot; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AND uniq_id='&quot;</span>.<span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">'code'</span><span class="br0">&#93;</span>.<span class="st0">&quot;' AND puttime &gt; (NOW() - INTERVAL 12 HOUR)&quot;</span>;<br />
&nbsp; <span class="re0">$res</span> = <span class="kw3">mysql_query</span><span class="br0">&#40;</span> <span class="re0">$query</span> <span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span> <span class="kw3">mysql_num_rows</span><span class="br0">&#40;</span> <span class="re0">$res</span> <span class="br0">&#41;</span> == <span class="nu0">0</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw3">header</span> <span class="br0">&#40;</span> <span class="st0">'HTTP/1.1 404 Not Found'</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="kw3">die</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;&nbsp; <br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; <br />
&nbsp; <span class="re0">$query</span> = <span class="st0">'SELECT filename, mimetype FROM `files` WHERE id='</span>.<span class="re0">$id</span>;<br />
&nbsp; <span class="re0">$res</span> = <span class="kw3">mysql_query</span><span class="br0">&#40;</span> <span class="re0">$query</span> <span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span> <span class="kw3">mysql_num_rows</span><span class="br0">&#40;</span> <span class="re0">$res</span> <span class="br0">&#41;</span> == <span class="nu0">0</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw3">header</span> <span class="br0">&#40;</span> <span class="st0">'HTTP/1.1 404 Not Found'</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="kw3">die</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;&nbsp; <br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="kw3">list</span><span class="br0">&#40;</span> <span class="re0">$filename</span>, <span class="re0">$mimetype</span> <span class="br0">&#41;</span> = <span class="kw3">mysql_fetch_row</span><span class="br0">&#40;</span> <span class="re0">$res</span> <span class="br0">&#41;</span>;<br />
&nbsp;<br />
&nbsp; <span class="co1">// если файла нет</span><br />
&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span> !<span class="kw3">file_exists</span><span class="br0">&#40;</span> <span class="st0">'./files/'</span>.<span class="re0">$filename</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw3">header</span> <span class="br0">&#40;</span> <span class="st0">'HTTP/1.1 404 Not Found'</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="kw3">die</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp;<br />
&nbsp; <span class="co1">// получаем размер файла</span><br />
&nbsp; <span class="re0">$fsize</span> = <span class="kw3">filesize</span><span class="br0">&#40;</span> <span class="st0">'./files/'</span>.<span class="re0">$filename</span> <span class="br0">&#41;</span>;<br />
&nbsp; <span class="co1">// дата модификации файла для кеширования</span><br />
&nbsp; <span class="re0">$ftime</span> = <span class="kw3">date</span><span class="br0">&#40;</span> <span class="st0">'D, d M Y H:i:s T'</span>, <span class="kw3">filemtime</span><span class="br0">&#40;</span> <span class="st0">'./files/'</span>.<span class="re0">$filename</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span>;<br />
&nbsp; <span class="co1">// смещение от начала файла</span><br />
&nbsp; <span class="re0">$range</span> = <span class="nu0">0</span>;<br />
&nbsp;<br />
&nbsp; <span class="co1">// пробуем открыть</span><br />
&nbsp; <span class="re0">$handle</span> = @<span class="kw3">fopen</span><span class="br0">&#40;</span> <span class="st0">'./files/'</span>.<span class="re0">$filename</span>, <span class="st0">'rb'</span> <span class="br0">&#41;</span>;<br />
<br />
&nbsp; <span class="co1">// если не удалось</span><br />
&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span> !<span class="re0">$handle</span> <span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw3">header</span> <span class="br0">&#40;</span> <span class="st0">'HTTP/1.1 404 Not Found'</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="kw3">die</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp;<br />
&nbsp; <span class="co1">// если запрашивающий агент поддерживает докачку</span><br />
&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span> <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">'HTTP_RANGE'</span><span class="br0">&#93;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$range</span> = <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">'HTTP_RANGE'</span><span class="br0">&#93;</span>;<br />
&nbsp; &nbsp; <span class="re0">$range</span> = <span class="kw3">str_replace</span><span class="br0">&#40;</span> <span class="st0">'bytes='</span>, <span class="st0">''</span>, <span class="re0">$range</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="re0">$range</span> = <span class="kw3">str_replace</span><span class="br0">&#40;</span> <span class="st0">'-'</span>, <span class="st0">''</span>, <span class="re0">$range</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="co1">// смещаемся по файлу на нужное смещение</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="re0">$range</span> <span class="br0">&#41;</span> <span class="kw3">fseek</span><span class="br0">&#40;</span> <span class="re0">$handle</span>, <span class="re0">$range</span> <span class="br0">&#41;</span>;<br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp;<br />
&nbsp; <span class="co1">// если есть смещение</span><br />
&nbsp; <span class="kw1">if</span><span class="br0">&#40;</span> <span class="re0">$range</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw3">header</span><span class="br0">&#40;</span> <span class="st0">'HTTP/1.1 206 Partial Content'</span> <span class="br0">&#41;</span>;<br />
&nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw3">header</span><span class="br0">&#40;</span> <span class="st0">'HTTP/1.1 200 OK'</span> <span class="br0">&#41;</span>;<br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp;<br />
&nbsp; <span class="kw3">header</span><span class="br0">&#40;</span> <span class="st0">'Content-Disposition: attachment; filename=&quot;'</span>.<span class="re0">$filename</span>.<span class="st0">'&quot;'</span> <span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw3">header</span><span class="br0">&#40;</span> <span class="st0">'Last-Modified: '</span>.<span class="re0">$ftime</span> <span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw3">header</span><span class="br0">&#40;</span> <span class="st0">'Content-Length: '</span>.<span class="br0">&#40;</span><span class="re0">$fsize</span>-<span class="re0">$range</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw3">header</span><span class="br0">&#40;</span> <span class="st0">'Accept-Ranges: bytes'</span> <span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw3">header</span><span class="br0">&#40;</span> <span class="st0">'Content-Range: bytes '</span>.<span class="re0">$range</span>.<span class="st0">'-'</span>.<span class="br0">&#40;</span><span class="re0">$fsize</span> - <span class="nu0">1</span><span class="br0">&#41;</span>.<span class="st0">'/'</span>.<span class="re0">$fsize</span> <span class="br0">&#41;</span>;<br />
<br />
&nbsp; <span class="kw1">switch</span><span class="br0">&#40;</span> <span class="re0">$mimetype</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">'pdf'</span> : <span class="re0">$ctype</span> = <span class="st0">'application/pdf'</span>; <span class="kw1">break</span>;<br />
&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">'zip'</span> : <span class="re0">$ctype</span> = <span class="st0">'application/zip'</span>; <span class="kw1">break</span>;<br />
&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">'doc'</span> : <span class="re0">$ctype</span> = <span class="st0">'application/msword'</span>; <span class="kw1">break</span>;<br />
&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">'xls'</span> : <span class="re0">$ctype</span> = <span class="st0">'application/vnd.ms-excel'</span>; <span class="kw1">break</span>;<br />
&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">'gif'</span> : <span class="re0">$ctype</span> = <span class="st0">'image/gif'</span>; <span class="kw1">break</span>;<br />
&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">'png'</span> : <span class="re0">$ctype</span> = <span class="st0">'image/png'</span>; <span class="kw1">break</span>;<br />
&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">'jpeg'</span>:<br />
&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">'jpg'</span> : <span class="re0">$ctype</span> = <span class="st0">'image/jpg'</span>; <span class="kw1">break</span>;<br />
&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">'mp3'</span> : <span class="re0">$ctype</span> = <span class="st0">'audio/mpeg'</span>; <span class="kw1">break</span>;<br />
&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">'wav'</span> : <span class="re0">$ctype</span> = <span class="st0">'audio/x-wav'</span>; <span class="kw1">break</span>;<br />
&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">'mpeg'</span>:<br />
&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">'mpg'</span> :<br />
&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">'mpe'</span> : <span class="re0">$ctype</span> = <span class="st0">'video/mpeg'</span>; <span class="kw1">break</span>;<br />
&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">'mov'</span> : <span class="re0">$ctype</span> = <span class="st0">'video/quicktime'</span>; <span class="kw1">break</span>;<br />
&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">'avi'</span> : <span class="re0">$ctype</span> = <span class="st0">'video/x-msvideo'</span>; <span class="kw1">break</span>;<br />
&nbsp; &nbsp; <span class="kw2">default</span>&nbsp; &nbsp; : <span class="re0">$ctype</span> = <span class="st0">'application/octet-stream'</span>;<br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; <br />
&nbsp; <span class="kw3">header</span><span class="br0">&#40;</span> <span class="st0">'Content-Type: '</span>.<span class="re0">$ctype</span> <span class="br0">&#41;</span>;<br />
&nbsp;<br />
&nbsp; <span class="kw3">readfile</span><span class="br0">&#40;</span> <span class="st0">'./files/'</span>.<span class="re0">$filename</span> <span class="br0">&#41;</span>;<br />
&nbsp;<br />
&nbsp; <span class="kw3">fclose</span><span class="br0">&#40;</span> <span class="re0">$handle</span> <span class="br0">&#41;</span>;<br />
&nbsp; <br />
<span class="br0">&#125;</span><br />
&nbsp;<br />
<span class="kw2">?&gt;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.webmasterschool.ru/php/250/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Обработка значения NULL</title>
		<link>http://blog.webmasterschool.ru/mysql/248/</link>
		<comments>http://blog.webmasterschool.ru/mysql/248/#comments</comments>
		<pubDate>Sun, 10 May 2009 10:49:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://blog.webmasterschool.ru/?p=248</guid>
		<description><![CDATA[В синтаксисе SQL значение NULL занимает особое место - оно соответствует понятию &#8220;ничего&#8221;. Значение NULL не равно пустой строке или нулю, и эта особенность часто порождает ошибки. Рассмотрим несколько примеров:
SELECT NULL=FALSE;
SELECT NULL='';
SELECT NULL=0;
SELECT NULL=NULL;

Результатом всех запросов будет NULL. Это может выглядеть странно, но значение NULL не является значением в полном смысле слова: по определению оно [...]]]></description>
			<content:encoded><![CDATA[<p>В синтаксисе SQL значение NULL занимает особое место - оно соответствует понятию &#8220;ничего&#8221;. Значение NULL не равно пустой строке или нулю, и эта особенность часто порождает ошибки. Рассмотрим несколько примеров:</p>
<div class="codecolorer-container sql"><div class="codecolorer" style="font-family: monospace;"><span class="kw1">SELECT</span> <span class="kw1">NULL</span>=FALSE;<br />
<span class="kw1">SELECT</span> <span class="kw1">NULL</span>=<span class="st0">''</span>;<br />
<span class="kw1">SELECT</span> <span class="kw1">NULL</span>=<span class="nu0">0</span>;<br />
<span class="kw1">SELECT</span> <span class="kw1">NULL</span>=<span class="kw1">NULL</span>;</div></div>
<p><a href='http://blog.webmasterschool.ru/wp-content/uploads/2009/05/mysql_null.jpg' rel="lightbox" title="NULL значения"><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/05/mysql_null-300x207.jpg" alt="NULL значения" title="mysql_null" width="300" height="207" class="alignnone size-medium wp-image-249" /></a></p>
<p>Результатом всех запросов будет NULL. Это может выглядеть странно, но значение NULL не является значением в полном смысле слова: по определению оно означает отсутствие значения и не принадлежит ни одному типу данных. Поэтому NULL не равно ни логическому значению FALSE, ни пустой строке, ни нулю. При сравнении NULL с любым значением будет получен результат NULL, а не FALSE и не 0. Более того, NULL не равно NULL, и это иллюстрирует последний из приведенных запросов.</p>
<p>Если вы работаете со столбцом, в котором могут присутствовать значения NULL, необходимо учитывать следующее: нельзя использовать запросы вида</p>
<div class="codecolorer-container sql"><div class="codecolorer" style="font-family: monospace;"><span class="kw1">SELECT</span> * <span class="kw1">FROM</span> some_table <span class="kw1">WHERE</span> some_column = <span class="kw1">NULL</span>;<br />
<span class="kw1">SELECT</span> * <span class="kw1">FROM</span> some_table <span class="kw1">WHERE</span> some_column != <span class="kw1">NULL</span>;</div></div>
<p>Такие запросы не вернут ни одной строки. Используйте запросы вида</p>
<div class="codecolorer-container sql"><div class="codecolorer" style="font-family: monospace;"><span class="kw1">SELECT</span> * <span class="kw1">FROM</span> some_table <span class="kw1">WHERE</span> some_column <span class="kw1">IS</span> <span class="kw1">NULL</span>;<br />
<span class="kw1">SELECT</span> * <span class="kw1">FROM</span> some_table <span class="kw1">WHERE</span> some_column <span class="kw1">IS</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span>;</div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.webmasterschool.ru/mysql/248/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ограничение скорости скачивания файлов средствами PHP</title>
		<link>http://blog.webmasterschool.ru/php/247/</link>
		<comments>http://blog.webmasterschool.ru/php/247/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 11:21:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.webmasterschool.ru/?p=247</guid>
		<description><![CDATA[Допустим, у нас есть сайт, предоставляющий файлы для скачивания. Но для зарегистрированных пользователей нет никаких ограничений, а для остальных, чтобы не перегружать сервер, хотелось бы ввести некоторые ограничения. Причина для ограничения скорости скачивания может быть и иной: пользователь, оплативший скачивание без ограничений - получает файл на максимальной скорости, а тот, кто пожадничал - будет скачивать [...]]]></description>
			<content:encoded><![CDATA[<p>Допустим, у нас есть сайт, предоставляющий файлы для скачивания. Но для зарегистрированных пользователей нет никаких ограничений, а для остальных, чтобы не перегружать сервер, хотелось бы ввести некоторые ограничения. Причина для ограничения скорости скачивания может быть и иной: пользователь, оплативший скачивание без ограничений - получает файл на максимальной скорости, а тот, кто пожадничал - будет скачивать очень медленно. Посмотрим, как это можно реализовать с помощью PHP:</p>
<div class="codecolorer-container php" style="height:280px;"><div class="codecolorer" style="font-family: monospace;"><span class="kw2">&lt;?php</span><br />
<span class="co1">// лимит времени выполнения</span><br />
<span class="kw3">set_time_limit</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>;<br />
<br />
<span class="co1">// скорость скачивания - 128КБ в сек.</span><br />
<span class="re0">$speed</span> = <span class="nu0">1024</span>*<span class="nu0">128</span>;<br />
<span class="co1">// имя файла</span><br />
<span class="re0">$filename</span> = <span class="st0">'doc.pdf'</span>;<br />
<span class="co1">// размер файла</span><br />
<span class="re0">$filesize</span> = <span class="kw3">filesize</span><span class="br0">&#40;</span><span class="re0">$filename</span><span class="br0">&#41;</span>;<br />
<span class="co1">// смещение от начала файла</span><br />
<span class="re0">$range</span> = <span class="nu0">0</span>;<br />
<br />
<span class="kw1">while</span><span class="br0">&#40;</span> is_already_download<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; <span class="co1">// спим пока у пользователя есть активные потоки</span><br />
&nbsp; <span class="kw3">sleep</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
<br />
<span class="co1">// открываем файл на чтение</span><br />
<span class="re0">$f</span> = <span class="kw3">fopen</span><span class="br0">&#40;</span><span class="re0">$filename</span>, <span class="st0">'rb'</span><span class="br0">&#41;</span>;<br />
<br />
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">'HTTP_RANGE'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// поддерживается ли докачка </span><br />
&nbsp; <span class="re0">$range</span> = <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">'HTTP_RANGE'</span><span class="br0">&#93;</span>;<br />
&nbsp; <span class="re0">$range</span> = <span class="kw3">str_replace</span><span class="br0">&#40;</span><span class="st0">'bytes='</span>, <span class="st0">''</span>, <span class="re0">$range</span><span class="br0">&#41;</span>;<br />
&nbsp; <span class="re0">$range</span> = <span class="kw3">str_replace</span><span class="br0">&#40;</span><span class="st0">'-'</span>, <span class="st0">''</span>, <span class="re0">$range</span><span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$range</span><span class="br0">&#41;</span> <span class="kw3">fseek</span><span class="br0">&#40;</span><span class="re0">$f</span>, <span class="re0">$range</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
&nbsp;<br />
<span class="co1">// если есть смещение</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$range</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; <span class="kw3">header</span><span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">'SERVER_PROTOCOL'</span><span class="br0">&#93;</span>.<span class="st0">' 206 Partial Content'</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; <span class="kw3">header</span><span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">'SERVER_PROTOCOL'</span><span class="br0">&#93;</span>.<span class="st0">' 200 OK'</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw3">header</span><span class="br0">&#40;</span> <span class="st0">'Last-Modified: '</span>.<span class="kw3">date</span><span class="br0">&#40;</span><span class="st0">'D, d M Y H:i:s T'</span>, <span class="kw3">filemtime</span><span class="br0">&#40;</span><span class="re0">$filename</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>;<br />
<span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">'Content-Length: '</span>.<span class="br0">&#40;</span><span class="re0">$filesize</span>-<span class="re0">$range</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
<span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">'Accept-Ranges: bytes'</span><span class="br0">&#41;</span>;<br />
<span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">'Content-Range: bytes '</span>.<span class="re0">$range</span>.<span class="st0">'-'</span>.<span class="br0">&#40;</span><span class="re0">$filesize</span> - <span class="nu0">1</span><span class="br0">&#41;</span>.<span class="st0">'/'</span>.<span class="re0">$filesize</span><span class="br0">&#41;</span>;<br />
<span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">'Content-Type: application/pdf'</span><span class="br0">&#41;</span>;<br />
<span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">'Content-Disposition: attachment; filename=&quot;'</span>.<span class="re0">$filename</span>.<span class="st0">'&quot;'</span><span class="br0">&#41;</span>;<br />
<br />
<span class="kw1">while</span><span class="br0">&#40;</span> !<span class="kw3">feof</span><span class="br0">&#40;</span><span class="re0">$f</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; <span class="kw3">echo</span> <span class="kw3">fread</span><span class="br0">&#40;</span><span class="re0">$f</span>, <span class="re0">$speed</span><span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw3">flush</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw3">sleep</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>; <span class="co1">// засыпаем</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="co1">// закрываем файл</span><br />
<span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re0">$f</span><span class="br0">&#41;</span>;<br />
<br />
<span class="co1">// удаляем информацию о соединении из БД</span><br />
<span class="kw3">mysql_query</span><span class="br0">&#40;</span><span class="st0">&quot;DELETE FROM `sessions` WHERE `session_ip`='&quot;</span>.<span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">'REMOTE_ADDR'</span><span class="br0">&#93;</span>.<span class="st0">&quot;' LIMIT 1&quot;</span><span class="br0">&#41;</span>;<br />
<br />
<span class="kw2">function</span> is_already_download<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; <span class="co1">// проверяем на наличие соединений от пользователя</span><br />
&nbsp; <span class="re0">$res</span> = <span class="kw3">mysql_query</span><span class="br0">&#40;</span><span class="st0">&quot;SELECT `session_ip` FROM `sessions` WHERE `session_ip`='&quot;</span>.<span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">'REMOTE_ADDR'</span><span class="br0">&#93;</span>.<span class="st0">&quot;' LIMIT 1&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">mysql_num_rows</span><span class="br0">&#40;</span><span class="re0">$res</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;<br />
&nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span> <span class="co1">// если запись отсутствует, то добавляем</span><br />
&nbsp; &nbsp; <span class="kw3">mysql_query</span> <span class="br0">&#40;</span><span class="st0">&quot;INSERT INTO `sessions` VALUES ('&quot;</span>.<span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">'REMOTE_ADDR'</span><span class="br0">&#93;</span>.<span class="st0">&quot;')&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="kw2">?&gt;</span></div></div>
<p>Однако пользователь без привилегий может воспользоваться менеджером закачки, который позволяет скачивать файл в несколько потоков. Таким образом, он сможет без труда обойти наше ограничение. На этот случай есть функция is_already_download(), которая проверяет наличие уже установленных соединений.</p>
<p>В данном случае мы используем таблицу БД sessions,  в которй всего одно поле - IP-адрес скачивающего. При наличии IP-адреса скачивающего в таблице отдаем true, в противном случае записываем его и отдаем false.</p>
<p>Ссылки по теме:</p>
<ul>
<li><a href="http://blog.webmasterschool.ru/php/33/">Как отдать пользователю файл скриптом</a></li>
<li><a href="http://blog.webmasterschool.ru/php/7/">Как узнать сколько раз скачали файл?</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.webmasterschool.ru/php/247/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Восстановление разрушенных таблиц MySQL</title>
		<link>http://blog.webmasterschool.ru/mysql/245/</link>
		<comments>http://blog.webmasterschool.ru/mysql/245/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 10:53:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://blog.webmasterschool.ru/?p=245</guid>
		<description><![CDATA[Бывает, что файлы данных MySQL разрушаются и требуют восстановления. Проще всего проверить целостность таблицы путем выполнения команды
CHECK TABLE messages;
Это выражение проверит наличие ошибок в таблице messages. Если выходные данные выглядят подобно приведенным ниже, значит, таблица в порядке, и действия по ее восстановлению выполнять не нужно.

В некоторых случаях в столбце Msg_text появляются сообщения об ошибках. В [...]]]></description>
			<content:encoded><![CDATA[<p>Бывает, что файлы данных MySQL разрушаются и требуют восстановления. Проще всего проверить целостность таблицы путем выполнения команды</p>
<div class="codecolorer-container mysql" style="height:35px;"><div class="codecolorer" style="font-family: monospace;"><span class="kw1">CHECK</span> TABLE messages;</div></div>
<p>Это выражение проверит наличие ошибок в таблице <strong>messages</strong>. Если выходные данные выглядят подобно приведенным ниже, значит, таблица в порядке, и действия по ее восстановлению выполнять не нужно.</p>
<p><img src="http://blog.webmasterschool.ru/wp-content/uploads/2009/04/check-table.jpg" alt="" title="check-table" width="405" height="185" class="alignnone size-full wp-image-246" /></p>
<p>В некоторых случаях в столбце <strong>Msg_text</strong> появляются сообщения об ошибках. В этом случае надо выполнить команду <strong>REPAIR TABLE</strong>, и MySQL предпримет попытку устранить проблему.</p>
<p>Утилита <strong>myisamchk</strong>, поставляемая с MySQL, позволяет проверять и восстанавливать таблицы MyISAM, обеспечивая при этом более высокую степень гибкости по сравнению с командами SQL. Если при запуске <strong>myisamchk</strong> не указаны опции, данная программа лишь проверяет таблицу на наличие ошибок. Ряд опций командной строки позволяют получить дополнительную информацию или указать утилите на то, что необходимо начать процесс восстановления данных.</p>
<p>Файлы с таблицами MyISAM, проверяемые утилитой <strong>myisamchk</strong>, находятся в каталоге, предназначенном для хранения данных, и имеют расширение .MYI. Если данные размещены в каталоге <strong>/var/lib/mysql</strong>, вы можете проверить все таблицы в базе <strong>forum</strong> с помощью команды:</p>
<div class="codecolorer-container text" style="height:35px;">myisamchk /var/lib/mysql/forum/*.MYI</div>
<p>Как правило, для быстрой проверки используется опция <strong>-fast</strong>. Она указывает на то, что проверке подлежат лишь те таблицы, которые были закрыты не корректно.</p>
<p>Опция <strong>&#8211;medium-check</strong> задает более детальную проверку таблиц, при которой могут быть найдены разнообразные ошибки. Самая тщательная проверка осуществляется при указании опции <strong>&#8211;extend-check</strong>, но она выполняется очень медленно. Данная опция используется только в том случае, если <strong>&#8211;medium-check</strong> не позволяет выявить проблему.</p>
<p>После того, как вы выяснили, что таблица разрушена, можно приступить к ее восстановлению. Для этой цели служит опция <strong>&#8211;recover</strong>. Перед тем как пытаться восстановить таблицу с помощью <strong>myisamchk</strong>, вам надо остановить <strong>mysqld</strong>. Если сервер выполнит запись в таблицу в то время, когда осуществляются действия по ее восстановлению, результаты могут быть непредсказуемыми.</p>
<p>В некоторых случаях программа <strong>myisamchk</strong> сообщает о том, что в данном режиме она не может устранить проблему, и вам необходимо задать опцию <strong>&#8211;safe-recover</strong>. При указании этой опции осуществляются дополнительные операции по восстановлению данных, но работа существенно замедляется.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webmasterschool.ru/mysql/245/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Как избавиться от сообщений &#8220;headers already sent&#8221;</title>
		<link>http://blog.webmasterschool.ru/php/244/</link>
		<comments>http://blog.webmasterschool.ru/php/244/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 06:00:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.webmasterschool.ru/?p=244</guid>
		<description><![CDATA[Предположим, вы пытаетесь отправить HTTP-заголовок или cookie с помощью функции header(), session_start() или setcookie(), но PHP выдает сообщение &#8220;headers already sent&#8221; (&#8221;заголовки уже отправлены&#8221;). Эта ошибка возникает, если вы отправили содержимое браузеру до вызова функции header(), session_start() или setcookie(). PHP посылает заголовки автоматически, как только скрипт начинает выдавать браузеру информацию. Перепишите свой код так, чтобы [...]]]></description>
			<content:encoded><![CDATA[<p>Предположим, вы пытаетесь отправить HTTP-заголовок или cookie с помощью функции header(), session_start() или setcookie(), но PHP выдает сообщение &#8220;headers already sent&#8221; (&#8221;заголовки уже отправлены&#8221;). Эта ошибка возникает, если вы отправили содержимое браузеру до вызова функции header(), session_start() или setcookie(). PHP посылает заголовки автоматически, как только скрипт начинает выдавать браузеру информацию. Перепишите свой код так, чтобы вывод содержимого происходил после отправки заголовков:</p>
<div class="codecolorer-container php"><div class="codecolorer" style="font-family: monospace;"><span class="co1">// Правильно</span><br />
<span class="kw3">setcookie</span><span class="br0">&#40;</span><span class="st0">&quot;name&quot;</span>, <span class="re0">$name</span><span class="br0">&#41;</span>;<br />
<span class="kw3">echo</span> <span class="st0">&quot;Hello, $name&quot;</span>;</div></div>
<div class="codecolorer-container php"><div class="codecolorer" style="font-family: monospace;"><span class="co1">// Неправильно</span><br />
<span class="kw3">echo</span> <span class="st0">&quot;Hello, $name&quot;</span>;<br />
<span class="kw3">setcookie</span><span class="br0">&#40;</span><span class="st0">&quot;name&quot;</span>, <span class="re0">$name</span><span class="br0">&#41;</span>;</div></div>
<div class="codecolorer-container php"><div class="codecolorer" style="font-family: monospace;"><span class="co1">// Правильно</span><br />
<span class="kw2">&lt;?php</span> <span class="kw3">setcookie</span><span class="br0">&#40;</span><span class="st0">&quot;name&quot;</span>, <span class="re0">$name</span><span class="br0">&#41;</span>; <span class="kw2">?&gt;</span><br />
&lt;html&gt;&lt;title&gt;Hello&lt;/title&gt;</div></div>
<p>Любое HTTP-сообщение имеет заголовок и тело, которые отправляются браузеру именно в таком порядке. Начав отправку тела, вы больше не можете отправлять заголовки. Поэтому, если вы вызовете функцию setcookie() после вывода HTML-кода, PHP не сможет отправить надлежащий заголовок cookie.</p>
<p>Вы также должны убрать из подключеных файлов завершающие пробельные символы. Когда вы подключаете php-файл с пустыми строчками вне тегов &lt;?php ?&gt;, эти строчки отправляются браузеру.</p>
<p>Другой способ гарантировать отсутствие завершающих пробельных символов в подключаемом файле является отказ от использования закрывающего тега ?&gt;. Если подключаемый файл содержит только PHP-код, этот метод избавит вас от необходимости возвращаться к этому файлу и удалять из него нечаянно поставленные пробельные символы.</p>
<p>Если вы хотите полностью избавить себя от беспокойства по поводу пустых строчек, вызывающих отправку заголовков, включите буферизацию вывода. Она не позволит PHP немедленно отправлять вывод клиенту. Если вы буферизируете свой вывод, то можете перемешивать заголовки и текст сообщений. Однако в этом случае у пользователей может возникнуть впечатление, что ваш сервер медленно обслуживает их запросы, потому что браузер будет выводить содержимое на экран с некоторой задержкой.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webmasterschool.ru/php/244/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Получение страницы с удаленного хоста: как отправить файл cookie</title>
		<link>http://blog.webmasterschool.ru/php/243/</link>
		<comments>http://blog.webmasterschool.ru/php/243/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 08:57:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.webmasterschool.ru/?p=243</guid>
		<description><![CDATA[Допустим, нам надо получить страницу, которая требует, чтобы с запросом был послан файл cookie. Для этого воспользуемся расширением CURL:
&#60;?php
$c = curl_init&#40;'http://www.example.com/needs-cookie.php'&#41;;
curl_setopt&#40;$c, CURLOPT_COOKIE, 'user=evgenijj; activity=yes'&#41;;
curl_setopt&#40;$c, CURLOPT_RETURNTRANSFER, true&#41;;
$page = curl_exec&#40;$c&#41;;
curl_close&#40;$c&#41;;
?&#62;
Информация из cookie-файлов отправляется на сервер в заголовке Cookie. В рассмотреннном примере с помощью опции CURLOPT_COOKIE мы отправляем на сервер два элемента cookie: один с именем user и [...]]]></description>
			<content:encoded><![CDATA[<p>Допустим, нам надо получить страницу, которая требует, чтобы с запросом был послан файл cookie. Для этого воспользуемся расширением CURL:</p>
<div class="codecolorer-container php"><div class="codecolorer" style="font-family: monospace;"><span class="kw2">&lt;?php</span><br />
<span class="re0">$c</span> = curl_init<span class="br0">&#40;</span><span class="st0">'http://www.example.com/needs-cookie.php'</span><span class="br0">&#41;</span>;<br />
curl_setopt<span class="br0">&#40;</span><span class="re0">$c</span>, CURLOPT_COOKIE, <span class="st0">'user=evgenijj; activity=yes'</span><span class="br0">&#41;</span>;<br />
curl_setopt<span class="br0">&#40;</span><span class="re0">$c</span>, CURLOPT_RETURNTRANSFER, <span class="kw2">true</span><span class="br0">&#41;</span>;<br />
<span class="re0">$page</span> = curl_exec<span class="br0">&#40;</span><span class="re0">$c</span><span class="br0">&#41;</span>;<br />
curl_close<span class="br0">&#40;</span><span class="re0">$c</span><span class="br0">&#41;</span>;<br />
<span class="kw2">?&gt;</span></div></div>
<p>Информация из cookie-файлов отправляется на сервер в заголовке Cookie. В рассмотреннном примере с помощью опции <strong>CURLOPT_COOKIE</strong> мы отправляем на сервер два элемента cookie: один с именем <strong>user</strong> и значением <strong>evgenijj</strong>, а другой — с именем <strong>activity</strong> и значением <strong>yes</strong>.</p>
<p>Чтобы запросить страницу, которая устанавливает cookie, а затем отправлять ей запросы с информацией из cookie-файлов, можно использовать функциональность расширения CURL, называемую &#8220;cookie jar&#8221; (контейнер для cookie). При первом запросе указываем в опции <strong>CURLOPT_COOKIEJAR</strong> имя файла, в котором хранятся cookie. В последующих запросах указываем в опции <strong>CURLOPT_COOKIEFILE</strong> имя этого файла, и CURL будет читать элементы cookies из него и отправлять их в запросе. Это особенно удобно, когда вы отправляете серию запросов, в которой первый запрос попадает на сайт, устанавливающий cookie для сеанса или для аутентификации, а последующие запросы должны содержать информацию из cookie, чтобы считаться законными:</p>
<div class="codecolorer-container php" style="height:280px;"><div class="codecolorer" style="font-family: monospace;"><span class="kw2">&lt;?php</span><br />
<span class="co1">// Временный файл для хранения cookie</span><br />
<span class="re0">$cookie_jar</span> = <span class="kw3">tempnam</span><span class="br0">&#40;</span><span class="st0">'/tmp'</span>, <span class="st0">'cookie'</span><span class="br0">&#41;</span>;<br />
<br />
<span class="co1">// Войти в систему на сайте</span><br />
<span class="re0">$c</span> = curl_init<span class="br0">&#40;</span><span class="st0">'http://bank.example.com/login.php?user=donald&amp;pasword=qwerty'</span><span class="br0">&#41;</span>;<br />
curl_setopt<span class="br0">&#40;</span><span class="re0">$c</span>, CURLOPT_RETURNTRANSFER, <span class="kw2">true</span><span class="br0">&#41;</span>;<br />
curl_setopt<span class="br0">&#40;</span><span class="re0">$c</span>, CURLOPT_COOKIEJAR, <span class="re0">$cookie_jar</span><span class="br0">&#41;</span>;<br />
<span class="re0">$page</span> = curl_exec<span class="br0">&#40;</span><span class="re0">$c</span><span class="br0">&#41;</span>;<br />
curl_close<span class="br0">&#40;</span><span class="re0">$c</span><span class="br0">&#41;</span>;<br />
<br />
<span class="co1">// Получить информацию о балансе на счете</span><br />
<span class="re0">$c</span> = curl_init<span class="br0">&#40;</span><span class="st0">'http://bank.example.com/balance.php?account=checking'</span><span class="br0">&#41;</span>;<br />
curl_setopt<span class="br0">&#40;</span><span class="re0">$c</span>, CURLOPT_RETURNTRANSFER, <span class="kw2">true</span><span class="br0">&#41;</span>;<br />
curl_setopt<span class="br0">&#40;</span><span class="re0">$c</span>, CURLOPT_COOKIEJAR, <span class="re0">$cookie_jar</span><span class="br0">&#41;</span>;<br />
<span class="re0">$page</span> = curl_exec<span class="br0">&#40;</span><span class="re0">$c</span><span class="br0">&#41;</span>;<br />
curl_close<span class="br0">&#40;</span><span class="re0">$c</span><span class="br0">&#41;</span>;<br />
<br />
<span class="co1">// Внести вклад на счет</span><br />
<span class="re0">$c</span> = curl_init<span class="br0">&#40;</span><span class="st0">'http://bank.example.com/deposit.php'</span><span class="br0">&#41;</span>;<br />
curl_setopt<span class="br0">&#40;</span><span class="re0">$c</span>, CURLOPT_POST, <span class="kw2">true</span><span class="br0">&#41;</span>;<br />
curl_setopt<span class="br0">&#40;</span><span class="re0">$c</span>, CURLOPT_POSTFIELDS, <span class="st0">'account=checking&amp;amount=123.45'</span><span class="br0">&#41;</span>;<br />
curl_setopt<span class="br0">&#40;</span><span class="re0">$c</span>, CURLOPT_RETURNTRANSFER, <span class="kw2">true</span><span class="br0">&#41;</span>;<br />
curl_setopt<span class="br0">&#40;</span><span class="re0">$c</span>, CURLOPT_COOKIEJAR, <span class="re0">$cookie_jar</span><span class="br0">&#41;</span>;<br />
<span class="re0">$page</span> = curl_exec<span class="br0">&#40;</span><span class="re0">$c</span><span class="br0">&#41;</span>;<br />
curl_close<span class="br0">&#40;</span><span class="re0">$c</span><span class="br0">&#41;</span>;<br />
<br />
<span class="co1">// Удалить &quot;cookie jar&quot;</span><br />
<span class="kw3">unlink</span><span class="br0">&#40;</span><span class="re0">$cookie_jar</span><span class="br0">&#41;</span>;<br />
<span class="kw2">?&gt;</span></div></div>
<p>Ссылки по теме:</p>
<ul>
<li><a href="http://webi.ru/webi_articles/6_7_f.html">Передача данных из скрипта методом POST</a></li>
<li><a href="http://webmasterschool.ru/articles/article57.php">Библиотека CURL (Client URL Library)</a></li>
<li><a href="http://webmasterschool.ru/notes/note12.php">Использование CURL</a></li>
<li><a href="http://ru2.php.net/manual/ru/ref.curl.php">Функции CURL, Client URL Library</a></li>
<li><a href="http://blog.webmasterschool.ru/php/13/">Отправка данных из скрипта методом POST</a></li>
<li><a href="http://blog.webmasterschool.ru/php/112/">Загрузка файла на сервер с использованием CURL</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.webmasterschool.ru/php/243/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Создание PDF средствами PHP. Часть 3</title>
		<link>http://blog.webmasterschool.ru/php/236/</link>
		<comments>http://blog.webmasterschool.ru/php/236/#comments</comments>
		<pubDate>Mon, 22 Dec 2008 07:11:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.webmasterschool.ru/?p=236</guid>
		<description><![CDATA[Необходимо заметить, что документ сначала создается в буфере и лишь потом, при вызове метода Output(), выводится в браузер. Поэтому общая схема работы с документом следующая: создаем в буфере документ методом Open(), затем добавляем в этот документ страничку методом AddPage(), формируем содержимое документа различными методами типа Cell(), Write(), Image() и, наконец, выводим его из буфера в [...]]]></description>
			<content:encoded><![CDATA[<p>Необходимо заметить, что документ сначала создается в буфере и лишь потом, при вызове метода Output(), выводится в браузер. Поэтому общая схема работы с документом следующая: создаем в буфере документ методом Open(), затем добавляем в этот документ страничку методом AddPage(), формируем содержимое документа различными методами типа Cell(), Write(), Image() и, наконец, выводим его из буфера в браузер.</p>
<p><strong>Метод Cell()</strong> выводит ячейку (прямоугольная область) с заданными границами, цветом фона и строкой. Верхний левый угол ячейки соответствует текущей позиции. Текст может быть выровнен. После вызова этого метода текущая позиция перемещается вправо или на следующую строку. Возможно задать ссылку на текст.</p>
<div class="codecolorer-container html4strict" style="height:35px;"><div class="codecolorer" style="font-family: monospace;">Cell(float w [, float h [, string txt [, mixed border [, int ln [, string align [, int fill [, mixed link]]]]]]])</div></div>
<p><strong>Метод Write()</strong> выводит текст от текущей позиции. При достижении правой границы (или встрече символа \n) строка обрывается и текст продолжает выводиться с левого края. После выполнения текущая позиция остается в конце текста. Возможно выведение ссылки в тексте.</p>
<div class="codecolorer-container html4strict" style="height:35px;"><div class="codecolorer" style="font-family: monospace;">Write(float h, string txt [, mixed link])</div></div>
<p><strong>Метод Image()</strong> выводит изображение на страницу. Поддерживаемые форматы: JPEG и PNG. Должен быть задан верхний левый угол. Размеры могут быть заданы разными вариантами:</p>
<ul>
<li>прямое задание ширины и высоты изображения (выраженные в единицах, заданных пользователем)</li>
<li>один размер задается, а другой будет вычислен автоматически с сохранением пропорций оригинала</li>
<li>ни один размер не задается, в этом случае изображение будет выведено с разрешением 72 dpi.</li>
</ul>
<div class="codecolorer-container html4strict" style="height:35px;"><div class="codecolorer" style="font-family: monospace;">Image(string file, float x, float y [, float w [, float h [, string type [, mixed link]]]])</div></div>
<p><strong>Метод Ln()</strong> выполняет разрыв строки. Текущая абсцисса возвращается к левому краю страницы, а ордината увеличивается на величину, указанную в параметре.</p>
<div class="codecolorer-container html4strict" style="height:35px;"><div class="codecolorer" style="font-family: monospace;">Ln([float h])</div></div>
<p><strong>Meтод Output()</strong> выводит документ в строку, локальный файл или в браузер. Если нужно, то сначала будет вызван <strong>метод Close()</strong> для закрытия документа.</p>
<div class="codecolorer-container html4strict" style="height:35px;"><div class="codecolorer" style="font-family: monospace;">string Output([string name [, string dest]])</div></div>
<ul>
<li><a href="http://blog.webmasterschool.ru/examples/fpdf/makepdf.php" target="_blank">Посмотреть рабочий пример</a></li>
<li><a href="http://blog.webmasterschool.ru/examples/fpdf/fpdf.zip">Скачать исходные коды</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.webmasterschool.ru/php/236/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Создание PDF средствами PHP. Часть 2</title>
		<link>http://blog.webmasterschool.ru/php/235/</link>
		<comments>http://blog.webmasterschool.ru/php/235/#comments</comments>
		<pubDate>Fri, 19 Dec 2008 09:42:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.webmasterschool.ru/?p=235</guid>
		<description><![CDATA[А теперь попробуем создать PDF-файл, используя класс FPDF. Для начала создадим файл makepdf.php, который будет осуществлять вывод PDF документа прямо в браузер. В одной папке с этим файлом поместим файл класса fpdf.php и папку font с вложенными в нее файлами кириллических шрифтов.
&#60;?php
define&#40;'FPDF_FONTPATH', 'font/'&#41;;
require 'fpdf.php';
// Создадаем экземпляр класса
$pdf = new FPDF&#40;&#41;;
$pdf-&#62;Open&#40;&#41;;
//Подключаем кириллические шрифты
$pdf-&#62; AddFont&#40;'ArialMT','','arial.php'&#41;;
$pdf-&#62; AddFont&#40;'Arial-BoldMT','','arialbd.php'&#41;;
$pdf-&#62; AddFont&#40;'Arial-ItalicMT','','ariali.php'&#41;;
$pdf-&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>А теперь попробуем создать PDF-файл, используя класс FPDF. Для начала создадим файл makepdf.php, который будет осуществлять вывод PDF документа прямо в браузер. В одной папке с этим файлом поместим файл класса fpdf.php и папку font с вложенными в нее файлами кириллических шрифтов.</p>
<div class="codecolorer-container php" style="height:280px;"><div class="codecolorer" style="font-family: monospace;"><span class="kw2">&lt;?php</span><br />
<span class="kw3">define</span><span class="br0">&#40;</span><span class="st0">'FPDF_FONTPATH'</span>, <span class="st0">'font/'</span><span class="br0">&#41;</span>;<br />
<span class="kw1">require</span> <span class="st0">'fpdf.php'</span>;<br />
<span class="co1">// Создадаем экземпляр класса</span><br />
<span class="re0">$pdf</span> = <span class="kw2">new</span> FPDF<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="re0">$pdf</span>-&gt;<span class="me1">Open</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="co1">//Подключаем кириллические шрифты</span><br />
<span class="re0">$pdf</span>-&gt; <span class="me1">AddFont</span><span class="br0">&#40;</span><span class="st0">'ArialMT'</span>,<span class="st0">''</span>,<span class="st0">'arial.php'</span><span class="br0">&#41;</span>;<br />
<span class="re0">$pdf</span>-&gt; <span class="me1">AddFont</span><span class="br0">&#40;</span><span class="st0">'Arial-BoldMT'</span>,<span class="st0">''</span>,<span class="st0">'arialbd.php'</span><span class="br0">&#41;</span>;<br />
<span class="re0">$pdf</span>-&gt; <span class="me1">AddFont</span><span class="br0">&#40;</span><span class="st0">'Arial-ItalicMT'</span>,<span class="st0">''</span>,<span class="st0">'ariali.php'</span><span class="br0">&#41;</span>;<br />
<span class="re0">$pdf</span>-&gt; <span class="me1">AddFont</span><span class="br0">&#40;</span><span class="st0">'Arial-BoldItalicMT'</span>,<span class="st0">''</span>,<span class="st0">'arialbi.php'</span><span class="br0">&#41;</span>;<br />
<span class="co1">// Добавляем страницу в документ</span><br />
<span class="re0">$pdf</span>-&gt;<span class="me1">AddPage</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="co1">// Задаем режим отображения</span><br />
<span class="re0">$pdf</span>-&gt;<span class="me1">SetDisplayMode</span><span class="br0">&#40;</span><span class="st0">'real'</span>,<span class="st0">'default'</span><span class="br0">&#41;</span>;<br />
<span class="co1">// Устанавливаем шрифт и его размер</span><br />
<span class="re0">$pdf</span>-&gt; <span class="me1">SetFont</span><span class="br0">&#40;</span><span class="st0">'Arial-BoldMT'</span>,<span class="st0">''</span>,<span class="nu0">22</span><span class="br0">&#41;</span>;<br />
<span class="co1">// Устанавливаем цвет текста заголовка (красный)</span><br />
<span class="re0">$pdf</span>-&gt;<span class="me1">SetTextColor</span><span class="br0">&#40;</span><span class="nu0">255</span>,<span class="nu0">0</span>,<span class="nu0">0</span><span class="br0">&#41;</span>;<br />
<span class="co1">// Устанавливаем цвет заливки (желтый)</span><br />
<span class="re0">$pdf</span>-&gt;<span class="me1">SetFillColor</span><span class="br0">&#40;</span><span class="nu0">255</span>,<span class="nu0">255</span>,<span class="nu0">0</span><span class="br0">&#41;</span>;<br />
<span class="co1">// Задаем абсциссу и ординату текущей позиции</span><br />
<span class="re0">$pdf</span>-&gt;<span class="me1">SetXY</span><span class="br0">&#40;</span><span class="nu0">20</span>,<span class="nu0">20</span><span class="br0">&#41;</span>;<br />
<span class="co1">// Устанавливаем цвет для рисования контура вокруг заголовка (красный)</span><br />
<span class="re0">$pdf</span>-&gt;<span class="me1">SetDrawColor</span><span class="br0">&#40;</span><span class="nu0">255</span>,<span class="nu0">0</span>,<span class="nu0">0</span><span class="br0">&#41;</span>;<br />
<span class="co1">// Выводим ячейку (прямоугольную область), которая будет заголовком:</span><br />
<span class="co1">// 100 - ширина ячейки; 10 - высота ячейки;</span><br />
<span class="co1">// $text - текст; 1 - толщина рамки;</span><br />
<span class="co1">// 1 - текущая позиция после вывода ячейки будет в начале следующей строки;</span><br />
<span class="co1">// 'C' - выравнивание по центру; 1 - заливка фона ячейки</span><br />
<span class="re0">$text</span> = <span class="st0">'ЗАО &quot;Рога и копыта&quot;'</span>;<br />
<span class="re0">$pdf</span>-&gt;<span class="me1">Cell</span><span class="br0">&#40;</span><span class="nu0">150</span>, <span class="nu0">10</span>, <span class="re0">$text</span>, <span class="nu0">1</span>, <span class="nu0">1</span>, <span class="st0">'C'</span>, <span class="nu0">1</span><span class="br0">&#41;</span>;<br />
<span class="co1">// Вставляем изображение, которое будет ссылкой</span><br />
<span class="re0">$pdf</span>-&gt;<span class="me1">Image</span><span class="br0">&#40;</span><span class="st0">'elephpant.jpg'</span>,<span class="nu0">10</span>,<span class="nu0">35</span>,<span class="nu0">0</span>,<span class="nu0">0</span>,<span class="st0">'JPG'</span>,<span class="st0">'http://www.php.net/'</span><span class="br0">&#41;</span>;<br />
<span class="co1">// Устанавливаем шрифт для текста</span><br />
<span class="re0">$pdf</span>-&gt; <span class="me1">SetFont</span><span class="br0">&#40;</span><span class="st0">'ArialMT'</span>,<span class="st0">''</span>,<span class="nu0">12</span><span class="br0">&#41;</span>;<br />
<span class="co1">// Устанавливаем позицию начала текста</span><br />
<span class="re0">$pdf</span>-&gt;<span class="me1">SetXY</span> <span class="br0">&#40;</span><span class="nu0">10</span>,<span class="nu0">140</span><span class="br0">&#41;</span>;<br />
<span class="co1">// Устанавливаем цвет текста</span><br />
<span class="re0">$pdf</span>-&gt;<span class="me1">SetTextColor</span><span class="br0">&#40;</span><span class="nu0">10</span>,<span class="nu0">10</span>,<span class="nu0">10</span><span class="br0">&#41;</span>;<br />
<span class="re0">$pdf</span>-&gt;<span class="me1">Write</span><span class="br0">&#40;</span><span class="nu0">5</span>,<span class="st0">'Пешеходов&nbsp; надо&nbsp; любить.&nbsp; Пешеходы&nbsp; составляют&nbsp; большую&nbsp; часть&nbsp; человечества.&nbsp; Мало&nbsp; того&nbsp; —&nbsp; лучшую&nbsp; его&nbsp; часть.&nbsp; Пешеходы&nbsp; создали&nbsp; мир.&nbsp; Это&nbsp; они&nbsp; построили&nbsp; города,&nbsp; возвели&nbsp; многоэтажные&nbsp; здания,&nbsp; провели канализацию&nbsp; и&nbsp; водопровод, замостили улицы и осветили их электрическими лампами.'</span><span class="br0">&#41;</span>;<br />
<span class="co1">// Устанавливаем шрифт для текста</span><br />
<span class="re0">$pdf</span>-&gt; <span class="me1">SetFont</span><span class="br0">&#40;</span><span class="st0">'Arial-ItalicMT'</span>,<span class="st0">''</span>,<span class="nu0">12</span><span class="br0">&#41;</span>;<br />
<span class="re0">$pdf</span>-&gt;<span class="me1">Write</span><span class="br0">&#40;</span><span class="nu0">5</span>,<span class="st0">'Это они распространили культуру по всему свету, изобрели книгопечатание, выдумали порох, перебросили мосты через реки, расшифровали египетские иероглифы, ввели в употребление безопасную бритву, уничтожили торговлю рабами и установили, что из бобов сои можно изготовить сто четырнадцать вкусных питательных блюд.'</span><span class="br0">&#41;</span>;<br />
<span class="co1">// Разрыв строки</span><br />
<span class="re0">$pdf</span>-&gt;<span class="me1">Ln</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="re0">$pdf</span>-&gt;<span class="me1">Ln</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="co1">// Устанавливаем шрифт для текста</span><br />
<span class="re0">$pdf</span>-&gt; <span class="me1">SetFont</span><span class="br0">&#40;</span><span class="st0">'Arial-BoldMT'</span>,<span class="st0">''</span>,<span class="nu0">12</span><span class="br0">&#41;</span>;<br />
<span class="co1">// Устанавливаем цвет текста (синий)</span><br />
<span class="re0">$pdf</span>-&gt;<span class="me1">SetTextColor</span><span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">255</span><span class="br0">&#41;</span>;<br />
<span class="re0">$pdf</span>-&gt;<span class="me1">MultiCell</span><span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">5</span>,<span class="st0">'И когда все было готово, когда родная планета приняла сравнительно благоустроенный вид, появились автомобилисты.'</span>,<span class="nu0">1</span>,<span class="st0">'R'</span>,<span class="nu0">1</span><span class="br0">&#41;</span>;<br />
<span class="co1">// Разрыв строки</span><br />
<span class="re0">$pdf</span>-&gt;<span class="me1">Ln</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="re0">$pdf</span>-&gt;<span class="me1">Ln</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="co1">// Устанавливаем шрифт для текста</span><br />
<span class="re0">$pdf</span>-&gt; <span class="me1">SetFont</span><span class="br0">&#40;</span><span class="st0">'Arial-BoldItalicMT'</span>,<span class="st0">''</span>,<span class="nu0">12</span><span class="br0">&#41;</span>;<br />
<span class="co1">// Устанавливаем цвет текста (зеленый)</span><br />
<span class="re0">$pdf</span>-&gt;<span class="me1">SetTextColor</span><span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">200</span>,<span class="nu0">0</span><span class="br0">&#41;</span>;<br />
<span class="re0">$pdf</span>-&gt;<span class="me1">MultiCell</span><span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">5</span>,<span class="st0">'Надо заметить, что автомобиль тоже был изобретен пешеходами. Но автомобилисты об этом как-то сразу забыли. Кротких и умных пешеходов стали давить. Улицы, созданные пешеходами, перешли во власть автомобилистов. Мостовые стали вдвое шире, тротуары сузились до размера табачной бандероли. И пешеходы стали испуганно жаться к стенам домов.'</span>,<span class="nu0">0</span>,<span class="st0">'J'</span>,<span class="nu0">0</span><span class="br0">&#41;</span>;<br />
<span class="co1">// Выводим созданный документ в браузер</span><br />
<span class="re0">$pdf</span>-&gt;<span class="me1">Output</span><span class="br0">&#40;</span><span class="st0">'example.pdf'</span>,<span class="st0">'I'</span><span class="br0">&#41;</span>;<br />
<span class="kw2">?&gt;</span></div></div>
<p>Конструктор FPDF принимает следующие параметры:</p>
<ul>
<li>Ориентация страницы: P — книжная, L — альбомная; по умолчанию P</li>
<li>Единица измерения: pt — точка, mm — миллиметр, cm — санатиметр, in — дюйм; по умолчанию mm</li>
<li>Размер документа: A3, A4, A5, Letter, Legal или специальный формат, выраженный в виде массива из двух элементов: ширина и высота</li>
</ul>
<p>После создания экземпляра класса необходимо указать используемые шрифты. Так как кириллический Arial не является в классе FPDF шрифтом, установленным по умолчанию, сначала надо подключить его при помощи метода AddFont().</p>
<div class="codecolorer-container html4strict" style="height:35px;"><div class="codecolorer" style="font-family: monospace;">AddFont(string family [, string style [, string file]])</div></div>
<p>Первым аргументом мы указываем наименование шрифта. Его можно посмотреть в сгенерированном РНР файле (значение переменной $name). Второй аргумент — форматирование текста (B — Bold, I — Italic и смешанный BI или IB). Если аргумент пустой, то шрифт обычный. Третий аргумент — РНР файл описания. Теперь эти шрифты можно применять в данном документе. </p>
<p>Размер шрифта установим методом SetFont(). Этот метод можно вызывать несколько раз в одном скрипте, в то время как добавление AddFont() делается один раз для каждого шрифта. Формат записи SetFont() следующий:</p>
<div class="codecolorer-container html4strict" style="height:35px;"><div class="codecolorer" style="font-family: monospace;">SetFont(string family [, string style [, float size]])</div></div>
<p>Как видите, у функции SetFont() три параметра: название шрифта, стиль (пустая строка&nbsp;— обычный шрифт, B&nbsp;— жирный, I&nbsp;— курсив, U&nbsp;— подчеркнутый ) и размер. Этот метод может быть вызван до создания первой страницы и заданный шрифт будет сохраняться от страницы к странице. Если нужно изменить только размер шрифта, проще будет вызвать метод SetFontSize().</p>
<p>Используя функцию SetTextColor(), устанавливаем цвет шрифта документа. Цвет может быть представлен в RGB или grey scale. В нашем примере мы используем RGB-значения.</p>
<p>Продолжение следует&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webmasterschool.ru/php/235/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Создание PDF средствами PHP. Часть 1</title>
		<link>http://blog.webmasterschool.ru/php/234/</link>
		<comments>http://blog.webmasterschool.ru/php/234/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 13:16:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.webmasterschool.ru/?p=234</guid>
		<description><![CDATA[Класс FPDF является чистым PHP кодом и легко подключается к скриптам командой include() или require(). Скачать класс и ознакомиться с документацией (в том числе на русском языке) можно на сайте www.fpdf.org.
Основная проблема при использовании класса — файлы кириллических шрифтов. Одним из основных форматов шрифтов является TTF (True Type Font). Но для правильной работы FPDF необходим [...]]]></description>
			<content:encoded><![CDATA[<p>Класс FPDF является чистым PHP кодом и легко подключается к скриптам командой include() или require(). Скачать класс и ознакомиться с документацией (в том числе на русском языке) можно на сайте <a href="http://www.fpdf.org/" target="_blank">www.fpdf.org</a>.</p>
<p>Основная проблема при использовании класса — файлы кириллических шрифтов. Одним из основных форматов шрифтов является TTF (True Type Font). Но для правильной работы FPDF необходим и еще один формат — AFM (файл метрики шрифта). В этом нам поможет утилита <a href="http://ttf2pt1.sourceforge.net/" target="_blank">ttf2pt1</a>, которая позволяет создать файл метрики для True Type.</p>
<p>Запускаем утилиту из командной строки (Пуск->Выполнить->cmd):</p>
<div class="codecolorer-container html4strict" style="height:35px;"><div class="codecolorer" style="font-family: monospace;">C:\ttf2pt1 -A C:\fonts\arial.ttf arial</div></div>
<p>где ключ <strong>-A</strong> указывает на необходимость сформировать файл AFM, <strong>C:\fonts\arial.ttf</strong> — адрес файла True Type шрифта и, наконец, <strong>arial</strong> — это имя файла метрики.</p>
<p>Следующий шаг — генерация файла описания шрифта. Вместе с классом FPDF поставляется скрипт <strong>font/makefont/makefont.php</strong> для решения этой задачи. Использовать его просто. Для этого создаем РНР файл (скажем, mf.php):</p>
<div class="codecolorer-container php"><div class="codecolorer" style="font-family: monospace;"><span class="kw2">&lt;?php</span><br />
<span class="kw1">require</span><span class="br0">&#40;</span><span class="st0">'font/makefont/makefont.php'</span><span class="br0">&#41;</span>;<br />
MakeFont<span class="br0">&#40;</span><span class="st0">'arial.ttf'</span>,<span class="st0">'arial.afm'</span>,<span class="st0">'cp1251'</span><span class="br0">&#41;</span>;<br />
MakeFont<span class="br0">&#40;</span><span class="st0">'arialbd.ttf'</span>,<span class="st0">'arialbd.afm'</span>,<span class="st0">'cp1251'</span><span class="br0">&#41;</span>;<br />
MakeFont<span class="br0">&#40;</span><span class="st0">'ariali.ttf'</span>,<span class="st0">'ariali.afm'</span>,<span class="st0">'cp1251'</span><span class="br0">&#41;</span>;<br />
MakeFont<span class="br0">&#40;</span><span class="st0">'arialbi.ttf'</span>,<span class="st0">'arialbi.afm'</span>,<span class="st0">'cp1251'</span><span class="br0">&#41;</span>;<br />
<span class="kw2">?&gt;</span></div></div>
<p>Функция MakeFont имеет следующий формат:</p>
<div class="codecolorer-container php" style="height:35px;"><div class="codecolorer" style="font-family: monospace;">MakeFont<span class="br0">&#40;</span>string fontfile, string afmfile <span class="br0">&#91;</span>, string enc <span class="br0">&#91;</span>, <span class="kw3">array</span> patch <span class="br0">&#91;</span>, string type<span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div></div>
<p>где <strong>fontfile</strong> — путь к TTF или PFB файлу, <strong>afmfile</strong> — путь к AFM файлу, <strong>enc</strong> — имя используемой кодировки (по умолчанию это cp1252), <strong>patch</strong> — опциональное изменение кодировки и <strong>type</strong> — тип шрифта (по умолчанию True Type).</p>
<p>Запустив скрипт mf.php в браузере, получим файлы arial.php, arialbd.php, ariali.php, arialbi.php и arial.z, arialbd.z, ariali.z, arialbi.z. Все эти файлы вместе с файлами arial.ttf, arialbd.ttf, ariali.ttf, arialbi.ttf надо поместить в директорию font класса. Впрочем, можно самому указать директорию, которая будет хранить шрифты. Для этого нужно определить константу <strong>FPDF_FONTPATH</strong>:</p>
<div class="codecolorer-container php" style="height:35px;"><div class="codecolorer" style="font-family: monospace;"><span class="kw3">define</span><span class="br0">&#40;</span><span class="st0">'FPDF_FONTPATH'</span>,<span class="st0">'font/'</span><span class="br0">&#41;</span>;</div></div>
<p>Продолжение следует&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webmasterschool.ru/php/234/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

