<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Шпаргалки в RSS</title>
<link>http://tips.php.com.ua/</link>
<atom:link href="http://tips.php.com.ua/rss/" rel="self" type="application/rss+xml" />
<language>ru</language>
<description>tips.php.com.ua в RSS. Маленькие кусочки кода, и приемы которые облегчают жизнь разработчика</description>
<managingEditor>admin@php.com.ua (http://php.com.ua)</managingEditor>
<webMaster>admin@php.com.ua (http://php.com.ua)</webMaster>
<copyright>http://php.com.ua</copyright>
<lastBuildDate>Sat, 01 Nov 2008 15:25:48 +0700</lastBuildDate>
<generator>http://php.com.ua</generator>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<item>
<title>Два хака для любимого IDE</title>
<link>http://tips.php.com.ua/topic/71/</link>
<description><![CDATA[<style type="text/css"></style>
<img src="/uploads/users/1/1232184740.png" align="left" alt="Zend Studio for Eclipse" border="0" hspace="10px" vspace="10px"> <br>Работая в своем любимом IDE недавно столкнулся с двумя довольно неприятными вещами, первое это отсутствие outline у проекта, а вотарая пробема связана с SVN плагинами - которые после обновления вообще не захотели работать. <cut><br><br>И так начнем все по порядку.<br><br><h3>Проект без outline</h3><br>Для тех кто не в курсе что такое outline в ZSfE - это такая штука где показываются все функции, классы и их методы которые встречаются в вашем коде, очень удобная штука особенно для больших проектов.<br><br>Проблема наблюдается если вы не создаете проект с нуля а присоединяетесь к разработке выкачивая исходники из репозитария - в этом случае ZSfE даже не подозревает что вы работаете с проектом на PHP и соответственно не создает для него такой нужный нам outline.<br><br>Данная проблема решается редактированием файла .project который находится в папке с кодом который вы выкачали.<br><br>Содержимое файла выглядит вот так<br><br><pre><code class="xml"><div class="xml xml" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span></div></li>
<li class="li1"><div class="de1"><span class="sc3"><span class="re1">&lt;projectDescription<span class="re2">&gt;</span></span></span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;name<span class="re2">&gt;</span></span></span>eTv_front<span class="sc3"><span class="re1">&lt;/name<span class="re2">&gt;</span></span></span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;comment<span class="re2">&gt;</span></span><span class="re1">&lt;/comment<span class="re2">&gt;</span></span></span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;projects<span class="re2">&gt;</span></span></span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/projects<span class="re2">&gt;</span></span></span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;buildSpec<span class="re2">&gt;</span></span></span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/buildSpec<span class="re2">&gt;</span></span></span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;natures<span class="re2">&gt;</span></span></span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/natures<span class="re2">&gt;</span></span></span></div></li>
<li class="li1"><div class="de1"><span class="sc3"><span class="re1">&lt;/projectDescription<span class="re2">&gt;</span></span></span></div></li>
</ol></div></code></pre><br><br>Для того что бы ZSfE начала понимать что наш проект на php <b>нужно изменить секцию natures</b><br><pre><code class="xml"><div class="xml xml" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="sc3"><span class="re1">&lt;natures<span class="re2">&gt;</span></span></span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;nature<span class="re2">&gt;</span></span></span>org.zend.php.framework.ZendFrameworkNature<span class="sc3"><span class="re1">&lt;/nature<span class="re2">&gt;</span></span></span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;nature<span class="re2">&gt;</span></span></span>org.eclipse.php.core.PHPNature<span class="sc3"><span class="re1">&lt;/nature<span class="re2">&gt;</span></span></span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/natures<span class="re2">&gt;</span></span></span></div></li>
</ol></div></code></pre><br><br>Первая строчка говорит о том что в проекте используется Zend Framework - если вы разрабатываете свой проект без использования этого фреймворка то эта строчка не нужна.<br><br>После изменения файла необходимо перезапустить IDE.<br><br><h3>Обновление SVN плагинов</h3><br>Для того что бы нормально работать с SVN сервером версии 1.5 необходимо обновить плагины которые использует ZSfE, после обновления и перезапуска IDE вы скорее всего увидете ошибку типа вот этой <br><pre><code class="html"><div class="html xml" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">An error occurred while automatically activating bundle org.eclipse.team.svn.ui</div></li>
</ol></div></code></pre><br>причина этой ошибке в том что ZSfE сохраняет настройки для работы с плагинами SVN в папке проекта <b>.settings</b> и в папке <b>.metadata</b> где хранятся настройки рабочего пространства (workspace).<br><br>Выход из этой ситуации довольно простой.<br><ul><li> Сделайте SVN commit всех ваших изменений внешним SVN клиентом</li><li> Удалите все файлы внутри папки <b>.metadata</b></li><li> Запустите Zend Studio 6.1</li><li> Сделайте импорт файлов с диска (File - Import)</li><li> Выберите General - "Existing Projects into Workspace"</li><li> Проверьте что все ваши проекты успешно добавились</li><li> Наслаждайтесь работой ;-)</li></ul>]]></description>
<pubDate>Sat, 17 Jan 2009 12:03:23 +0700</pubDate>
<guid isPermaLink="true">http://tips.php.com.ua/topic/71/</guid>
</item>
<item>
<title>Чтение информации с радио-серверов</title>
<link>http://tips.php.com.ua/topic/58/</link>
<description><![CDATA[<style type="text/css">/**
* GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
* (http://qbnz.com/highlighter/ and http://geshi.org/)
*/
.php.php .de1, .php.php .de2 {font-family: monospace; font-weight: normal; font-style: normal; margin:0; padding:0; background:inherit;color: #000020;}
.php.php  {color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em}
.php.php a:link {color: #000060;}
.php.php a:hover {background-color: #f0f000;}
.php.php .imp {font-weight: bold; color: red;}
.php.php li, .php.php .li1 {font-weight: normal;}
.php.php .ln {width:1px;font-weight: normal;text-align:right;margin:0;padding:0 2px;}
.php.php .kw1 {color: #b1b100;}
.php.php .kw2 {color: #000000; font-weight: bold;}
.php.php .kw3 {color: #990000;}
.php.php .co1 {color: #666666; font-style: italic;}
.php.php .co2 {color: #666666; font-style: italic;}
.php.php .co3 {color: #0000cc; font-style: italic;}
.php.php .co4 {color: #0000ff; font-style: italic;}
.php.php .coMULTI {color: #666666; font-style: italic;}
.php.php .es_h {color: #000099; font-weight: bold;}
.php.php .es_h {color: #000099; font-weight: bold;}
.php.php .br0 {color: #009900;}
.php.php .sy0 {color: #339933;}
.php.php .st0 {color: #0000ff;}
.php.php .st_h {color: #0000ff;}
.php.php .nu0 {color: #cc66cc;}
.php.php .nu8 {color: #208080;}
.php.php .nu12 {color: #208080;}
.php.php .nu19 {color:#800080;}
.php.php .me1 {color: #004000;}
.php.php .me2 {color: #004000;}
.php.php .re0 {color: #000088;}
.php.php span.xtra { display:block; }
</style>
<img src="/uploads/users/1/1226662973.png" align="left" alt="shoutcast" border="0" hspace="10px" vspace="10px"> Я думаю, многие пользователи локальных сетей и сети Интернет хоть раз в жизни сталкивались с радио-серверами на базе SHOUTcast, к которым можно приконнектится винампом и спокойно слушать музыку. И у некоторых из этих пользователей возникала мысль о том, как прочитать информацию с этих серверов. И если перед вами эта статья, то по-видимому вас тоже такая мысль посещала. <cut><br><br>Итак перейдем конкретно к изучению возможностей SHOUTcast-сервера. Если мы в винампе нажмем Ctrl+L и введем адрес радио сервера (например http://www.some-server.com:8000), то мы получим обычный звуковой поток, а если мы этот же адрес введем в каком-нибудь из браузеров, то нам откроется страничка с некоторой информацией с радио сервера, такой как: количество слушателей в данный момент, максимальное количество пользователей, битрейт, название текущей композиции, историю проигранных композиций и т.д.<br><br>Всё бы хорошо, но многим бы хотелось эту информацию видеть не в виде стандартной страницы, генерируемой радио-сервером, а в виде страницы с собственным дизайном и наполнением.<br><br>Далее я приведу конкретно скрипт, читающий информацию с радио сервера. Я попытался как можно более подробно расставить комментарии, поэтому надеюсь ни у кого вопросов возникнуть не должно.<br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="kw2">&lt;?php</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="re0">$to</span> <span class="sy0">=</span> <span class="nu19">0.05</span>; &nbsp;<span class="co1">// таймаут для открытия сокета</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw2">function</span> radio<span class="br0">&#40;</span><span class="re0">$radio</span><span class="sy0">,</span><span class="re0">$port</span><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="kw3">global</span> <span class="re0">$to</span>; &nbsp;<span class="co1">// объявляем переменную $to внутри функции</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; <span class="sy0">@</span><span class="re0">$fs</span><span class="sy0">=</span><span class="kw3">fsockopen</span><span class="br0">&#40;</span><span class="re0">$radio</span><span class="sy0">,</span><span class="re0">$port</span><span class="sy0">,</span><span class="re0">$err1</span><span class="sy0">,</span><span class="re0">$err2</span><span class="sy0">,</span><span class="re0">$to</span><span class="br0">&#41;</span>; &nbsp;<span class="co1">// открываем сокет на радио сервер</span></div></li>
<li class="li1"><div class="de1">&nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$fs</span><span class="br0">&#41;</span> &nbsp;<span class="co1">// если сокет открыт, то…</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="co1">// этим заголовком мы даем серверу понять то, что мы браузер а не какой-то там винамп ;) , и читаем содержимое главной страницы</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw3">fputs</span><span class="br0">&#40;</span><span class="re0">$fs</span><span class="sy0">,</span><span class="st0">&quot;GET / HTTP/1.0<span class="es0">\r</span><span class="es0">\n</span>User-Agent: Mozilla/2.0<span class="es0">\r</span><span class="es0">\n</span><span class="es0">\r</span><span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="re0">$d</span><span class="sy0">=</span><span class="kw3">fgets</span><span class="br0">&#40;</span><span class="re0">$fs</span><span class="br0">&#41;</span>; <span class="re0">$d</span><span class="sy0">=</span><span class="kw3">fgets</span><span class="br0">&#40;</span><span class="re0">$fs</span><span class="br0">&#41;</span>; <span class="re0">$d</span><span class="sy0">=</span><span class="kw3">fgets</span><span class="br0">&#40;</span><span class="re0">$fs</span><span class="br0">&#41;</span>; <span class="re0">$d</span><span class="sy0">=</span><span class="kw3">fgets</span><span class="br0">&#40;</span><span class="re0">$fs</span><span class="br0">&#41;</span>; &nbsp;<span class="co1">// читаем строку с содержимым главной страницы</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">strpos</span><span class="br0">&#40;</span><span class="re0">$d</span><span class="sy0">,</span><span class="st0">&quot;Server is currently down&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> &nbsp;<span class="co1">// если находим строку &quot;Server is currently down&quot;, то делаем вывод, что сервер выключен</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;&lt;font face=<span class="es0">\&quot;</span>Verdana<span class="es0">\&quot;</span> style=<span class="es0">\&quot;</span>font-size: 11px;<span class="es0">\&quot;</span>&gt;</span></div></li>
<li class="li1"><div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp;Радио &lt;a href=<span class="es0">\&quot;</span>http://$radio:$port<span class="es0">\&quot;</span> style=<span class="es0">\&quot;</span>color: #ff0000<span class="es0">\&quot;</span> target=<span class="es0">\&quot;</span>_blank<span class="es0">\&quot;</span>&gt;&lt;b&gt;$radio:$port&lt;/b&gt;&lt;/a&gt;:</span></div></li>
<li class="li1"><div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp;</span></div></li>
<li class="li1"><div class="de1"><span class="st0">В данный момент сервер не запущен</span></div></li>
<li class="li1"><div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp;&lt;/font&gt;&quot;</span>; &nbsp;<span class="co1">// сообщаем пользователю о том что сервер выключен</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">else</span> &nbsp;<span class="co1">// в противном случае делаем вывод о том, что сервер включен</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; <span class="re0">$pos</span><span class="sy0">=</span><span class="kw3">strpos</span><span class="br0">&#40;</span><span class="re0">$d</span><span class="sy0">,</span><span class="st0">&quot;kbps with&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; <span class="re0">$pos1</span><span class="sy0">=</span><span class="kw3">strpos</span><span class="br0">&#40;</span><span class="re0">$d</span><span class="sy0">,</span><span class="st0">&quot; &quot;</span><span class="sy0">,</span><span class="re0">$pos</span><span class="sy0">+</span><span class="nu0">10</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; <span class="co1">// ищем и запоминаем информацию б количестве активных пользователей</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; <span class="re0">$d</span><span class="sy0">=</span><span class="kw3">substr</span><span class="br0">&#40;</span><span class="re0">$d</span><span class="sy0">,</span><span class="re0">$pos</span><span class="sy0">+</span><span class="nu0">10</span><span class="sy0">,</span><span class="re0">$pos1</span><span class="sy0">-</span><span class="re0">$pos</span><span class="sy0">-</span><span class="nu0">10</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; <span class="sy0">@</span><span class="re0">$fp</span><span class="sy0">=</span><span class="kw3">fsockopen</span><span class="br0">&#40;</span><span class="re0">$radio</span><span class="sy0">,</span><span class="re0">$port</span><span class="sy0">,</span><span class="re0">$err1</span><span class="sy0">,</span><span class="re0">$err2</span><span class="sy0">,</span><span class="re0">$to</span><span class="br0">&#41;</span>; &nbsp;<span class="co1">// открываем новый сокет</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$fp</span><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// опять говорим серверу, что мы браузер и читаем содержимое страницы с историей композиций - played.html</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fputs</span><span class="br0">&#40;</span><span class="re0">$fp</span><span class="sy0">,</span><span class="st0">&quot;GET /played.html HTTP/1.0<span class="es0">\r</span><span class="es0">\n</span>User-Agent: Mozilla/2.0<span class="es0">\r</span><span class="es0">\n</span><span class="es0">\r</span><span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$s</span><span class="sy0">=</span><span class="kw3">fgets</span><span class="br0">&#40;</span><span class="re0">$fp</span><span class="br0">&#41;</span>; <span class="re0">$s</span><span class="sy0">=</span><span class="kw3">fgets</span><span class="br0">&#40;</span><span class="re0">$fp</span><span class="br0">&#41;</span>; <span class="re0">$s</span><span class="sy0">=</span><span class="kw3">fgets</span><span class="br0">&#40;</span><span class="re0">$fp</span><span class="br0">&#41;</span>; <span class="re0">$s</span><span class="sy0">=</span><span class="kw3">fgets</span><span class="br0">&#40;</span><span class="re0">$fp</span><span class="br0">&#41;</span>; &nbsp;<span class="co1">// переходим к строке с необходимой информацией</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$pos</span><span class="sy0">=</span><span class="kw3">strpos</span><span class="br0">&#40;</span><span class="re0">$s</span><span class="sy0">,</span><span class="st0">&quot;&lt;td&gt;Played @&lt;/td&gt;&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$pos</span><span class="sy0">=</span><span class="kw3">strpos</span><span class="br0">&#40;</span><span class="re0">$s</span><span class="sy0">,</span><span class="st0">&quot;&lt;tr&gt;&lt;td&gt;&quot;</span><span class="sy0">,</span><span class="re0">$pos</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$pos</span><span class="sy0">=</span><span class="kw3">strpos</span><span class="br0">&#40;</span><span class="re0">$s</span><span class="sy0">,</span><span class="st0">&quot;&lt;/td&gt;&lt;td&gt;&quot;</span><span class="sy0">,</span><span class="re0">$pos</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$pos1</span><span class="sy0">=</span><span class="kw3">strpos</span><span class="br0">&#40;</span><span class="re0">$s</span><span class="sy0">,</span><span class="st0">&quot;&lt;td&gt;&quot;</span><span class="sy0">,</span><span class="re0">$pos</span><span class="sy0">+</span><span class="nu0">9</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$s</span><span class="sy0">=</span><span class="kw3">substr</span><span class="br0">&#40;</span><span class="re0">$s</span><span class="sy0">,</span><span class="re0">$pos</span><span class="sy0">+</span><span class="nu0">9</span><span class="sy0">,</span><span class="re0">$pos1</span><span class="sy0">-</span><span class="re0">$pos</span><span class="sy0">-</span><span class="nu0">9</span><span class="br0">&#41;</span>; &nbsp;<span class="co1">// ищем и читаем информацию об активной композиции</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$gt</span> <span class="sy0">=</span> <span class="kw3">explode</span><span class="br0">&#40;</span><span class="st0">&quot;&gt;&quot;</span><span class="sy0">,</span> <span class="re0">$s</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$gt</span><span class="br0">&#91;</span><span class="nu19">0</span><span class="br0">&#93;</span> <span class="sy0">==</span> <span class="st0">&quot;AD&quot;</span><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$s</span> <span class="sy0">=</span> <span class="st0">&quot;ничего не играет&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span> &nbsp;<span class="co1">// если активной композиции нет, делаем вывод о том, что ничего не играет</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">print</span> <span class="st0">&quot;&lt;font face=<span class="es0">\&quot;</span>Verdana<span class="es0">\&quot;</span> style=<span class="es0">\&quot;</span>font-size: 11px;<span class="es0">\&quot;</span>&gt;</span></div></li>
<li class="li1"><div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;Радио &lt;a href=<span class="es0">\&quot;</span>http://$radio:$port<span class="es0">\&quot;</span> target=<span class="es0">\&quot;</span>_blank<span class="es0">\&quot;</span> style=<span class="es0">\&quot;</span>color: #ff0000<span class="es0">\&quot;</span> target=<span class="es0">\&quot;</span>_blank<span class="es0">\&quot;</span>&gt;&lt;b&gt;$radio:$port&lt;/b&gt;&lt;/a&gt;:&lt;p&gt;</span></div></li>
<li class="li1"><div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;Сейчас на радио: &lt;b&gt;$s&lt;/b&gt;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;Слушателей: &lt;b&gt;$d&lt;/b&gt;&lt;p&gt;</span></div></li>
<li class="li1"><div class="de1"><span class="st0"> &nbsp; &nbsp; &nbsp; &nbsp;&lt;/b&gt;Подключиться к радио: &lt;a href=<span class="es0">\&quot;</span>http://$radio:$port/listen.pls<span class="es0">\&quot;</span> target=<span class="es0">\&quot;</span>_blank<span class="es0">\&quot;</span>&gt;&lt;b&gt;listen.pls&lt;/b&gt;&lt;/a&gt;&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// выводим информацию</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="kw1">else</span> &nbsp;<span class="co1">// если нам не удалось открыть сокет, делаем вывод о том, что сервер не запущен</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw3">print</span> <span class="st0">&quot;&lt;font face=<span class="es0">\&quot;</span>Verdana<span class="es0">\&quot;</span> style=<span class="es0">\&quot;</span>font-size: 11px;<span class="es0">\&quot;</span>&gt;</span></div></li>
<li class="li1"><div class="de1"><span class="st0"> &nbsp; &nbsp;Радио &lt;a href=<span class="es0">\&quot;</span>http://$radio:$port<span class="es0">\&quot;</span> style=<span class="es0">\&quot;</span>color: #ff0000<span class="es0">\&quot;</span> target=<span class="es0">\&quot;</span>_blank<span class="es0">\&quot;</span>&gt;&lt;b&gt;$radio:$port&lt;/b&gt;&lt;/a&gt;:</span></div></li>
<li class="li1"><div class="de1"><span class="st0"> &nbsp; &nbsp;</span></div></li>
<li class="li1"><div class="de1"><span class="st0">В данный момент сервер не запущен</span></div></li>
<li class="li1"><div class="de1"><span class="st0"> &nbsp; &nbsp;&lt;/font&gt;&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="kw1">return</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">radio<span class="br0">&#40;</span><span class="st0">&quot;172.25.137.71&quot;</span><span class="sy0">,</span><span class="st0">&quot;8000&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="kw3">print</span> <span class="st0">&quot;&lt;hr width=<span class="es0">\&quot;</span>100%<span class="es0">\&quot;</span> size=<span class="es0">\&quot;</span>1<span class="es0">\&quot;</span> color=<span class="es0">\&quot;</span>#7E2B01<span class="es0">\&quot;</span>&gt;&quot;</span>;</div></li>
<li class="li1"><div class="de1">radio<span class="br0">&#40;</span><span class="st0">&quot;172.25.136.30&quot;</span><span class="sy0">,</span><span class="st0">&quot;8000&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// так вызывается функция</span></div></li>
<li class="li1"><div class="de1"><span class="kw2">?&gt;</span></div></li>
</ol></div></code></pre><br><br>Вот и вся программа. Как вы заметили, моя программа читает только информацию об количестве слушателей и активной композиции, но я думаю вам теперь не составит труда по надобности добавить сюда еще что-нибудь. Успехов!<br><br><h3>P.S. тестировалось с SHOUTcast-сервером версии 1.9.2</h3>]]></description>
<pubDate>Fri, 14 Nov 2008 13:46:43 +0700</pubDate>
<guid isPermaLink="true">http://tips.php.com.ua/topic/58/</guid>
</item>
<item>
<title>Разбор RSS файла на примере новостей с php.net</title>
<link>http://tips.php.com.ua/topic/57/</link>
<description><![CDATA[<style type="text/css">/**
* GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
* (http://qbnz.com/highlighter/ and http://geshi.org/)
*/
.php.php .de1, .php.php .de2 {font-family: monospace; font-weight: normal; font-style: normal; margin:0; padding:0; background:inherit;color: #000020;}
.php.php  {color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em}
.php.php a:link {color: #000060;}
.php.php a:hover {background-color: #f0f000;}
.php.php .imp {font-weight: bold; color: red;}
.php.php li, .php.php .li1 {font-weight: normal;}
.php.php .ln {width:1px;font-weight: normal;text-align:right;margin:0;padding:0 2px;}
.php.php .kw1 {color: #b1b100;}
.php.php .kw2 {color: #000000; font-weight: bold;}
.php.php .kw3 {color: #990000;}
.php.php .co1 {color: #666666; font-style: italic;}
.php.php .co2 {color: #666666; font-style: italic;}
.php.php .co3 {color: #0000cc; font-style: italic;}
.php.php .co4 {color: #0000ff; font-style: italic;}
.php.php .coMULTI {color: #666666; font-style: italic;}
.php.php .es_h {color: #000099; font-weight: bold;}
.php.php .es_h {color: #000099; font-weight: bold;}
.php.php .br0 {color: #009900;}
.php.php .sy0 {color: #339933;}
.php.php .st0 {color: #0000ff;}
.php.php .st_h {color: #0000ff;}
.php.php .nu0 {color: #cc66cc;}
.php.php .nu8 {color: #208080;}
.php.php .nu12 {color: #208080;}
.php.php .nu19 {color:#800080;}
.php.php .me1 {color: #004000;}
.php.php .me2 {color: #004000;}
.php.php .re0 {color: #000088;}
.php.php span.xtra { display:block; }
</style>
<img src="/uploads/users/1/1226662576.png" align="left" alt="RSS" border="0" hspace="10px" vspace="10px">На многих сайтах сейчас можно встретить такую надпись:<br><blockquote>Наша лента новостей (фид) в формате RSS доступна по адресу - http://server/export/rss.xml</blockquote> Это означает что разработчики сайта не поленились и сделали "человеческий экспорт новостей". Теперь если Вы захотите отображать чьи то новости у себя на сайте - то можете сделать это очень просто. <cut><br><br><br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="co1">// кешируем RSS файлик</span></div></li>
<li class="li1"><div class="de1"><span class="co1">// место куда пишем файлик кэша</span></div></li>
<li class="li1"><div class="de1"><span class="re0">$filename</span> <span class="sy0">=</span> <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'DOCUMENT_ROOT'</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;/cache/phpnews.rss&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// проверяем насколько старый файлик</span></div></li>
<li class="li1"><div class="de1"><span class="re0">$modif</span><span class="sy0">=</span><span class="kw3">time</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-@</span><span class="kw3">filemtime</span> <span class="br0">&#40;</span><span class="st0">&quot;$filename&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// если в кэше нет файла или он слишком старый - обновляем</span></div></li>
<li class="li1"><div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">file_exists</span><span class="br0">&#40;</span><span class="re0">$filename</span><span class="br0">&#41;</span> || <span class="re0">$modif</span><span class="sy0">&gt;</span><span class="st0">&quot;3600&quot;</span><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="re0">$rss</span> <span class="sy0">=</span> <span class="kw3">file_get_contents</span><span class="br0">&#40;</span><span class="st0">&quot;http://www.php.net/news.rss&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="re0">$handle</span> <span class="sy0">=</span> <span class="kw3">fopen</span> <span class="br0">&#40;</span><span class="st0">&quot;$filename&quot;</span><span class="sy0">,</span> <span class="st0">&quot;w&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re0">$handle</span><span class="sy0">,</span> <span class="re0">$rss</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re0">$handle</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// подключаем либу из набора PEAR для разбора rss</span></div></li>
<li class="li1"><div class="de1"><span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st0">&quot;XML/RSS.php&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="re0">$rss</span> <span class="sy0">=&amp;</span> <span class="kw2">new</span> XML_RSS<span class="br0">&#40;</span><span class="st0">&quot;$filename&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="re0">$rss</span><span class="sy0">-&gt;</span><span class="me1">parse</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$rss</span><span class="sy0">-&gt;</span><span class="me1">getItems</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re0">$value</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//VAR_DUMP($value); exit; &nbsp;//- это так на всякий случай если надо посмотреть что там лежит :-)</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// формируем строку с новостями</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$page</span> <span class="sy0">=</span> <span class="re0">$page</span><span class="sy0">.</span><span class="st0">&quot;&lt;b&gt;&quot;</span><span class="sy0">.</span><span class="re0">$value</span><span class="br0">&#91;</span><span class="st_h">'dc:date'</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;&lt;/b&gt;&lt;a href=<span class="es0">\&quot;</span>&quot;</span><span class="sy0">.</span><span class="re0">$value</span><span class="br0">&#91;</span><span class="st_h">'link'</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;<span class="es0">\&quot;</span> class=<span class="es0">\&quot;</span>menu<span class="es0">\&quot;</span>&gt;&quot;</span><span class="sy0">.</span><span class="st0">&quot; &quot;</span><span class="sy0">.</span><span class="re0">$value</span><span class="br0">&#91;</span><span class="st_h">'title'</span><span class="br0">&#93;</span><span class="sy0">.</span> <span class="st0">&quot;&lt;/a&gt;</span></div></li>
<li class="li1"><div class="de1"><span class="st0">&quot;</span> <span class="sy0">.</span><span class="re0">$value</span><span class="br0">&#91;</span><span class="st_h">'description'</span><span class="br0">&#93;</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span> &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// выводим все что получили</span></div></li>
<li class="li1"><div class="de1"><span class="kw3">echo</span><span class="st0">&quot;$page&quot;</span>;</div></li>
</ol></div></code></pre><br>В данном скрипте продемонстрирована основная идея работы с XML-RSS новостными файлами, которую при большом желании можно развить до неимоверных размеров. :-)<br><br>Если у вас есть возможность использовать PHP5 тогда чтение RSS файлов становится еще проще. Для этого мы используем Simple XML.<br><br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="co1">// кешируем RSS файлик</span></div></li>
<li class="li1"><div class="de1"><span class="co1">// место куда пишем файлик кэша</span></div></li>
<li class="li1"><div class="de1"><span class="re0">$filename</span> <span class="sy0">=</span> <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'DOCUMENT_ROOT'</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;/cache/phpnews.rss&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// проверяем насколько старый файлик</span></div></li>
<li class="li1"><div class="de1"><span class="re0">$modif</span><span class="sy0">=</span><span class="kw3">time</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-@</span><span class="kw3">filemtime</span> <span class="br0">&#40;</span><span class="st0">&quot;$filename&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// если в кэше нет файла или он слишком старый - обновляем</span></div></li>
<li class="li1"><div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">file_exists</span><span class="br0">&#40;</span><span class="re0">$filename</span><span class="br0">&#41;</span> || <span class="re0">$modif</span><span class="sy0">&gt;</span><span class="st0">&quot;3600&quot;</span><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="re0">$rss</span> <span class="sy0">=</span> <span class="kw3">file_get_contents</span><span class="br0">&#40;</span><span class="st0">&quot;http://www.php.net/news.rss&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="re0">$handle</span> <span class="sy0">=</span> <span class="kw3">fopen</span> <span class="br0">&#40;</span><span class="st0">&quot;$filename&quot;</span><span class="sy0">,</span> <span class="st0">&quot;w&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re0">$handle</span><span class="sy0">,</span> <span class="re0">$rss</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re0">$handle</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// читаем файлик с помощью Simple XML</span></div></li>
<li class="li1"><div class="de1"><span class="re0">$RSS</span> <span class="sy0">=</span> simplexml_load_file<span class="br0">&#40;</span><span class="re0">$filename</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// для любопытных что жк мы там получили :-)</span></div></li>
<li class="li1"><div class="de1"><span class="co1">//VAR_DUMP($RSS);</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$RSS</span><span class="sy0">-&gt;</span><span class="me1">channel</span><span class="sy0">-&gt;</span><span class="me1">item</span> <span class="kw1">as</span> <span class="re0">$item</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// при надобности перекодируем полученные данные в нужную кодировку</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">//$item-&gt;description = iconv(&quot;UTF-8&quot;,&quot;WINDOWS-1251&quot;,$item-&gt;description); </span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">//$item-&gt;title &nbsp; &nbsp; &nbsp; = iconv(&quot;UTF-8&quot;,&quot;WINDOWS-1251&quot;,$item-&gt;title); </span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">//формируем ссылку и выводим данные &nbsp; </span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;&lt;a href=<span class="es0">\&quot;</span>&quot;</span><span class="sy0">.</span><span class="re0">$item</span><span class="sy0">-&gt;</span><span class="me1">link</span><span class="sy0">.</span><span class="st0">&quot;<span class="es0">\&quot;</span>&gt;&quot;</span><span class="sy0">.</span><span class="re0">$item</span><span class="sy0">-&gt;</span><span class="me1">title</span><span class="sy0">.</span><span class="st0">&quot;&lt;/a&gt;</span></div></li>
<li class="li1"><div class="de1"><span class="st0">$item-&gt;description</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="st0">&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
</ol></div></code></pre>]]></description>
<pubDate>Fri, 14 Nov 2008 13:36:44 +0700</pubDate>
<guid isPermaLink="true">http://tips.php.com.ua/topic/57/</guid>
</item>
<item>
<title>Что делать, если не работают те или иные функции.</title>
<link>http://tips.php.com.ua/topic/52/</link>
<description><![CDATA[<style type="text/css">/**
* GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
* (http://qbnz.com/highlighter/ and http://geshi.org/)
*/
.php.php .de1, .php.php .de2 {font-family: monospace; font-weight: normal; font-style: normal; margin:0; padding:0; background:inherit;color: #000020;}
.php.php  {color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em}
.php.php a:link {color: #000060;}
.php.php a:hover {background-color: #f0f000;}
.php.php .imp {font-weight: bold; color: red;}
.php.php li, .php.php .li1 {font-weight: normal;}
.php.php .ln {width:1px;font-weight: normal;text-align:right;margin:0;padding:0 2px;}
.php.php .kw1 {color: #b1b100;}
.php.php .kw2 {color: #000000; font-weight: bold;}
.php.php .kw3 {color: #990000;}
.php.php .co1 {color: #666666; font-style: italic;}
.php.php .co2 {color: #666666; font-style: italic;}
.php.php .co3 {color: #0000cc; font-style: italic;}
.php.php .co4 {color: #0000ff; font-style: italic;}
.php.php .coMULTI {color: #666666; font-style: italic;}
.php.php .es_h {color: #000099; font-weight: bold;}
.php.php .es_h {color: #000099; font-weight: bold;}
.php.php .br0 {color: #009900;}
.php.php .sy0 {color: #339933;}
.php.php .st0 {color: #0000ff;}
.php.php .st_h {color: #0000ff;}
.php.php .nu0 {color: #cc66cc;}
.php.php .nu8 {color: #208080;}
.php.php .nu12 {color: #208080;}
.php.php .nu19 {color:#800080;}
.php.php .me1 {color: #004000;}
.php.php .me2 {color: #004000;}
.php.php .re0 {color: #000088;}
.php.php span.xtra { display:block; }
</style>
<h1>У меня не работает функция, что делать?</h1><br><br>Посмотреть есть ли она у вас вообще, например этим скриптом.<br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="kw2">&lt;?php</span></div></li>
<li class="li1"><div class="de1"><span class="re0">$modules</span><span class="sy0">=</span><span class="kw3">get_loaded_extensions</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$modules</span> <span class="kw1">as</span> <span class="re0">$module</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="re0">$functions</span><span class="sy0">=</span><span class="kw3">get_extension_funcs</span><span class="br0">&#40;</span><span class="re0">$module</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">echo</span> <span class="st0">&quot;&lt;h5&gt;&quot;</span><span class="sy0">.</span><span class="re0">$module</span><span class="sy0">.</span><span class="st0">&quot;&lt;/h5&gt;&lt;ol&gt;&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$functions</span> <span class="kw1">as</span> <span class="re0">$func</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="kw3">echo</span> <span class="st0">&quot;&lt;li&gt;&quot;</span><span class="sy0">.</span><span class="re0">$func</span><span class="sy0">.</span><span class="st0">&quot;&lt;/li&gt;&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">echo</span> <span class="st0">&quot;&lt;/ol&gt;&quot;</span>;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="kw2">?&gt;</span></div></li>
</ol></div></code></pre><br>Если её здесь не будет, значит нужно перекомпилировать PHP с поддержкой нужных библиотек или загрузить дополнительные модули под Windows.<br><br>В любом случае, когда пишите функции, добавляйте следующие конструкции к функциям которые потенциально могут не работать:<br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="kw2">&lt;?php</span></div></li>
<li class="li1"><div class="de1"><span class="re0">$link</span> <span class="sy0">=</span> <span class="kw3">mysql_connect</span><span class="br0">&#40;</span><span class="st0">&quot;localhost:/var/lib/mysql.sock&quot;</span><span class="sy0">,</span> <span class="st0">&quot;phptester&quot;</span><span class="sy0">,</span> <span class="st0">&quot;musTdie&quot;</span><span class="br0">&#41;</span> </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; or <span class="kw3">die</span><span class="br0">&#40;</span><span class="st_h">'PHP encountered problems while trying to connect to MySQL at localhost'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="kw2">?&gt;</span></div></li>
</ol></div></code></pre><br>тогда Вы потом не будете дебагить функции mysql_select_db(), mysql_query() недоумевая почему они не работают, когда скрипт не смог даже подсоединииться к базе.<br><br>Это касается не только функций работы с базами, но и многих других.]]></description>
<pubDate>Mon, 03 Nov 2008 10:43:14 +0700</pubDate>
<guid isPermaLink="true">http://tips.php.com.ua/topic/52/</guid>
</item>
<item>
<title>Что такое Техническое задание?</title>
<link>http://tips.php.com.ua/topic/51/</link>
<description><![CDATA[Материал любезно предоставлен Юрием Шеляевыма оригинал заметки находится на <a href="http://yuri.shilyaev.com/" target="_blank">сайте</a> автора.<br><blockquote><h3>Согласно Большой Советской Энциклопедии:</h3>Техническое задание (ТЗ), исходный документ для проектирования сооружения или промышленного комплекса, конструирования технического устройства (прибора, машины, системы управления и т. д.) либо проведения научно-исследовательских работ (НИР). ТЗ содержит технико-экономическое обоснование разработки, основные технические требования, предъявляемые к сооружению или изделию, и исходные данные для разработки; в ТЗ указываются назначение объекта, область его применения, стадии разработки конструкторской документации, её состав, сроки исполнения и т. д., а также особые требования, обусловленные спецификой самого объекта либо условиями его эксплуатации. Как правило, ТЗ составляют на основе анализа результатов предварительных исследований, расчётов и моделирования.</blockquote>При разработке сайта, программного средства или любого ПО составление ТЗ—обязательный и необходимый процесс.<cut><br><br>Думаю, что все компании когда-либо создававшие не то что программное обеспечение, а даже простой сайт сталкиваются с проблемой недоговоренности с Заказчиком. ТЗ—это и есть такая договоренность. В какой-то мере Техническое задание—это описанный образ еще не существующей системы.<br><br>Прежде чем описать образ его надо представить себе—разработать или спроектировать.<blockquote><h3>Вот какое определение “проектирования” дает нам Яндекс:</h3><br>Проектирование (от лат. projectus, буквально – брошенный вперёд), процесс создания проекта – прототипа, прообраза предполагаемого или возможного объекта, состояния.</blockquote>Создание ТЗ—это проектирование. Т.е. создание прообраза.<br>Однако, описание чего бы то ни было процесс не такой простой. Описание предполагает рассмотрение образа с разных сторон, структуризация накопленных наблюдений и составление их в общую картину. Попробуйте написать ТЗ на чайник! Казалось бы—простая вещь, а не знаешь с какой стороны подойти…<br><br>Сталкиваясь в своей повседневной практике с вопросами написания ТЗ должен сказать, что одним из лучших помощников для составления документации до сих пор остается старый добрый ГОСТ. Хочется отметить, что сейчас (а может так было всегда) в университетах не достаточно прививают практику использования ГОСТов.<strong> Мучают их всеми – это да! А вот научить, чтобы пользовались...</strong> Бытует стереотип, что ГОСТ—это старо и не современно. Но если вы используете <a href="http://www.abn.ru/inf/setevoi/cycle.shtml" target="_blank">каскадный метод разработки</a>, то думать тут нечего—берите ГОСТ.<br><br>В проектировании и составлении Технического задания на разработку сайтов и веб-систем мы сейчас используем <a href="http://www.dev4masses.com/docs/gosts/34-602-89.html" target="_blank">ГОСТ 34.602-89—Техническое задание на создание автоматизированной системы.</a> Как-нибудь я постараюсь выложить ссылки на ГОСТы по составлению проектной документации.<br><br>Естественно, что данный ГОСТ устарел и не подходит целиком для веб-систем. Однако, общие постулаты очень хорошо расставляют все по полочкам в голове. Можно смело удалять половину требований (особенно, что касается различных “требований к транспортабельности для подвижных АС”), а вот кое-что придется дописать самостоятельно. Например, там не написано в каком конкретно разделе указывать разрешения браузеров...<blockquote><h3>В каком случае составлять ТЗ? В любом!</h3></blockquote>Если это большой сайт, то без ТЗ можно просто довольно быстро запутаться что и как. В любом сайте больше 20 страниц (100-500) может быть столько тонких моментов, различно понимаемых Исполнителем и Заказчиком, что проект можно считать безнадёжным с самого начала;<br><br>Если сайт маленький, то и тут не стоит пренебрегать данным этапом работ. Маленькие сайты, как правило гораздо более сфокусированы, чем большие и потому надо учитывать все до мелочей!<br><br><h3>Ссылки по теме</h3><br><a href="http://www.dev4masses.com/docs/gosts/19-201-78.html" target="_blank">ГОСТ 19.201-78 (СТ СЭВ 1627-79) ТЕХНИЧЕСКОЕ ЗАДАНИЕ. ТРЕБОВАНИЯ К СОДЕРЖАНИЮ И ОФОРМЛЕНИЮ</a><br><br><a href="http://www.dev4masses.com/docs/gosts/34-602-89.html" target="_blank">ГОСТ 34.602-89 ТЕХНИЧЕСКОЕ ЗАДАНИЕ НА СОЗДАНИЕ АВТОМАТИЗИРОВАННОЙ СИСТЕМЫ</a>]]></description>
<pubDate>Mon, 03 Nov 2008 10:39:26 +0700</pubDate>
<guid isPermaLink="true">http://tips.php.com.ua/topic/51/</guid>
</item>
<item>
<title>Отрисовка дерева (tree) с помощью Smarty</title>
<link>http://tips.php.com.ua/topic/50/</link>
<description><![CDATA[<style type="text/css"></style>
Можно красиво сделать используя рекурсивный шаблон, например если есть массив:<br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="kw2">&lt;?php</span></div></li>
<li class="li1"><div class="de1"><span class="re0">$foo</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="st_h">'1'</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st_h">'1.1'</span> <span class="sy0">=&gt;</span> <span class="kw2">null</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st_h">'1.2'</span> <span class="sy0">=&gt;</span> <span class="kw2">null</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="st_h">'2'</span> <span class="sy0">=&gt;</span> <span class="kw2">null</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="st_h">'3'</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st_h">'3.1'</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; <span class="st_h">'3.1.1'</span> <span class="sy0">=&gt;</span> <span class="kw2">null</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st_h">'3.2'</span> <span class="sy0">=&gt;</span> <span class="kw2">null</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="kw2">?&gt;</span></div></li>
</ol></div></code></pre><cut><br><b>Шаблон tree.tpl будет выглядеть так:</b><br><pre><code class="html"><div class="html php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">{if $tree}</div></li>
<li class="li1"><div class="de1">&lt;ul&gt;</div></li>
<li class="li1"><div class="de1">{foreach from=$tree key=&quot;name&quot; item=&quot;subtree&quot;}</div></li>
<li class="li1"><div class="de1">&nbsp; &lt;li&gt;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; {$name} {include file=&quot;tree.tpl&quot; tree=$subtree}</div></li>
<li class="li1"><div class="de1">&nbsp; &lt;/li&gt;</div></li>
<li class="li1"><div class="de1">{/foreach}</div></li>
<li class="li1"><div class="de1">&lt;/ul&gt;</div></li>
<li class="li1"><div class="de1">{/if}</div></li>
</ol></div></code></pre><br><b>И включайте шаблон в главный master.tpl:</b><br><pre><code class="html"><div class="html php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">&lt;h1&gt;Моё дерево&lt;/h1&gt;</div></li>
<li class="li1"><div class="de1">{include file=&quot;tree.tpl&quot; tree=$foo}</div></li>
</ol></div></code></pre><br>Если у вас исходный формат массива $foo другой, то можно написать плагин который будет преобразовывать в формат указанный выше.<br><h3>Формат массива</h3><br>Как вы могли заметить формат массива который нужно передавать не совсем естественный для деревьев. Это вложенный массив, где названия являются индексами, а значениями - массивы дочерних элементов или <b>null</b> если таковых нет.<br><br>Получаемый из реляционной БД формат дерева - обычно многомерный массив. Конвертация его в нужный формат задача не тривиальная. Допустим есть массив $a[$id]=Array($parentID, $value) и его надо преобразовать<pre><code class="php"><div class="html php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">&lt;?php</div></li>
<li class="li1"><div class="de1">$arr[1]=Array(0, '1'); </div></li>
<li class="li1"><div class="de1">$arr[2]=Array(1, '1.1'); </div></li>
<li class="li1"><div class="de1">$arr[3]=Array(1, '1.2'); </div></li>
<li class="li1"><div class="de1">$arr[4]=Array(0, '2'); </div></li>
<li class="li1"><div class="de1">$arr[5]=Array(0, '3'); </div></li>
<li class="li1"><div class="de1">$arr[6]=Array(5, '3.1'); </div></li>
<li class="li1"><div class="de1">$arr[7]=Array(6, '3.1.1'); </div></li>
<li class="li1"><div class="de1">$arr[8]=Array(5, '3.2'); </div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">// в такой вот формат</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">$foo = array(</div></li>
<li class="li1"><div class="de1">&nbsp; '1' =&gt; array(</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; '1.1' =&gt; null,</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; '1.2' =&gt; null</div></li>
<li class="li1"><div class="de1">&nbsp; ),</div></li>
<li class="li1"><div class="de1">&nbsp; '2' =&gt; null,</div></li>
<li class="li1"><div class="de1">&nbsp; '3' =&gt; array(</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; '3.1' =&gt; array(</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; '3.1.1' =&gt; null</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; ),</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; '3.2' =&gt; null</div></li>
<li class="li1"><div class="de1">&nbsp; )</div></li>
<li class="li1"><div class="de1">);</div></li>
<li class="li1"><div class="de1">?&gt;</div></li>
</ol></div></code></pre>Поскольку рисование дерева мы положили на шаблоны Smarty, то логично и необходимые преобразования реализовать как плагин, который можно вызывать из любого места.<br>Особая благодарность <a href="http://phpclub.ru/talk/member.php?s=&action=getinfo&userid=8" target="_blank">su1d</a> за помощь в создании алгоритма преобразования.<br><pre><code class="php"><div class="html php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">&lt;?php</div></li>
<li class="li1"><div class="de1">/*</div></li>
<li class="li1"><div class="de1">&nbsp;* Smarty plugin</div></li>
<li class="li1"><div class="de1">&nbsp;* -------------------------------------------------------------</div></li>
<li class="li1"><div class="de1">&nbsp;* File: &nbsp; &nbsp; function.treeconvert.php</div></li>
<li class="li1"><div class="de1">&nbsp;* Type: &nbsp; &nbsp; function</div></li>
<li class="li1"><div class="de1">&nbsp;* Name: &nbsp; &nbsp; treeconvert</div></li>
<li class="li1"><div class="de1">&nbsp;* Purpose: &nbsp;Converts array from dimensional to nested format</div></li>
<li class="li1"><div class="de1">&nbsp;* -------------------------------------------------------------</div></li>
<li class="li1"><div class="de1">&nbsp;*/</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">function arrSorter($a, $b) { </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; return $a[0] &lt; $b[0] ? -1 : ($a[0] &gt; $b[0] ? 1 : strcmp($a[1], $b[1])); </div></li>
<li class="li1"><div class="de1">} </div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">function smarty_function_treeconvert($params, &amp;$smarty) {</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; $_arr=$smarty-&gt;_tpl_vars[$params['var']];</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uasort($_arr, &quot;arrSorter&quot;); </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; $_res = array(); </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; $_parents = array(&amp;$_res); </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; $_values=Array();</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; foreach($_arr as $_id =&gt; $_pid) { </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;$_parents[$_pid[0]][$_id] = null;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;$_parents[$_id] =&amp; $_parents[$_pid[0]][$_id]; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;$_values[$_id]=$_pid[1];</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; } </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; unset($_parents);</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; unset($_arr);</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; $_arr['tree']=$_res;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; $_arr['value']=$_values;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; unset ($_res);</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; $smarty-&gt;_tpl_vars[$params['var']]=$_arr;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; return; </div></li>
<li class="li1"><div class="de1">&nbsp;}</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">?&gt;</div></li>
</ol></div></code></pre>И сохранить его в папку $smarty->plugins_dir или в основную plugins папку дистрибутива Smarty.<br><br>Шаблоны для вызова этого кода несколько видоизменились:<br><br><b>master.tpl</b><pre><code class="html"><div class="html php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">&lt;h1&gt;Моё дерево&lt;/h1&gt;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">{* передаем в плагин название переменной</div></li>
<li class="li1"><div class="de1">&nbsp;которую мы присволили через $s-&gt;assign *}</div></li>
<li class="li1"><div class="de1">{treeconvert var=&quot;foo&quot;}</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">{include file=&quot;tree.tpl&quot; tree=$foo.tree}</div></li>
</ol></div></code></pre><br><br><br></b>tree.tpl</b><pre><code class="html"><div class="html php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">{if $tree}</div></li>
<li class="li1"><div class="de1">&lt;ul&gt;</div></li>
<li class="li1"><div class="de1">{foreach from=$tree key=&quot;id&quot; item=&quot;subtree&quot;}</div></li>
<li class="li1"><div class="de1">&nbsp; &lt;li&gt;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; {$foo.value.$id} {include file=&quot;tree.tpl&quot; tree=$subtree}</div></li>
<li class="li1"><div class="de1">&nbsp; &lt;/li&gt;</div></li>
<li class="li1"><div class="de1">{/foreach}</div></li>
<li class="li1"><div class="de1">&lt;/ul&gt;</div></li>
<li class="li1"><div class="de1">{/if}</div></li>
</ol></div></code></pre><br><h3>TODO</h3><br>Как вы уже заметили, вторая реализация шаблона пока кривовата. Получить сразу массив где в качестве индекса были значения узлов нам не удалось. Поэтому мы передали массив с двумя индексами.<br><pre><code class="php"><div class="html php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">&lt;?php</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; $_arr['tree']=$_res; // тут id</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; $_arr['value']=$_values; // тут привязка ID -&gt; Value</div></li>
<li class="li1"><div class="de1">?&gt;</div></li>
</ol></div></code></pre><br>Поскольку к такому массиву напрямую неприменим {foreach}, мы вынуждены в рекурсивном шаблоне обращаться к {$foo.value.$id} чтобы получить знаение соответствующего ID, что есть неправильно.<br>Так как мы должны указывать имя переменной во вложенном шаблоне такое же как в <b>master.tpl</b>, что делает шаблон не универсальным и не портабельным.]]></description>
<pubDate>Mon, 03 Nov 2008 09:05:57 +0700</pubDate>
<guid isPermaLink="true">http://tips.php.com.ua/topic/50/</guid>
</item>
<item>
<title>Пособие по продвинутому использованию PEAR::Mail</title>
<link>http://tips.php.com.ua/topic/49/</link>
<description><![CDATA[<style type="text/css">/**
* GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
* (http://qbnz.com/highlighter/ and http://geshi.org/)
*/
.php.php .de1, .php.php .de2 {font-family: monospace; font-weight: normal; font-style: normal; margin:0; padding:0; background:inherit;color: #000020;}
.php.php  {color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em}
.php.php a:link {color: #000060;}
.php.php a:hover {background-color: #f0f000;}
.php.php .imp {font-weight: bold; color: red;}
.php.php li, .php.php .li1 {font-weight: normal;}
.php.php .ln {width:1px;font-weight: normal;text-align:right;margin:0;padding:0 2px;}
.php.php .kw1 {color: #b1b100;}
.php.php .kw2 {color: #000000; font-weight: bold;}
.php.php .kw3 {color: #990000;}
.php.php .co1 {color: #666666; font-style: italic;}
.php.php .co2 {color: #666666; font-style: italic;}
.php.php .co3 {color: #0000cc; font-style: italic;}
.php.php .co4 {color: #0000ff; font-style: italic;}
.php.php .coMULTI {color: #666666; font-style: italic;}
.php.php .es_h {color: #000099; font-weight: bold;}
.php.php .es_h {color: #000099; font-weight: bold;}
.php.php .br0 {color: #009900;}
.php.php .sy0 {color: #339933;}
.php.php .st0 {color: #0000ff;}
.php.php .st_h {color: #0000ff;}
.php.php .nu0 {color: #cc66cc;}
.php.php .nu8 {color: #208080;}
.php.php .nu12 {color: #208080;}
.php.php .nu19 {color:#800080;}
.php.php .me1 {color: #004000;}
.php.php .me2 {color: #004000;}
.php.php .re0 {color: #000088;}
.php.php span.xtra { display:block; }
</style>
<img src="/uploads/users/1/1225694486.png" align="left" alt="Pear::Mail" border="0" hspace="10px" vspace="10px" />Практически на каждом серьёзном приложении или сайте есть надобность работать с почтой. <br>Это и рассылка новостей, обновлений, объявлений подписчикам, это и служебная переписка с посетителями (активация регистрации, подтверждение заказа, напоминание или восстановление пароля, уведомления о ответе на форуме), это и уведомления для администраторов/модераторов. <cut><br><br>Задача эта повсеместная и актуальная, поэтому иметь хорошие инструменты для работы с почтой актуально (кто пересел из Outlook Express на TheBat! меня поймут ;)<br><br>Серьезных PHP тулзов есть две<br>- <a href="http://phpmailer.sourceforge.net/" target="_blank">PHPMailer</a><br>- <a href="http://pear.php.net/manual/en/package.mail.mail.php" target="_blank">Pear::Mail</a><br><br>Второй вкупе с Pear::Mail_mime обеспечивает такую же функциональность, а поскольку мы используем и другие PEAR классы, то выбрать единый стиль будет разумно<br><br>Функциональность которую должен поддерживать этот инструмент тоже не скудная. Во-первых работать с любыми видами почтовых агентов (MTA), предпочтительно SMTP, в т.ч. с авторизацией. Во вторых корректно работать с разными кодировками (кириллица в письме, теме, заголовках). В третьих работать с любыми MIME форматами (слать HTML письма, вставлять аттачменты, а также делать вложенные картинки для HTML)<br><br>Приведем кусок базового класса который будет отвечать за подключение почтовых библиотек. Отметим что все настройки хранятся в *.ini файле, в т.ч. почтовые:<br><pre><code class="html"><div class="html" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">[mail]</div></li>
<li class="li1"><div class="de1">mimenc &nbsp; &nbsp; &nbsp; &nbsp;= base64</div></li>
<li class="li1"><div class="de1">factory &nbsp; &nbsp; &nbsp; &nbsp;= smtp &nbsp; &nbsp;;mail|sendmail|smtp</div></li>
<li class="li1"><div class="de1">host &nbsp; &nbsp; &nbsp; &nbsp;= rv.uar.net</div></li>
<li class="li1"><div class="de1">port &nbsp; &nbsp; &nbsp; &nbsp;= 25</div></li>
<li class="li1"><div class="de1">auth &nbsp; &nbsp; &nbsp; &nbsp;= false</div></li>
<li class="li1"><div class="de1">user &nbsp; &nbsp; &nbsp; &nbsp;= null</div></li>
<li class="li1"><div class="de1">pass &nbsp; &nbsp; &nbsp; &nbsp;= null</div></li>
<li class="li1"><div class="de1">;sendmail_path &nbsp; &nbsp;= &quot;/usr/bin/sendmail&quot;</div></li>
<li class="li1"><div class="de1">;sendmail_args &nbsp; &nbsp;= &quot;-t -i&quot;</div></li>
<li class="li1"><div class="de1">localhost &nbsp; &nbsp;= site.com.ua ;EHLO command</div></li>
<li class="li1"><div class="de1">from &nbsp; &nbsp; &nbsp; &nbsp;= &quot;Администрация &lt;office@example.com.ua&gt;&quot;</div></li>
<li class="li1"><div class="de1">replyto &nbsp; &nbsp; &nbsp; &nbsp;= &quot;Администрация &lt;office@example.com.ua&gt;&quot;</div></li>
<li class="li1"><div class="de1">encoding &nbsp; &nbsp;= w</div></li>
<li class="li1"><div class="de1">encrfc &nbsp; &nbsp; &nbsp; &nbsp;= &quot;windows-1251&quot;</div></li>
<li class="li1"><div class="de1">mailer &nbsp; &nbsp; &nbsp; &nbsp;= &quot;MyPHP ;)&quot;</div></li>
</ol></div></code></pre><br>и сам класс (в нем упущена часть которая делает set_include_path(implode(PATH_SEPARATOR, $_inc)); где $_inc читает из конфига список папок в которых лежат библиотеки, в т.ч. PEAR):<br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="kw2">&lt;?php</span></div></li>
<li class="li1"><div class="de1"><span class="kw2">Class</span> baseclass <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw2">var</span> <span class="re0">$configfile</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw2">var</span> <span class="re0">$pmail</span><span class="sy0">,</span> <span class="re0">$pmime</span><span class="sy0">,</span> <span class="re0">$mimeparam</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw2">function</span> baseclass<span class="br0">&#40;</span><span class="re0">$_config</span><span class="sy0">=</span><span class="st_h">'../config.ini'</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">configfile</span><span class="sy0">=</span><span class="re0">$_config</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">ReadConfig</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw2">function</span> ReadConfig<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">file_exists</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">configfile</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="sy0">=</span><span class="kw3">parse_ini_file</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">configfile</span><span class="sy0">,</span> <span class="kw2">true</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">else</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">errH</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">,</span> <span class="st_h">'Cannot find configuration file. Check &lt;b&gt;'</span><span class="sy0">.</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">configfile</span><span class="sy0">.</span><span class="st_h">'&lt;/b&gt;'</span><span class="sy0">,</span> <span class="kw2">__LINE__</span><span class="sy0">,</span> <span class="kw2">__FILE__</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'host'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">errH</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">,</span> <span class="st_h">'File &lt;b&gt;'</span><span class="sy0">.</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">configfile</span><span class="sy0">.</span><span class="st_h">'&lt;/b&gt; has wrong format'</span><span class="sy0">,</span> <span class="kw2">__LINE__</span><span class="sy0">,</span> <span class="kw2">__FILE__</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw2">function</span> ErrH<span class="br0">&#40;</span><span class="re0">$errno</span><span class="sy0">=</span><span class="nu19">0</span><span class="sy0">,</span> <span class="re0">$msg</span><span class="sy0">=</span><span class="st_h">'Error'</span><span class="sy0">,</span> <span class="re0">$line</span><span class="sy0">=</span><span class="nu19">0</span><span class="sy0">,</span> <span class="re0">$file</span><span class="sy0">=</span><span class="st_h">'unknown'</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="sy0">@</span><span class="kw3">ob_end_clean</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Content-Encoding: none&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;&lt;blockquote&gt;&quot;</span><span class="sy0">.</span><span class="re0">$msg</span><span class="sy0">.</span><span class="st0">&quot;&lt;/blockquote&gt;&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;&lt;blockquote&gt;Error &lt;font color=red&gt;&quot;</span><span class="sy0">.</span><span class="re0">$errno</span><span class="sy0">.</span><span class="st0">&quot;&lt;/font&gt; on line &lt;b&gt;&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw3">echo</span> <span class="re0">$line</span><span class="sy0">.</span><span class="st0">&quot;&lt;/b&gt; in &lt;font color=green&gt;&lt;b&gt;&quot;</span><span class="sy0">.</span><span class="re0">$file</span><span class="sy0">.</span><span class="st0">&quot;&lt;/b&gt;&lt;/font&gt;&lt;/blockquote&gt;&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw3">exit</span>; &nbsp; &nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw2">function</span> InitMail<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st_h">'Mail.php'</span><span class="br0">&#41;</span>; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st_h">'Mail/mime.php'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="re0">$_crlf</span><span class="sy0">=</span><span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">pmime</span> <span class="sy0">=</span> <span class="kw2">&amp;new</span> Mail_mime<span class="br0">&#40;</span><span class="re0">$_crlf</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'factory'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">case</span> <span class="st_h">'smtp'</span><span class="sy0">:</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'auth'</span><span class="br0">&#93;</span> <span class="sy0">&amp;&amp;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'auth'</span><span class="br0">&#93;</span><span class="sy0">==</span><span class="st_h">'true'</span><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'auth'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="kw2">true</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'auth'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="kw2">false</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; <span class="re0">$_param</span><span class="sy0">=</span><span class="kw3">Array</span><span class="br0">&#40;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'host'</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'host'</span><span class="br0">&#93;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'port'</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'port'</span><span class="br0">&#93;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'auth'</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'auth'</span><span class="br0">&#93;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'username'</span> &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'user'</span><span class="br0">&#93;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'password'</span> &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'pass'</span><span class="br0">&#93;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'localhost'</span> &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'localhost'</span><span class="br0">&#93;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">case</span> <span class="st_h">'sendmail'</span><span class="sy0">:</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; <span class="re0">$_param</span><span class="sy0">=</span><span class="kw3">Array</span><span class="br0">&#40;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'sendmail_path'</span> &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'sendmail_path'</span><span class="br0">&#93;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'sendmail_args'</span> &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'sendmail_args'</span><span class="br0">&#93;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">break</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw2">default</span><span class="sy0">:</span> <span class="re0">$_param</span><span class="sy0">=</span><span class="kw2">Null</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">mimeparam</span><span class="sy0">=</span><span class="kw3">Array</span><span class="br0">&#40;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="st_h">'text_encoding'</span> &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="st_h">'7bit'</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="st_h">'html_encoding'</span> &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'mimeenc'</span><span class="br0">&#93;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="st_h">'7bit_wrap'</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="nu0">998</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="st_h">'html_encoding'</span> &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'encrfc'</span><span class="br0">&#93;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="st_h">'text_charset'</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'encrfc'</span><span class="br0">&#93;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="st_h">'head_charset'</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'encrfc'</span><span class="br0">&#93;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">pmail</span> <span class="sy0">=&amp;</span> <span class="kw3">Mail</span><span class="sy0">::</span><span class="me2">factory</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'factory'</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="re0">$_param</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="kw2">?&gt;</span></div></li>
</ol></div></code></pre><br>и пример вызова этого класса<br><br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="kw2">&lt;?php</span></div></li>
<li class="li1"><div class="de1"><span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st_h">'../base.php'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">class_exists</span><span class="br0">&#40;</span><span class="st_h">'BaseClass'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw3">die</span><span class="br0">&#40;</span><span class="st_h">'BaseClass not found'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="re0">$b</span><span class="sy0">=</span><span class="kw2">&amp;new</span> BaseClass<span class="br0">&#40;</span><span class="st_h">'config.ini'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="re0">$b</span><span class="sy0">-&gt;</span><span class="me1">InitMail</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="re0">$text</span> <span class="sy0">=</span> <span class="st_h">'Добрый день уважемый'</span>; </div></li>
<li class="li1"><div class="de1"><span class="re0">$html</span> <span class="sy0">=</span> <span class="st_h">'&lt;html&gt;&lt;body&gt;Добрый день уважемый &lt;img src=foto.jpg&gt;&lt;/body&gt;&lt;/html&gt;'</span>;</div></li>
<li class="li1"><div class="de1"><span class="re0">$file</span><span class="sy0">=</span><span class="st_h">'../prices/price.zip'</span>;</div></li>
<li class="li1"><div class="de1"><span class="re0">$img</span><span class="sy0">=</span><span class="st_h">'../images/foto.jpg'</span></div></li>
<li class="li1"><div class="de1"><span class="re0">$b</span><span class="sy0">-&gt;</span><span class="me1">pmime</span><span class="sy0">-&gt;</span><span class="me1">setTXTBody</span><span class="br0">&#40;</span><span class="re0">$text</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="re0">$b</span><span class="sy0">-&gt;</span><span class="me1">pmime</span><span class="sy0">-&gt;</span><span class="me1">setHTMLBody</span><span class="br0">&#40;</span><span class="re0">$html</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="re0">$b</span><span class="sy0">-&gt;</span><span class="me1">mime</span><span class="sy0">-&gt;</span><span class="me1">addAttachment</span><span class="br0">&#40;</span><span class="re0">$file</span><span class="sy0">,</span> <span class="st_h">'application/octet-stream'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="re0">$b</span><span class="sy0">-&gt;</span><span class="me1">mime</span><span class="sy0">-&gt;</span><span class="me1">addHTMLImage</span> <span class="br0">&#40;</span><span class="re0">$img</span><span class="sy0">,</span> <span class="st_h">'image/jpeg'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="re0">$_rcpt</span><span class="sy0">=</span><span class="kw3">Array</span><span class="br0">&#40;</span> <span class="co1">// может получаться из БД например</span></div></li>
<li class="li1"><div class="de1"><span class="st0">&quot;Кислов&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;kislov@ua.fm&quot;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">&quot;Техотдел&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;tech@uar.net&quot;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">&quot;Светлана Никифоровна&quot;</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;info@client.com&quot;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="re0">$rcpt</span><span class="sy0">=</span><span class="kw3">Array</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$_rcpt</span> <span class="kw1">as</span> <span class="re0">$name</span><span class="sy0">=&gt;</span><span class="re0">$mail</span><span class="br0">&#41;</span> <span class="re0">$rcpt</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$name</span><span class="sy0">.</span><span class="st_h">' &lt;'</span><span class="sy0">.</span><span class="re0">$mail</span><span class="sy0">.</span><span class="st_h">'&gt;'</span>;</div></li>
<li class="li1"><div class="de1"><span class="re0">$rcpt</span><span class="sy0">=</span><span class="kw3">implode</span><span class="br0">&#40;</span><span class="st_h">','</span><span class="sy0">,</span> <span class="re0">$rcpt</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="re0">$hdrs</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span> </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st_h">'From'</span> &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$b</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'from'</span><span class="br0">&#93;</span><span class="sy0">,</span> </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st_h">'Reply-To'</span> &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$b</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'replyto'</span><span class="br0">&#93;</span><span class="sy0">,</span> </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st_h">'X-Confirm-Reading-To'</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$b</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'replyto'</span><span class="br0">&#93;</span><span class="sy0">,</span> </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st_h">'Disposition-Notification-To'</span> &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$b</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'replyto'</span><span class="br0">&#93;</span><span class="sy0">,</span> </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st_h">'Return-Receipt-To'</span> &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$b</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'replyto'</span><span class="br0">&#93;</span><span class="sy0">,</span> </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st_h">'X-Mailer'</span> &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$b</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'mail'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'mailer'</span><span class="br0">&#93;</span><span class="sy0">,</span> </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st_h">'X-Priority'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="st0">&quot;3 (Normal)&quot;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st_h">'X-MSMail-Priority'</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="st0">&quot;Normal&quot;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st_h">'Subject'</span> <span class="sy0">=&gt;</span> <span class="st_h">'Уважаемый клиент...'</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st_h">'Bcc'</span> <span class="sy0">=&gt;</span> <span class="re0">$rcpt</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="re0">$body</span><span class="sy0">=</span><span class="re0">$b</span><span class="sy0">-&gt;</span><span class="me1">pmime</span><span class="sy0">-&gt;</span><span class="me1">get</span><span class="br0">&#40;</span><span class="re0">$b</span><span class="sy0">-&gt;</span><span class="me1">mimeparam</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="re0">$hdrs</span><span class="sy0">=</span><span class="re0">$b</span><span class="sy0">-&gt;</span><span class="me1">pmime</span><span class="sy0">-&gt;</span><span class="me1">headers</span><span class="br0">&#40;</span><span class="re0">$hdrs</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="re0">$status</span><span class="sy0">=</span><span class="re0">$b</span><span class="sy0">-&gt;</span><span class="me1">pmail</span><span class="sy0">-&gt;</span><span class="me1">send</span><span class="br0">&#40;</span><span class="st_h">'manager@example.com.ua'</span><span class="sy0">,</span> <span class="re0">$hdrs</span><span class="sy0">,</span> <span class="re0">$body</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>PEAR<span class="sy0">::</span><span class="me2">isError</span><span class="br0">&#40;</span><span class="re0">$status</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; <span class="re0">$b</span><span class="sy0">-&gt;</span><span class="me1">errH</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">,</span> <span class="st0">&quot;ERROR sending mail&quot;</span><span class="sy0">,</span> <span class="kw2">__LINE__</span><span class="sy0">,</span> <span class="kw2">__FILE__</span><span class="br0">&#41;</span>; </div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="kw3">echo</span> <span class="st0">&quot;Done&quot;</span>;</div></li>
<li class="li1"><div class="de1"><span class="kw2">?&gt;</span></div></li>
</ol></div></code></pre>Что у нас получилось:<br>Послали через smtp (поменять тип или включить авторизацию - в config.ini) письмо с полями From: Reply-To: с текстовым сообщением, HTML атачментом в котором вложена фотография, атачментом с прайсом. Как в полях From: To: так и в теме и теле письма применяли windows-1251 кодировку. Атачменты и кирилицу в заголовках кодировали с помощью base64 (можно поменять на quoted-printable в config.ini)<br>Рассылку сделали в скрытое поле Bcc: целому списку клиентов $_rcpt<br>Установили уведомление о доставке и о прочтении, установили нормальный приоритет письма (3) и название почтового агента. При отсылке через smtp установили свой хост через команду EHLO (вместо дефолтного localhost).]]></description>
<pubDate>Mon, 03 Nov 2008 08:45:38 +0700</pubDate>
<guid isPermaLink="true">http://tips.php.com.ua/topic/49/</guid>
</item>
<item>
<title>Работа CURL с SSL</title>
<link>http://tips.php.com.ua/topic/48/</link>
<description><![CDATA[<style type="text/css">/**
* GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
* (http://qbnz.com/highlighter/ and http://geshi.org/)
*/
.php.php .de1, .php.php .de2 {font-family: monospace; font-weight: normal; font-style: normal; margin:0; padding:0; background:inherit;color: #000020;}
.php.php  {color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em}
.php.php a:link {color: #000060;}
.php.php a:hover {background-color: #f0f000;}
.php.php .imp {font-weight: bold; color: red;}
.php.php li, .php.php .li1 {font-weight: normal;}
.php.php .ln {width:1px;font-weight: normal;text-align:right;margin:0;padding:0 2px;}
.php.php .kw1 {color: #b1b100;}
.php.php .kw2 {color: #000000; font-weight: bold;}
.php.php .kw3 {color: #990000;}
.php.php .co1 {color: #666666; font-style: italic;}
.php.php .co2 {color: #666666; font-style: italic;}
.php.php .co3 {color: #0000cc; font-style: italic;}
.php.php .co4 {color: #0000ff; font-style: italic;}
.php.php .coMULTI {color: #666666; font-style: italic;}
.php.php .es_h {color: #000099; font-weight: bold;}
.php.php .es_h {color: #000099; font-weight: bold;}
.php.php .br0 {color: #009900;}
.php.php .sy0 {color: #339933;}
.php.php .st0 {color: #0000ff;}
.php.php .st_h {color: #0000ff;}
.php.php .nu0 {color: #cc66cc;}
.php.php .nu8 {color: #208080;}
.php.php .nu12 {color: #208080;}
.php.php .nu19 {color:#800080;}
.php.php .me1 {color: #004000;}
.php.php .me2 {color: #004000;}
.php.php .re0 {color: #000088;}
.php.php span.xtra { display:block; }
</style>
<a href="http://multitran.ru/c/m.exe?l1=1&s=curl&%CF%EE%E8%F1%EA=%CF%EE%E8%F1%EA" target="_blank"><img src="/uploads/users/1/1225693308.png" align="left" alt="CURL" border="0" hspace="10px" vspace="10px" /></a><blockquote>Пытаюсь загрузить через HTTP-Proxy и показать линк с https сайта и что то ничего не получается. если адрес http то нет проблем.</blockquote><br><br>Вот способ решения такой проблемы.<cut><br><br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="kw2">&lt;?php</span> </div></li>
<li class="li1"><div class="de1"><span class="re0">$domain</span> <span class="sy0">=</span> <span class="st0">&quot;www.nash_ssl_site.com&quot;</span>; </div></li>
<li class="li1"><div class="de1"><span class="re0">$file</span><span class="sy0">=</span><span class="st0">&quot;/folder/script.dll?variables=dsds&quot;</span>; </div></li>
<li class="li1"><div class="de1"><span class="re0">$proxy</span><span class="sy0">=</span><span class="st_h">'192.168.1.1'</span>; </div></li>
<li class="li1"><div class="de1"><span class="re0">$port</span><span class="sy0">=</span><span class="nu0">3128</span>; </div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="re0">$fp</span> <span class="sy0">=</span> <span class="kw3">fsockopen</span><span class="br0">&#40;</span><span class="re0">$proxy</span><span class="sy0">,</span> <span class="re0">$port</span><span class="sy0">,</span> <span class="re0">$errno</span><span class="sy0">,</span> <span class="re0">$errstr</span><span class="sy0">,</span><span class="nu0">5</span><span class="br0">&#41;</span>; </div></li>
<li class="li1"><div class="de1"><span class="kw3">fputs</span><span class="br0">&#40;</span><span class="re0">$fp</span><span class="sy0">,</span> <span class="st0">&quot;CONNECT $url:443 HTTP/1.0<span class="es0">\r</span><span class="es0">\n</span>User-agent: PHP/4.3.11<span class="es0">\r</span><span class="es0">\n</span><span class="es0">\r</span><span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="co1">// А вот тут обломчики... открыть fsockopen('ssl://site.com') в уже существующий $fp мы не сможем... </span></div></li>
<li class="li1"><div class="de1"><span class="kw2">?&gt;</span></div></li>
</ol></div></code></pre><br>Без CURL очевидно не обойтись...<br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="kw2">&lt;?php</span> </div></li>
<li class="li1"><div class="de1"><span class="kw2">function</span> curl_string <span class="br0">&#40;</span><span class="re0">$url</span><span class="sy0">,</span><span class="re0">$user_agent</span><span class="sy0">,</span><span class="re0">$proxy</span><span class="br0">&#41;</span><span class="br0">&#123;</span> </div></li>
<li class="li1"><div class="de1"><span class="re0">$ch</span> <span class="sy0">=</span> curl_init<span class="br0">&#40;</span><span class="br0">&#41;</span>; </div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// установить соединение через прокси:порт_прокси</span></div></li>
<li class="li1"><div class="de1">curl_setopt <span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_PROXY<span class="sy0">,</span> <span class="re0">$proxy</span><span class="br0">&#41;</span>; </div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// если требуется авторизация на Proxy</span></div></li>
<li class="li1"><div class="de1">curl_setopt <span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_PROXYUSERPWD<span class="sy0">,</span> <span class="st_h">'user_login:secret_password'</span><span class="br0">&#41;</span>; </div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// установить соединение в режиме &quot;туннеля&quot; прокси - через CONNECT !!</span></div></li>
<li class="li1"><div class="de1">curl_setopt <span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_HTTPPROXYTUNNEL<span class="sy0">,</span> <span class="re0">$proxy</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// установить запрашиваемый URL</span></div></li>
<li class="li1"><div class="de1">curl_setopt <span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_URL<span class="sy0">,</span> <span class="re0">$url</span><span class="br0">&#41;</span>; </div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// &quot;зашифроваться&quot; под USER_AGENT</span></div></li>
<li class="li1"><div class="de1">curl_setopt <span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_USERAGENT<span class="sy0">,</span> <span class="re0">$user_agent</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// установить куда сохранять куку, очень нужная вещь если есть авторизация и редиректы!</span></div></li>
<li class="li1"><div class="de1"><span class="co1">// надо чтобы был доступ на запись. </span></div></li>
<li class="li1"><div class="de1"><span class="co1">// в многопользовательской среде могут быть траблы с паралельным доступом к файлу.</span></div></li>
<li class="li1"><div class="de1"><span class="co1">// Тогда надо хранить в временном файле</span></div></li>
<li class="li1"><div class="de1">curl_setopt <span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_COOKIEJAR<span class="sy0">,</span> <span class="st0">&quot;./cookie.txt&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// если требуется передача HTTP_REFERER</span></div></li>
<li class="li1"><div class="de1">curl_setopt <span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_REFERER<span class="sy0">,</span> <span class="st0">&quot;http://example.com/previous.html&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// HTTP заголовки ответа включать в возвращаемый результат</span></div></li>
<li class="li1"><div class="de1">curl_setopt <span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_HEADER<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// возвратить результат обработки в переменную а не на STDOUT</span></div></li>
<li class="li1"><div class="de1">curl_setopt <span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_RETURNTRANSFER<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// если будут редиректы - следовать за ними</span></div></li>
<li class="li1"><div class="de1">curl_setopt <span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_FOLLOWLOCATION<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">curl_setopt <span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_TIMEOUT<span class="sy0">,</span> <span class="nu0">120</span><span class="br0">&#41;</span>; <span class="co1">// таймаут соединения - 2 минуты</span></div></li>
<li class="li1"><div class="de1"><span class="re0">$result</span> <span class="sy0">=</span> curl_exec <span class="br0">&#40;</span><span class="re0">$ch</span><span class="br0">&#41;</span>; <span class="co1">// выполнить запрос</span></div></li>
<li class="li1"><div class="de1">curl_close<span class="br0">&#40;</span><span class="re0">$ch</span><span class="br0">&#41;</span>; </div></li>
<li class="li1"><div class="de1"><span class="kw1">return</span> <span class="re0">$result</span>; </div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span> </div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="re0">$url_page</span> <span class="sy0">=</span> <span class="st0">&quot;https://authorize.net/dir/file.req?var=val&quot;</span>; </div></li>
<li class="li1"><div class="de1"><span class="re0">$user_agent</span> <span class="sy0">=</span> <span class="st0">&quot;PHP/4.3.11&quot;</span>; </div></li>
<li class="li1"><div class="de1"><span class="re0">$proxy</span> <span class="sy0">=</span> <span class="st0">&quot;192.168.1.1:3128&quot;</span>; </div></li>
<li class="li1"><div class="de1"><span class="re0">$string</span> <span class="sy0">=</span> curl_string<span class="br0">&#40;</span><span class="re0">$url_page</span><span class="sy0">,</span><span class="re0">$user_agent</span><span class="sy0">,</span><span class="re0">$proxy</span><span class="br0">&#41;</span>; </div></li>
<li class="li1"><div class="de1"><span class="kw3">echo</span> <span class="re0">$string</span>; </div></li>
<li class="li1"><div class="de1"><span class="kw2">?&gt;</span></div></li>
</ol></div></code></pre>]]></description>
<pubDate>Mon, 03 Nov 2008 08:23:35 +0700</pubDate>
<guid isPermaLink="true">http://tips.php.com.ua/topic/48/</guid>
</item>
<item>
<title>Борьба с баннерами в локальных сетях и сетях провайдеров</title>
<link>http://tips.php.com.ua/topic/47/</link>
<description><![CDATA[<style type="text/css"></style>
<img src="/uploads/users/1/1225628036.png" align="left" alt="proxy ;-)" border="0" hspace="10px" vspace="10px"> Развитие веба сегодня неразрывно связано с злоупотреблением разработчиками и владельцами сайтов всевозможными баннерами и счётчиками, которые изрядно портят нервы посетителям и создают излишнюю нагрузку на каналы и оборудование и загромождают страницы прыгающими "попками и сиськами" и поп-апами.<br><br>Существующие средства персонального блокирования (встраиваемые в броузеры или персональные фаерволы) эффективны только для домашнего применения, но очень накладны в сетях (офисных, провайдерных), т.к. их надо устанавливать, настраивать, сопровождать на каждом рабочем месте, каждом броузере, каждой учётной записи.<cut><br><br>Кроме того в корпоративных сетях возникают вопросы блокирования определённый сайтов с нежелательным контентом (например порно-сайты), которые посещают сотрудники или гости компании.<br><br>В то же время с "чумой 21 века" можно крайне эффективно бороться на прокси-сервере. Мною выбран самый популярный и эффективный HTTP-proxy работающий как под Unix так и под Windows - Squid.<br><br>Он представляет две возможности обработки URL:<br><br><h3>1. Через регулярные выражения</h3><pre><code class="html"><div class="html" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">squid.conf:</div></li>
<li class="li1"><div class="de1">===========</div></li>
<li class="li1"><div class="de1">acl Banners url_regex '/usr/local/etc/squid/ban'</div></li>
<li class="li1"><div class="de1">acl Porno url_regex '/usr/local/etc/squid/porno'</div></li>
<li class="li1"><div class="de1">acl NoBanners url_regex '/usr/local/etc/squid/noban'</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">http_access allow NoBanners</div></li>
<li class="li1"><div class="de1">http_access deny Banners</div></li>
<li class="li1"><div class="de1">http_access deny Porno</div></li>
<li class="li1"><div class="de1">===========</div></li>
</ol></div></code></pre>даный способ самый простой, но неэффективный, т.к. запрошенный УРЛ все равно скачивается но отдается клиенту страница 403 Forbidden. Эта страница с ошибкой портит вёрстку основной страницы (картинку, фреймы) и она "плывет".<br><br><h3>2. Через redirector.</h3><pre><code class="html"><div class="html" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">squid.conf:</div></li>
<li class="li1"><div class="de1">===========</div></li>
<li class="li1"><div class="de1">redirect_program /path/to/executable</div></li>
<li class="li1"><div class="de1">redirect_children 5</div></li>
<li class="li1"><div class="de1">redirect_rewrites_host_header on</div></li>
<li class="li1"><div class="de1">===========</div></li>
</ol></div></code></pre>эти директивы говорят Squid запустить изначально 5 копий процесса `executable` и все запросы клиентов перенаправлять ему на обработку. А то что возвратит редиректор - уже реально скачивать, отдавать клиенту и писать в лог.<br><br>От Squid редиректор получает на STDIN запрос в таком формате:<br><br>http://example.com/path?var=val/url 10.0.1.12/user_name ident_string method<br><br>user_name берется из модуля ncsa_auth. Если модуль не активирован или юзер конектится без использования авторизации то вместо имени юзера будет дефис: 10.0.1.12/-<br><br>ident_string берется из IDENT запроса Squid клиенту (113 порт), если такие запросы запрещены и/или клиент не отдаёт никакого ответа, то будет тоже прочерк (дефис)<br><br>method - GET/POST/HEAD или другой.<br><br>В таком же формате редиректор должен отдать строку назад на STDOUT.<br><br>Осталось написать эффективный и удобный скрипт или программу редиректора. На данную тему в интернете можно найти существующие скрипты. Но мы напишем свой, на PHP, т.к. он простой в разработке и сопровождении, а встроенные функции работы со строками и массивами написаны на С, поэтому достаточно эфективны в плане быстродействия.<br><br>Основной недостаток редиректора на PHP (как и на другом скриптовом языке, например Perl) - это относительно большой объем занимаемой процессом памяти (нужной для работы /usr/local/bin/php). Это критично на серверах с высокой нагрузкой по количеству одновременных клиентов (Squid создаст много chidren) и ограниченным объёмом RAM.<br><br>Основной недостаток изученных мною скриптов-редиректоров - это плохая конфигурируемость и необходимость рестарта Squid для смены конфигурации, и что самое важное - при внесении изменений в "черные" и "белые" списки.<br><br>При написании скрипта автор постарался максимально учесть эти недостатки.<br><br>Перейдем к коду нашего скрипта:<br><br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="co2"><div class="html php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">#!/usr/local/bin/php -c /usr/local/redir/redir.ini</div></li>
</ol></div></span></div></li>
<li class="li1"><div class="de1"><span class="kw2">Class</span> SquidRedir <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> <span class="re0">$conf</span><span class="sy0">,</span> <span class="re0">$config</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> <span class="re0">$arrblack</span><span class="sy0">,</span> <span class="re0">$arrwhite</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> <span class="re0">$timeblack</span><span class="sy0">,</span> <span class="re0">$timewhite</span><span class="sy0">,</span> <span class="re0">$timeconfig</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> readconfig<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="sy0">=@</span><span class="kw3">parse_ini_file</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">conf</span><span class="sy0">,</span> <span class="kw2">true</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'redir'</span><span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'banner'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'path'</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'banner'</span><span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'noba'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'path'</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'noba'</span><span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">file_exists</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'banner'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw3">die</span> <span class="br0">&#40;</span><span class="st_h">'Ban definition ['</span><span class="sy0">.</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'banner'</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st_h">'] not found'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">file_exists</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'noba'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw3">die</span> <span class="br0">&#40;</span><span class="st_h">'White list definition ['</span><span class="sy0">.</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'noba'</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st_h">'] not found'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">is_readable</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'banner'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw3">die</span> <span class="br0">&#40;</span><span class="st_h">'Ban definition ['</span><span class="sy0">.</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'banner'</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st_h">'] not readable'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">is_readable</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'noba'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw3">die</span> <span class="br0">&#40;</span><span class="st_h">'White list definition ['</span><span class="sy0">.</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'noba'</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st_h">'] not readable'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">file_exists</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'log'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">is_writable</span><span class="br0">&#40;</span><span class="kw3">dirname</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'log'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$fp</span><span class="sy0">=</span><span class="kw3">fopen</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'log'</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="st_h">'a'</span><span class="br0">&#41;</span>; &nbsp; &nbsp;<span class="co1">// create log file</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re0">$fp</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="kw3">die</span> <span class="br0">&#40;</span><span class="st_h">'Log file ['</span><span class="sy0">.</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'banner'</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st_h">'] could not be created'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">timeconfig</span><span class="sy0">=</span><span class="kw3">filemtime</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">conf</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> myTrim<span class="br0">&#40;</span><span class="sy0">&amp;</span> <span class="re0">$item</span><span class="sy0">,</span> <span class="re0">$key</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$item</span><span class="sy0">=</span><span class="kw3">trim</span><span class="br0">&#40;</span><span class="re0">$item</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> readblack<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">arrblack</span><span class="sy0">=</span><span class="kw3">file</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'banner'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">array_walk</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">arrblack</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">,</span> <span class="st_h">'myTrim'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> readwhite<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">arrwhite</span><span class="sy0">=</span><span class="kw3">file</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'noba'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">array_walk</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">arrwhite</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">,</span> <span class="st_h">'myTrim'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> updateConfig<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">timeconfig</span><span class="sy0">!=</span><span class="kw3">filemtime</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">conf</span><span class="br0">&#41;</span><span class="br0">&#41;</span> &nbsp; &nbsp;<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">readconfig</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> updateBases<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">timeblack</span><span class="sy0">!=</span><span class="kw3">filemtime</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'banner'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">readblack</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">timewhite</span><span class="sy0">!=</span><span class="kw3">filemtime</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'noba'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">readwhite</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> writeLog<span class="br0">&#40;</span><span class="sy0">&amp;</span> <span class="re0">$record</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$flog</span> <span class="sy0">=</span> <span class="kw3">fopen</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'log'</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="st_h">'a'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$d</span><span class="sy0">=</span><span class="kw3">date</span><span class="br0">&#40;</span><span class="st_h">'Y-m-d H:i:s'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$log</span><span class="sy0">=</span><span class="re0">$d</span><span class="sy0">.</span><span class="st0">&quot;<span class="es0">\t</span>&quot;</span><span class="sy0">.</span><span class="re0">$record</span><span class="br0">&#91;</span><span class="st_h">'type'</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;<span class="es0">\t</span>&quot;</span><span class="sy0">.</span><span class="re0">$record</span><span class="br0">&#91;</span><span class="st_h">'ip'</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;<span class="es0">\t</span>&quot;</span><span class="sy0">.</span><span class="re0">$record</span><span class="br0">&#91;</span><span class="st_h">'url'</span><span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fputs</span><span class="br0">&#40;</span><span class="re0">$flog</span><span class="sy0">,</span><span class="re0">$log</span><span class="sy0">.</span><span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re0">$flog</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> parseSquid<span class="br0">&#40;</span><span class="re0">$in</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$tmp</span><span class="sy0">=</span><span class="kw3">explode</span><span class="br0">&#40;</span><span class="st_h">' '</span><span class="sy0">,</span><span class="re0">$in</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$path</span><span class="sy0">=</span><span class="kw3">explode</span><span class="br0">&#40;</span><span class="st_h">'?'</span><span class="sy0">,</span><span class="re0">$tmp</span><span class="br0">&#91;</span><span class="nu19">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$out</span><span class="br0">&#91;</span><span class="st_h">'url'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$tmp</span><span class="br0">&#91;</span><span class="nu19">0</span><span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$out</span><span class="br0">&#91;</span><span class="st_h">'path'</span><span class="br0">&#93;</span><span class="sy0">=@</span><span class="re0">$path</span><span class="br0">&#91;</span><span class="nu19">0</span><span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$out</span><span class="br0">&#91;</span><span class="st_h">'ip'</span><span class="br0">&#93;</span><span class="sy0">=@</span><span class="re0">$tmp</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$out</span><span class="br0">&#91;</span><span class="st_h">'ident'</span><span class="br0">&#93;</span><span class="sy0">=@</span><span class="re0">$tmp</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$out</span><span class="br0">&#91;</span><span class="st_h">'method'</span><span class="br0">&#93;</span><span class="sy0">=@</span><span class="re0">$tmp</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$out</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> debugWrite<span class="br0">&#40;</span><span class="re0">$debugstr</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$flog</span> <span class="sy0">=</span> <span class="kw3">fopen</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'debug'</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="st_h">'a'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$flog</span><span class="br0">&#41;</span> <span class="kw3">die</span><span class="br0">&#40;</span><span class="st_h">'Debug could not be created'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fputs</span><span class="br0">&#40;</span><span class="re0">$flog</span><span class="sy0">,</span><span class="re0">$debugstr</span><span class="sy0">.</span><span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re0">$flog</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> SquidRedir<span class="br0">&#40;</span><span class="re0">$conf</span><span class="sy0">=</span><span class="st_h">'/usr/local/redir/redir.ini'</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">conf</span><span class="sy0">=</span><span class="re0">$conf</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">file_exists</span><span class="br0">&#40;</span><span class="re0">$conf</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw3">die</span><span class="br0">&#40;</span><span class="st_h">'Config file not found'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">timeconfig</span><span class="sy0">=</span><span class="nu19">0</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">clearstatcache</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">updateConfig</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Read query from squid</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$input</span><span class="sy0">=</span><span class="kw3">trim</span><span class="br0">&#40;</span><span class="kw3">fgets</span><span class="br0">&#40;</span>STDIN<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'debugon'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> &nbsp; &nbsp;<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">debugWrite</span><span class="br0">&#40;</span><span class="re0">$input</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// parse string and init vars</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'enabled'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$output</span><span class="sy0">=</span><span class="re0">$input</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">updateBases</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$raw</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">parseSquid</span><span class="br0">&#40;</span><span class="re0">$input</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$found</span><span class="sy0">=</span><span class="kw2">false</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">arrblack</span> <span class="kw1">as</span> <span class="re0">$value</span><span class="br0">&#41;</span> <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">strpos</span><span class="br0">&#40;</span><span class="re0">$raw</span><span class="br0">&#91;</span><span class="st_h">'path'</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="re0">$value</span><span class="br0">&#41;</span><span class="sy0">!==</span><span class="kw2">false</span><span class="br0">&#41;</span><span class="br0">&#123;</span><span class="re0">$found</span><span class="sy0">=</span><span class="kw2">true</span>; <span class="kw1">break</span>;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$found</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// not found in black list, do nothing</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$newurl</span><span class="sy0">=</span><span class="re0">$raw</span><span class="br0">&#91;</span><span class="st_h">'url'</span><span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$raw</span><span class="br0">&#91;</span><span class="st_h">'type'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="st_h">'[none]'</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//$this-&gt;writeLog($raw);</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// found in black list</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$found</span><span class="sy0">=</span><span class="kw2">false</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">arrwhite</span> <span class="kw1">as</span> <span class="re0">$value</span><span class="br0">&#41;</span> <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">strpos</span><span class="br0">&#40;</span><span class="re0">$raw</span><span class="br0">&#91;</span><span class="st_h">'path'</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="re0">$value</span><span class="br0">&#41;</span><span class="sy0">!==</span><span class="kw2">false</span><span class="br0">&#41;</span><span class="br0">&#123;</span><span class="re0">$found</span><span class="sy0">=</span><span class="kw2">true</span>; <span class="kw1">break</span>;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$found</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$newurl</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'reurl'</span><span class="br0">&#93;</span>; <span class="co1">//do redirect and log;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$raw</span><span class="br0">&#91;</span><span class="st_h">'type'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="st_h">'[black]'</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$newurl</span><span class="sy0">=</span><span class="re0">$raw</span><span class="br0">&#91;</span><span class="st_h">'url'</span><span class="br0">&#93;</span>; <span class="co1">//don't redirect, only log</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$raw</span><span class="br0">&#91;</span><span class="st_h">'type'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="st_h">'[white]'</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'logging'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">writeLog</span><span class="br0">&#40;</span><span class="re0">$raw</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$output</span><span class="sy0">=</span><span class="re0">$newurl</span><span class="sy0">.</span><span class="st0">&quot; &quot;</span><span class="sy0">.</span><span class="re0">$raw</span><span class="br0">&#91;</span><span class="st_h">'ip'</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot; &quot;</span><span class="sy0">.</span><span class="re0">$raw</span><span class="br0">&#91;</span><span class="st_h">'ident'</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot; &quot;</span><span class="sy0">.</span><span class="re0">$raw</span><span class="br0">&#91;</span><span class="st_h">'method'</span><span class="br0">&#93;</span>; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="re0">$output</span><span class="sy0">.</span><span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">config</span><span class="br0">&#91;</span><span class="st_h">'debugon'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> &nbsp; &nbsp;<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">debugWrite</span><span class="br0">&#40;</span><span class="re0">$output</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// end constructor</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// End class definition</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="re0">$s</span><span class="sy0">=</span><span class="kw2">new</span> SquidRedir<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
</ol></div></code></pre><br><br>Вся конфигурация этого редиректора берется из файла /usr/local/redir/redir.ini :<br><br><pre><code class="html"><div class="html php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">[PHP]</div></li>
<li class="li1"><div class="de1">implicit_flush = On</div></li>
<li class="li1"><div class="de1">max_execution_time = 0</div></li>
<li class="li1"><div class="de1">error_reporting = E_ALL</div></li>
<li class="li1"><div class="de1">log_errors = On</div></li>
<li class="li1"><div class="de1">error_log = /var/log/redir/phperror.log ; use it if have start-up problems!</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">[redir]</div></li>
<li class="li1"><div class="de1">enabled = yes ; yes|no</div></li>
<li class="li1"><div class="de1">reurl &nbsp; &nbsp;= http://192.168.0.1/blank.gif ; URL with blank pic</div></li>
<li class="li1"><div class="de1">path &nbsp; &nbsp;= /usr/local/etc/squid/ ; path to 'banner' and 'noba' files</div></li>
<li class="li1"><div class="de1">banner &nbsp; &nbsp;= ba ; black list definition file</div></li>
<li class="li1"><div class="de1">noba &nbsp; &nbsp;= noba ; white list definition file</div></li>
<li class="li1"><div class="de1">logging &nbsp; &nbsp;= yes ; yes|no - enable to log blocked URLs</div></li>
<li class="li1"><div class="de1">log &nbsp; &nbsp;= /var/log/redir/redir_new.log</div></li>
<li class="li1"><div class="de1">debugon &nbsp; &nbsp;= no ; yes|no - enable to log all i/o with squid</div></li>
<li class="li1"><div class="de1">debug &nbsp; &nbsp;= /var/log/redir/redir_debug.log ; path for debug output</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
</ol></div></code></pre><br><br>[РНР] раздел конфигурирует поведение /usr/local/bin/php через опцию -c запуска скрипта:<br><pre><code class="php"><div class="html php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">#!/usr/local/bin/php -c /usr/local/redir/redir.ini</div></li>
</ol></div></code></pre><br><br>[redir] раздел конфигуриует поведение собственно редиректора.<br><br>enabled - если выставлен в NO, то не будет переписывать никаких URL, эквивалентно полному отключению редиректора<br><br>reurl - на все запрещенные страницы будет выдаваться этот URL. Там должна быть картинка (например пустой пиксел), иначе будет портиться рендеринг страниц в броузере. Если сеть не локальная, то URL должен быть реальным.<br><br>path - путь к папке в которой хранятся "черные" и "белые" списки. Выбрана директория конфигурации собственно Squid.<br><br>banner и noba - текстовые файлы со списком "черных" и "белых" URL<br><br>logging - если не выключен, то все запросы на "черные" и "белые" URL попадут в отдельный лог (полезно для сбора статистики а также выяснения причин почему некоторый сайт был заблокирован и добавление его в "белый" список или для корректировки "черного"). Формат лога: Дата-время IP/user URL<br><br>debugon - включить полное логирование всего STDIN/STDOUT<br><br>Любые изменения в секции [redir] подхватываются сразу и не требуют рестарта Squid.<br><br>Любые изменения в файлы banner/noba тоже подхватываются сразу.<br><br>Для редактирования этих текстовых файлов можно создать веб-интерфейс.<br><br>Пополнять "черные" списки можно двумя основными путями:<br>- запустить SARG анализатор Squid-овского access.log и посмотреть самые весомые банерные сети<br>- при личном посещении страниц изучить URL отображаемых банеров/счетчиков и добавить (например через веб-интерфейс)<br><br><h3>Инсталяция</h3><br><pre><code class="html"><div class="html php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"># vi /usr/local/etc/squid/squid.conf (добавить директивы redirect_program)</div></li>
<li class="li1"><div class="de1"># cd /usr/local/</div></li>
<li class="li1"><div class="de1"># mkdir redir</div></li>
<li class="li1"><div class="de1"># chown squid:wheel redir</div></li>
<li class="li1"><div class="de1"># chmod 575 redir</div></li>
<li class="li1"><div class="de1"># cd redir</div></li>
<li class="li1"><div class="de1"># cp /home/download/redir.ini redir.ini</div></li>
<li class="li1"><div class="de1"># cp /home/download/redir_new.php redir.php</div></li>
<li class="li1"><div class="de1"># chmod 575 redir_new.php</div></li>
<li class="li1"><div class="de1"># chmod 464 redir.ini</div></li>
<li class="li1"><div class="de1"># cd /var/log</div></li>
<li class="li1"><div class="de1"># mkdir redir</div></li>
<li class="li1"><div class="de1"># chown squid:wheel redir</div></li>
<li class="li1"><div class="de1"># chmod 775 redir</div></li>
<li class="li1"><div class="de1"># cd /usr/local/etc/squid</div></li>
<li class="li1"><div class="de1"># cp /home/download/ba ba</div></li>
<li class="li1"><div class="de1"># cp /home/download/noba noba</div></li>
<li class="li1"><div class="de1"># chmod +r ba</div></li>
<li class="li1"><div class="de1"># chmod +r noba</div></li>
<li class="li1"><div class="de1"># /usr/local/redir/redir_new.php (запустить и протестировать коректную работу)</div></li>
</ol></div></code></pre><br><br>Перезапустить Squid и протестировать работу. Файл reurl закачать на любой доступный HTTP сервер<br><br>Скачать нужные файлы можно отсюда:<br><br><a href="http://rv.uar.net/~yp/squid/redir_new.php.txt]redir_new.php.txt" target="_blank">http://rv.uar.net/~yp/squid/redir_new.php.txt]redir_new.php.txt</a><br><br><a href="http://rv.uar.net/~yp/squid/redir.ini]redir.ini" target="_blank">http://rv.uar.net/~yp/squid/redir.ini]redir.ini</a><br><br><a href="http://rv.uar.net/~yp/squid/ba.txt]ba.txt" target="_blank">http://rv.uar.net/~yp/squid/ba.txt]ba.txt</a><br><br><h3>Эффективность</h3><br>Двумесячное тестирование при сумарном веб-трафике 4,5 Гб (включая разные downloads) порезало 135 тыс. банеров<br><br><h3>TODO</h3><br>- Разделить списки banner/noba из 2 файлов на произвольный массив файл (например порно в одном, баннеры в другом)<br><br>- Сделать возможность включения/отключения модуля в зависимости от IP/USER клиента (т.е. кто хочет, кто не хочет)<br><br>P.S. Если заниматься этим "по взрослому", то ставьте SquidGuard, но как же наш любимый PHP? ;)]]></description>
<pubDate>Sun, 02 Nov 2008 14:14:20 +0700</pubDate>
<guid isPermaLink="true">http://tips.php.com.ua/topic/47/</guid>
</item>
<item>
<title>Религиозные войны и репликация в MySQL</title>
<link>http://tips.php.com.ua/topic/44/</link>
<description><![CDATA[<style type="text/css">/**
* GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
* (http://qbnz.com/highlighter/ and http://geshi.org/)
*/
.php.php .de1, .php.php .de2 {font-family: monospace; font-weight: normal; font-style: normal; margin:0; padding:0; background:inherit;color: #000020;}
.php.php  {color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em}
.php.php a:link {color: #000060;}
.php.php a:hover {background-color: #f0f000;}
.php.php .imp {font-weight: bold; color: red;}
.php.php li, .php.php .li1 {font-weight: normal;}
.php.php .ln {width:1px;font-weight: normal;text-align:right;margin:0;padding:0 2px;}
.php.php .kw1 {color: #b1b100;}
.php.php .kw2 {color: #000000; font-weight: bold;}
.php.php .kw3 {color: #990000;}
.php.php .co1 {color: #666666; font-style: italic;}
.php.php .co2 {color: #666666; font-style: italic;}
.php.php .co3 {color: #0000cc; font-style: italic;}
.php.php .co4 {color: #0000ff; font-style: italic;}
.php.php .coMULTI {color: #666666; font-style: italic;}
.php.php .es_h {color: #000099; font-weight: bold;}
.php.php .es_h {color: #000099; font-weight: bold;}
.php.php .br0 {color: #009900;}
.php.php .sy0 {color: #339933;}
.php.php .st0 {color: #0000ff;}
.php.php .st_h {color: #0000ff;}
.php.php .nu0 {color: #cc66cc;}
.php.php .nu8 {color: #208080;}
.php.php .nu12 {color: #208080;}
.php.php .nu19 {color:#800080;}
.php.php .me1 {color: #004000;}
.php.php .me2 {color: #004000;}
.php.php .re0 {color: #000088;}
.php.php span.xtra { display:block; }
</style>
С каждым днем web технологии шагают вперёд а вместе с ними и задачи которые приходится решать становятся интереснее - это я к чему веду. И так наступил такой день когда надо было реализовать, вернее переделать то что до меня наделали горе программисты - синхронизацию двух баз на MySQL. <cut><br><br>И так что у нас было и к чему мы стремимся.<br><br>Есть машинка с Win32 и MYSQL 4.0.24 (позже был заменён на 4.0.26) у хостера стоит FreBSD и MySQL 4.0.25.<br><br>Синхронизация баз была реализована полным пересозданием базы на стороне сервера даже если в базе изменилась всего одна запись.<br><br>Явный пример того что люди которые проектировали систему не были полностью в курсе своего дела<br><br>Так как мы более образованные то знаем что в MySQL есть встроенный механизм репликации данных. Как его настроить и использовать подробно описано в <a href="http://www.sql.ru/faq/faq_topic.aspx?fid=258" target="_blank">FAQ на сайте SQL.ru</a><br><br>Казалось бы что тут сложного настроили, запустили и радуемся жизни - но не все так просто как хотелось бы.<br><br>Настройка MySQL заняла минут 15 - после этого перезапустили сервера и ждем чуда.... а его как всегда нету, тогда лезем и смотри что нам говорит лог<br><blockquote>051125 10:30:00 Slave SQL thread initialized, starting replication in log 'FIRST' at position 0, relay log '.\xxx-relay-bin.001' position: 4MySql: ready for connections.Version: '4.0.26-nt' socket: '' port: 3306 Official MySQL binary 051125<br>10:30:21 Slave I/O thread: connected to master 'user@server.kyiv.ua:3306', replication started in log 'ukrserver2-bin.141' at position 63673051125<br>10:34:27 Error reading packet from server: Lost connection to MySQL server during query (server_errno=2013)</blockquote><br>После небольшой экскурсии по http://dev.mysql.com dev.mysql.com и http://google.com.ua google.com.ua ситуация прояснилась - оказалось все просто в самом http://bugs.mysql.com/bug.php?id=5588 MySQL был баг который пофиксили <pre><code class="html"><div class="html" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">Fixed in 4.0.27, 4.1.15, 5.0.13</div></li>
</ol></div></code></pre><br><br>То что пофиксили эту проблему в новых версиях хорошо - но нам то надо использовать то что есть сейчас.<br><br>После небольшого мозгового штурма была придумана вот такая схема работы, так сказать свой трехколёсный велосипед.<ul><li>Пишем лог запросов (UPDATE, INSERT, DELETE, REPLACE) к mysql в файл (средствами mysql)</li><li>останавливаем mysql - иначе мы просто не сможем удалить лог</li><li>Парсим это лог построчно с помощью php и выполняем эти запросы на удаленном сервере</li><li>удаляем лог</li><br><li>запускаем mysql</li></ul>На win32 машине в бат файлике эти операции выглядят примерно так.<br><ul><li>net stop mysql4</li><li>c:\php\php.exe -f c:\sync_db.php</li><li>net start mysql4</li></ul><br><br>останавливаем mysql<br>запускаем скрипт парсинга логов и отправки их на удаленный сервер<br>запускаем mysql<br><br>Теперь собственно сам скрипт обработки, скрипт не полный - опущены основные проверки а так же обработака ошибок при работе скрипта.<br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="kw2">&lt;?php</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// пусть к логу</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$update_log</span> &nbsp;<span class="sy0">=</span> <span class="st_h">'c:\update.log'</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$user</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=</span> <span class="st_h">''</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$passwd</span> &nbsp; &nbsp; &nbsp;<span class="sy0">=</span> <span class="st_h">''</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$base</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=</span> <span class="st_h">''</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$link</span> <span class="sy0">=</span> <span class="kw3">mysql_connect</span><span class="br0">&#40;</span><span class="st_h">'localhost'</span><span class="sy0">,</span> <span class="st_h">'mysql_user'</span><span class="sy0">,</span> <span class="st_h">'mysql_password'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$link</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">die</span><span class="br0">&#40;</span><span class="st_h">'Not connected : '</span> <span class="sy0">.</span> <span class="kw3">mysql_error</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$db_selected</span> <span class="sy0">=</span> <span class="kw3">mysql_select_db</span><span class="br0">&#40;</span><span class="re0">$base</span><span class="sy0">,</span> <span class="re0">$link</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$db_selected</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">die</span> <span class="br0">&#40;</span><span class="st_h">'Can<span class="es_h">\'</span>t use foo : '</span> <span class="sy0">.</span> <span class="kw3">mysql_error</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">file_exists</span><span class="br0">&#40;</span><span class="re0">$update_log</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;не могу найти файл &quot;</span><span class="sy0">.</span><span class="re0">$update_log</span><span class="sy0">.</span><span class="st0">&quot; проверьте настройки&quot;</span>; <span class="kw3">exit</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$sql_update</span> <span class="sy0">=</span> <span class="kw3">file</span><span class="br0">&#40;</span><span class="re0">$update_log</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$sql_update</span> <span class="kw1">as</span> <span class="re0">$sql</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">preg_match</span><span class="br0">&#40;</span><span class="st_h">'/^(UPDATE|INSERT|DELETE|REPLACE)(.*)$/i'</span><span class="sy0">,</span> <span class="re0">$sql</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">mysql_query</span><span class="br0">&#40;</span><span class="re0">$sql</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy0">*/</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">@</span><span class="kw3">unlink</span><span class="br0">&#40;</span><span class="re0">$update_log</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="kw2">?&gt;</span></div></li>
</ol></div></code></pre><br><br>В заключение могу сказать только одно - велосипед получился трёхколёсный, но это лучше чем ничего - о недостатках работы схемы я думаю не надо говорить, скажу только одно они есть и их довольно много - но меня вполне устроил и такой вариант.]]></description>
<pubDate>Sat, 01 Nov 2008 16:22:08 +0700</pubDate>
<guid isPermaLink="true">http://tips.php.com.ua/topic/44/</guid>
</item>
<item>
<title>MySQL :: Ошибка при подключении к серверу: Client does not support authentication protocol</title>
<link>http://tips.php.com.ua/topic/43/</link>
<description><![CDATA[<style type="text/css"></style>
Начиная с версии 4.1, в MySQL используется новый протокол аутентификации. В новом протоколе алгоритм хеширования данных аутентификации отличается от алгоритма более ранних версий сервера MySQL. <cut><br><br> По сути вся проблема сводится к тому, что хеш пароля "imypass/i" в версиях старше 4.1 (т.е. 4.1.*, 5.0.* и т.д.) имеет вид  *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 (строка длиннее 41 байта), и тот же пароль "imypass/i" в версиях младше 4.1. (т.е. 4.0.*, 3.23.* и т.д.) имеет вид 6f8c114b58f2ce9e (строка 16 байт)<br><br>Теперь возникает ситуация. Вы обновляете сервер до версии старше 4.1., а клиент у Вас остается старый. Вы все правильно установили, сервер нормально запустился. Вы запускаете клиента, вводите логин и пароль соответствующей учетной записи, нажимаете Enter, Ваш СТАРЫЙ клиент хеширует данные авторизации по СТАРОМУ алгоритму и передает их на сервер. Сервер принимает эти данные и сранивает их с данными из таблицы mysql.user/u. В результате такого сравнения сервер видит, что хеши паролей не совпадают (всего 16 байт, вместо ожидаемых, как минимум, 41-го байта). Вследствие чего, сервер выдает вполне информативное сообщение:<br><pre><code class="html"><div class="html" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">Client does not support authentication protocol requested by server;</div></li>
<li class="li1"><div class="de1">consider upgrading MySQL client</div></li>
</ol></div></code></pre>Что бы решить возникшую проблему, можно пойти по одному из следующих путей:<br><br><b>Обновить всех клиентов (их библиотеки)</b> до версии 4.1.1 или старше. Этот вариант идеальный, но не всегда подходит, потому что не для всех приложений существуют соответствующие обновлённые библиотеки.<br><br>Создать для «старых» клиентов учетные записи, которые хранят хеш пароля в старом формате.<br><br>Для каждой учетной записи задать хеш пароля в старом формате. Это делается с помощью одной из двух конструкции:<br><pre><code class="sql"><div class="sql sql" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="kw1">SET</span> PASSWORD <span class="kw1">FOR</span> <span class="st0">'some_user'</span>@<span class="st0">'some_host'</span> <span class="sy0">=</span> OLD_PASSWORD<span class="br0">&#40;</span><span class="st0">'newpwd'</span><span class="br0">&#41;</span>;</div></li>
</ol></div></code></pre><br><pre><code class="sql"><div class="sql sql" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="kw1">UPDATE</span> mysql<span class="sy0">.</span>user <span class="kw1">SET</span> Password <span class="sy0">=</span> OLD_PASSWORD<span class="br0">&#40;</span><span class="st0">'newpwd'</span><span class="br0">&#41;</span> <span class="kw1">WHERE</span> Host <span class="sy0">=</span> <span class="st0">'some_host'</span> <span class="kw1">AND</span> User <span class="sy0">=</span> <span class="st0">'some_user'</span>;</div></li>
<li class="li1"><div class="de1"><span class="kw1">FLUSH</span> PRIVILEGES;</div></li>
</ol></div></code></pre>Задать серверу в файле конфигурации (__my.ini__, __my.cnf__) директиву, которая указывает серверу использовать старый алгоритм хеширования пароля. <br><br>Эта директива: <pre><code class="html"><div class="html sql" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">-- old-passwords option</div></li>
</ol></div></code></pre><br><br>При этом не забудьте, что Вам нужно будет конвертировать хеши паролей из нового формата в старый формат. Это нужно будет сделать для всех учётных записей, у которых хеш пароля уже хранится в новом формате.<br><br>Для того, что бы выбрать пользователей, у которых хеши паролей хранятся в новом формате нужно написать запрос вида:<pre><code class="sql"><div class="html sql" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">SELECT Host, User, Password FROM mysql.user WHERE LENGTH(Password) &gt; 16;</div></li>
</ol></div></code></pre>Далее, для каждого пользователя в полученной таблице вы конвертируете пароль любым из вариантов, предложенным пунктом выше.<br><br>Если Вы программируете на языке PHP и версия языка младше версии 5.1, то знайте, что расширение MySQL использует старый протокол аутентификации, т.е. Вам придется работать со старым протоколом аутентификации, и лучше всего перевести сервер в режим старого протокола авторизации. <br><br>В PHP версий старше 5.1. существует расширение mysqli, которое поддерживает новый протокол аутентификации.<br><br>Не забудьте, что таблица mysql.user/u хранит хеши паролей. Эти хеши получены с помощью алгоритмов необратимого шифрования. Из этого следует, что Вы никогда не узнаете, какой пароль был источником для данного хеша и Вам прийдётся создавать новые пароли для учётных записей. После создания паролей сообщите новые данные учётных записей всем пользователям этих учётных записей.<br><br><h3>Рекомендуемые к прочтению разделы документации:</h3><ul><li><a href="http://dev.mysql.com/doc/refman/5.1/en/old-client.html">Section A.2.3, “Client does not support authentication protocol”</a></li><li><a href="http://dev.mysql.com/doc/refman/5.1/en/password-hashing.html">5.7.9. Password Hashing in MySQL 4.1</a></li></ul>]]></description>
<pubDate>Sat, 01 Nov 2008 16:06:51 +0700</pubDate>
<guid isPermaLink="true">http://tips.php.com.ua/topic/43/</guid>
</item>
<item>
<title>Количество написаного кода в проекте</title>
<link>http://tips.php.com.ua/topic/42/</link>
<description><![CDATA[<style type="text/css">/**
* GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
* (http://qbnz.com/highlighter/ and http://geshi.org/)
*/
.php.php .de1, .php.php .de2 {font-family: monospace; font-weight: normal; font-style: normal; margin:0; padding:0; background:inherit;color: #000020;}
.php.php  {color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em}
.php.php a:link {color: #000060;}
.php.php a:hover {background-color: #f0f000;}
.php.php .imp {font-weight: bold; color: red;}
.php.php li, .php.php .li1 {font-weight: normal;}
.php.php .ln {width:1px;font-weight: normal;text-align:right;margin:0;padding:0 2px;}
.php.php .kw1 {color: #b1b100;}
.php.php .kw2 {color: #000000; font-weight: bold;}
.php.php .kw3 {color: #990000;}
.php.php .co1 {color: #666666; font-style: italic;}
.php.php .co2 {color: #666666; font-style: italic;}
.php.php .co3 {color: #0000cc; font-style: italic;}
.php.php .co4 {color: #0000ff; font-style: italic;}
.php.php .coMULTI {color: #666666; font-style: italic;}
.php.php .es_h {color: #000099; font-weight: bold;}
.php.php .es_h {color: #000099; font-weight: bold;}
.php.php .br0 {color: #009900;}
.php.php .sy0 {color: #339933;}
.php.php .st0 {color: #0000ff;}
.php.php .st_h {color: #0000ff;}
.php.php .nu0 {color: #cc66cc;}
.php.php .nu8 {color: #208080;}
.php.php .nu12 {color: #208080;}
.php.php .nu19 {color:#800080;}
.php.php .me1 {color: #004000;}
.php.php .me2 {color: #004000;}
.php.php .re0 {color: #000088;}
.php.php span.xtra { display:block; }
</style>
Требования: PHP5+<br><br>Небольшой класс для подсчёта объёма написанного кода. Писалось за 20 минут и может быть плохо расширяемым, но уже функционирует. <cut><br><br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="kw2">class</span> LineCounter <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">private</span> <span class="re0">$total_lines</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">private</span> <span class="re0">$total_files</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">private</span> <span class="re0">$start_path</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">private</span> <span class="re0">$level</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">private</span> <span class="re0">$mask</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">//start_path - путь к каталогу с которого начинать счетчик</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">//level - глубина проникновения счетчика</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">//mask - маска файлов попадающих под счет</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="re0">$start_path</span><span class="sy0">,</span> <span class="re0">$level</span><span class="sy0">,</span> <span class="re0">$mask</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">start_path</span> <span class="sy0">=</span> <span class="re0">$start_path</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">level</span> <span class="sy0">=</span> <span class="re0">$level</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">mask</span> <span class="sy0">=</span> <span class="re0">$mask</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">function</span> countLines<span class="br0">&#40;</span><span class="re0">$fpath</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$fp</span> <span class="sy0">=</span> <span class="kw3">fopen</span><span class="br0">&#40;</span><span class="re0">$fpath</span><span class="sy0">,</span> <span class="st0">&quot;r&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$i</span> <span class="sy0">=</span> <span class="nu19">0</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">feof</span><span class="br0">&#40;</span><span class="re0">$fp</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fgets</span><span class="br0">&#40;</span><span class="re0">$fp</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$i</span>++;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$i</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">function</span> buildFileList<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$file</span> <span class="sy0">=</span> <span class="kw3">glob</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">start_path</span><span class="sy0">.</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">mask</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$full_p</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">start_path</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="re0">$i</span> <span class="sy0">=</span> <span class="nu19">0</span>; <span class="re0">$i</span> <span class="sy0">&lt;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">level</span>; <span class="re0">$i</span><span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$full_p</span> <span class="sy0">.=</span> <span class="kw3">str_repeat</span><span class="br0">&#40;</span><span class="st_h">'*/'</span><span class="sy0">,</span> <span class="re0">$i</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$file</span> <span class="sy0">=</span> <span class="kw3">array_merge</span><span class="br0">&#40;</span><span class="re0">$file</span><span class="sy0">,</span> <span class="kw3">glob</span><span class="br0">&#40;</span><span class="re0">$full_p</span><span class="sy0">.</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">mask</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$file</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">function</span> getTotalLines<span class="br0">&#40;</span><span class="re0">$files_array</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$total_f</span> <span class="sy0">=</span> <span class="nu19">0</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$files_array</span> <span class="kw1">as</span> <span class="re0">$f</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$total</span> <span class="sy0">+=</span> countLines<span class="br0">&#40;</span><span class="re0">$f</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">total_lines</span> <span class="sy0">=</span> <span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$files_array</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">total_files</span> <span class="sy0">=</span> <span class="re0">$total_f</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> getStat<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">getTotalLines</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">buildFileList</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Start path: &quot;</span><span class="sy0">.</span><span class="kw3">realpath</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">start_path</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st0">&quot;</span></div></li>
<li class="li1"><div class="de1"><span class="st0"><span class="es0">\n</span>&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Total: {$this-&gt;total_lines} lines in {$this-&gt;total_files} files&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
</ol></div></code></pre><br><br>Применяем следующим образом:<br><br>посчитать кол-во файлов и строк в текущем и вложенных каталогах с глубиной проникновения 10 и по маске файла "*.php":<br><br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="re0">$counter</span> <span class="sy0">=</span> <span class="kw2">new</span> LineCounter<span class="br0">&#40;</span><span class="st0">&quot;./&quot;</span><span class="sy0">,</span> <span class="nu0">10</span><span class="sy0">,</span> <span class="st_h">'*.php'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="re0">$counter</span><span class="sy0">-&gt;</span><span class="me1">getStat</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
</ol></div></code></pre>]]></description>
<pubDate>Sat, 01 Nov 2008 15:46:02 +0700</pubDate>
<guid isPermaLink="true">http://tips.php.com.ua/topic/42/</guid>
</item>
<item>
<title>Простой счетчик посещений для статического сайта</title>
<link>http://tips.php.com.ua/topic/41/</link>
<description><![CDATA[<style type="text/css">/**
* GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
* (http://qbnz.com/highlighter/ and http://geshi.org/)
*/
.php.php .de1, .php.php .de2 {font-family: monospace; font-weight: normal; font-style: normal; margin:0; padding:0; background:inherit;color: #000020;}
.php.php  {color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em}
.php.php a:link {color: #000060;}
.php.php a:hover {background-color: #f0f000;}
.php.php .imp {font-weight: bold; color: red;}
.php.php li, .php.php .li1 {font-weight: normal;}
.php.php .ln {width:1px;font-weight: normal;text-align:right;margin:0;padding:0 2px;}
.php.php .kw1 {color: #b1b100;}
.php.php .kw2 {color: #000000; font-weight: bold;}
.php.php .kw3 {color: #990000;}
.php.php .co1 {color: #666666; font-style: italic;}
.php.php .co2 {color: #666666; font-style: italic;}
.php.php .co3 {color: #0000cc; font-style: italic;}
.php.php .co4 {color: #0000ff; font-style: italic;}
.php.php .coMULTI {color: #666666; font-style: italic;}
.php.php .es_h {color: #000099; font-weight: bold;}
.php.php .es_h {color: #000099; font-weight: bold;}
.php.php .br0 {color: #009900;}
.php.php .sy0 {color: #339933;}
.php.php .st0 {color: #0000ff;}
.php.php .st_h {color: #0000ff;}
.php.php .nu0 {color: #cc66cc;}
.php.php .nu8 {color: #208080;}
.php.php .nu12 {color: #208080;}
.php.php .nu19 {color:#800080;}
.php.php .me1 {color: #004000;}
.php.php .me2 {color: #004000;}
.php.php .re0 {color: #000088;}
.php.php span.xtra { display:block; }
</style>
Обычным способом счётчика посещений для статического сайта на *.html является размещение картинки на какой-то скрипт (на своём или чужом сервере). Запрос на картинку считается показом страницы. <cut><br><br>Предлагается вниманию способ учёта посещений сайта собственными скриптовыми средствами, без вмешательства в существующий сайт:<br><br><quote>.htaccess</quote><br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">DirectoryIndex index<span class="sy0">.</span>html</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="sy0">&lt;</span>IfModule mod_rewrite<span class="sy0">.</span>c<span class="sy0">&gt;</span></div></li>
<li class="li1"><div class="de1">RewriteEngine on</div></li>
<li class="li1"><div class="de1">RewriteBase <span class="sy0">/</span></div></li>
<li class="li1"><div class="de1"><span class="co2"># skip grafics, design, archives</span></div></li>
<li class="li1"><div class="de1">RewriteRule \<span class="sy0">.</span><span class="br0">&#40;</span>gif|png|jpg|jpeg|bmp|tif|rar|zip|gz|bz2|exe|css|js|php<span class="br0">&#41;</span>$ <span class="sy0">-</span> <span class="br0">&#91;</span>L<span class="br0">&#93;</span></div></li>
<li class="li1"><div class="de1">RewriteRule \<span class="sy0">.</span><span class="br0">&#40;</span>GIF|PNG|JPG|JPEG|BMP|TIF|RAR|ZIP|GZ|BZ2|EXE|CSS|JS|PHP<span class="br0">&#41;</span>$ <span class="sy0">-</span> <span class="br0">&#91;</span>L<span class="br0">&#93;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co2"># skip docs</span></div></li>
<li class="li1"><div class="de1">RewriteRule \<span class="sy0">.</span><span class="br0">&#40;</span>doc|rtf|pdf|xls|txt<span class="br0">&#41;</span>$ <span class="sy0">-</span> <span class="br0">&#91;</span>L<span class="br0">&#93;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co2">#skip admin</span></div></li>
<li class="li1"><div class="de1">RewriteRule ^images <span class="sy0">-</span> <span class="br0">&#91;</span>L<span class="br0">&#93;</span></div></li>
<li class="li1"><div class="de1">RewriteRule ^css <span class="sy0">-</span> <span class="br0">&#91;</span>L<span class="br0">&#93;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co2"># redirect other to index.php</span></div></li>
<li class="li1"><div class="de1">RewriteRule ^<span class="br0">&#40;</span><span class="sy0">.*</span><span class="br0">&#41;</span>$ <span class="sy0">/</span>index<span class="sy0">.</span>php</div></li>
<li class="li1"><div class="de1"><span class="sy0">&lt;/</span>IfModule<span class="sy0">&gt;</span></div></li>
</ol></div></code></pre><br><br>index.php<br><br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="kw2">&lt;?php</span></div></li>
<li class="li1"><div class="de1"><span class="re0">$script</span><span class="sy0">=@</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'REDIRECT_URL'</span><span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1"><span class="re0">$script</span><span class="sy0">=</span><span class="kw3">str_replace</span><span class="br0">&#40;</span><span class="st_h">'/'</span><span class="sy0">,</span> <span class="st_h">''</span><span class="sy0">,</span> <span class="re0">$script</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$script</span><span class="sy0">==</span><span class="st_h">''</span><span class="br0">&#41;</span> <span class="re0">$script</span><span class="sy0">=</span><span class="st_h">'index.html'</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">file_exists</span><span class="br0">&#40;</span><span class="re0">$script</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">header</span><span class="br0">&#40;</span><span class="st_h">'HTTP/1.1 404 Not Found'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">exit</span>;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="re0">$ftime</span><span class="sy0">=</span><span class="kw3">filemtime</span><span class="br0">&#40;</span><span class="re0">$script</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><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="st_h">'If-Modified-Since'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="re0">$reqtime</span> <span class="sy0">=</span> <span class="kw3">strtotime</span><span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'If-Modified-Since'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$reqtime</span><span class="sy0">==</span><span class="re0">$ftime</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">header</span><span class="br0">&#40;</span><span class="st_h">'HTTP/1.1 304 Not Modified'</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">exit</span>;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="re0">$time</span> <span class="sy0">=</span> <span class="kw3">gmdate</span><span class="br0">&#40;</span><span class="st_h">'D, d M Y H:i:s \G\M\T'</span><span class="sy0">,</span> <span class="re0">$ftime</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="kw3">session_cache_limiter</span><span class="br0">&#40;</span><span class="st_h">'none'</span><span class="br0">&#41;</span>; <span class="co1">// не посылать заголовков запрещающих кеширование</span></div></li>
<li class="li1"><div class="de1"><span class="kw3">session_save_path</span><span class="br0">&#40;</span><span class="st_h">'/home/user/sessiondata'</span><span class="br0">&#41;</span>; <span class="co1">// не забудьте создать папку с правами на запись</span></div></li>
<li class="li1"><div class="de1"><span class="kw3">session_start</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// для отслеживания истории посещения, если счетчик только для хитов, то можно не использовать</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; <span class="sy0">@</span><span class="kw3">mysql_connect</span><span class="br0">&#40;</span><span class="st_h">'localhost'</span><span class="sy0">,</span> <span class="st_h">'user'</span><span class="sy0">,</span> <span class="st_h">'pass'</span><span class="br0">&#41;</span> or <span class="kw3">die</span><span class="br0">&#40;</span><span class="kw3">mysql_error</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; <span class="sy0">@</span><span class="kw3">mysql_select_db</span><span class="br0">&#40;</span><span class="st_h">'db_stat'</span><span class="br0">&#41;</span> or <span class="kw3">die</span><span class="br0">&#40;</span><span class="kw3">mysql_error</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="re0">$id_stat</span><span class="sy0">=</span><span class="br0">&#40;</span>int<span class="br0">&#41;</span> <span class="sy0">@</span><span class="re0">$_SESSION</span><span class="br0">&#91;</span><span class="st_h">'id_stat'</span><span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$id_stat</span><span class="sy0">&lt;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="re0">$sql</span><span class="sy0">=</span><span class="st0">&quot;INSERT INTO tbllogs (data, ip, xip, browser) VALUES (NOW(), '&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; <span class="re0">$sql</span><span class="sy0">.=</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'REMOTE_ADDR'</span><span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; <span class="re0">$sql</span><span class="sy0">.=</span><span class="st0">&quot;', '&quot;</span><span class="sy0">.</span><span class="kw3">mysql_escape_string</span><span class="br0">&#40;</span><span class="sy0">@</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'HTTP_X_FORWARDED_FOR'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; <span class="re0">$sql</span><span class="sy0">.=</span><span class="st0">&quot;' ,'&quot;</span><span class="sy0">.</span><span class="kw3">mysql_escape_string</span><span class="br0">&#40;</span><span class="sy0">@</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'HTTP_USER_AGENT'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; <span class="re0">$sql</span><span class="sy0">.=</span><span class="st0">&quot;')&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; <span class="sy0">@</span><span class="kw3">mysql_query</span><span class="br0">&#40;</span><span class="re0">$sql</span><span class="br0">&#41;</span> or <span class="kw3">die</span><span class="br0">&#40;</span><span class="kw3">mysql_error</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; <span class="re0">$_SESSION</span><span class="br0">&#91;</span><span class="st_h">'id_stat'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="kw3">mysql_insert_id</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; <span class="re0">$sql</span><span class="sy0">=</span><span class="st0">&quot;UPDATE tbllogs SET views=views+1, history=CONCAT(history,'&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; <span class="re0">$sql</span><span class="sy0">.=</span><span class="kw3">mysql_escape_string</span><span class="br0">&#40;</span><span class="sy0">@</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'REQUEST_URI'</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st0">&quot;') WHERE id=&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; <span class="re0">$sql</span><span class="sy0">.=</span><span class="re0">$_SESSION</span><span class="br0">&#91;</span><span class="st_h">'id_stat'</span><span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; <span class="sy0">@</span><span class="kw3">mysql_query</span><span class="br0">&#40;</span><span class="re0">$sql</span><span class="br0">&#41;</span> or <span class="kw3">die</span><span class="br0">&#40;</span><span class="kw3">mysql_error</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw3">header</span> <span class="br0">&#40;</span><span class="st0">&quot;Last-Modified: $time&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="kw3">header</span> <span class="br0">&#40;</span><span class="st0">&quot;Content-Length: &quot;</span> <span class="sy0">.</span> <span class="kw3">filesize</span><span class="br0">&#40;</span><span class="re0">$script</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="kw3">header</span> <span class="br0">&#40;</span><span class="st0">&quot;Content-Type: text/html; charset=windows-1251&quot;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="kw3">readfile</span><span class="br0">&#40;</span><span class="re0">$script</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1"><span class="kw2">?&gt;</span></div></li>
</ol></div></code></pre><br><br>Сама формат логирования посещения можно выбрать на любой вкус, в даном случае запись заводится только на новую сессию, а при существовании сессии только дописывается история посещения и делается инкремент счетчика хитов для этого хоста. <br><br>Скрипт не поддерживает докачку, но поддерживает "304 Not Modified" по дате изменения.]]></description>
<pubDate>Sat, 01 Nov 2008 15:25:48 +0700</pubDate>
<guid isPermaLink="true">http://tips.php.com.ua/topic/41/</guid>
</item>
</channel>
</rss>
