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

<channel>
	<title>Разработка &#187; php</title>
	<atom:link href="http://www.job-blog.bullgare.ru/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.job-blog.bullgare.ru</link>
	<description>о программировании и работе</description>
	<lastBuildDate>Fri, 03 Feb 2012 09:42:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Познавательное обсуждение о том, почему всё нужно собирать руками</title>
		<link>http://www.job-blog.bullgare.ru/2011/12/%d0%bf%d0%be%d0%b7%d0%bd%d0%b0%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d1%8c%d0%bd%d0%be%d0%b5-%d0%be%d0%b1%d1%81%d1%83%d0%b6%d0%b4%d0%b5%d0%bd%d0%b8%d0%b5-%d0%be-%d1%82%d0%be%d0%bc-%d0%bf%d0%be%d1%87%d0%b5/</link>
		<comments>http://www.job-blog.bullgare.ru/2011/12/%d0%bf%d0%be%d0%b7%d0%bd%d0%b0%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d1%8c%d0%bd%d0%be%d0%b5-%d0%be%d0%b1%d1%81%d1%83%d0%b6%d0%b4%d0%b5%d0%bd%d0%b8%d0%b5-%d0%be-%d1%82%d0%be%d0%bc-%d0%bf%d0%be%d1%87%d0%b5/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 07:42:33 +0000</pubDate>
		<dc:creator>bullgare</dc:creator>
				<category><![CDATA[администрирование]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php-fpm]]></category>
		<category><![CDATA[ссылка]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=1345</guid>
		<description><![CDATA[Тут у человека систематически виснет fpm, попытки это вылечить и самый дельный совет &#8211; &#171;собирать нужный софт для production-сервера нужно руками&#187;. http://phpclub.ru/talk/threads/%D0%B7%D0%B0%D0%B2%D0%B8%D1%81-fpm.66810/]]></description>
			<content:encoded><![CDATA[<p>Тут у человека систематически виснет fpm, попытки это вылечить и самый дельный совет &#8211; &laquo;собирать нужный софт для production-сервера нужно руками&raquo;.<br />
<a href="http://phpclub.ru/talk/threads/%D0%B7%D0%B0%D0%B2%D0%B8%D1%81-fpm.66810/">http://phpclub.ru/talk/threads/%D0%B7%D0%B0%D0%B2%D0%B8%D1%81-fpm.66810/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2011/12/%d0%bf%d0%be%d0%b7%d0%bd%d0%b0%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d1%8c%d0%bd%d0%be%d0%b5-%d0%be%d0%b1%d1%81%d1%83%d0%b6%d0%b4%d0%b5%d0%bd%d0%b8%d0%b5-%d0%be-%d1%82%d0%be%d0%bc-%d0%bf%d0%be%d1%87%d0%b5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Проблема при работе с расширением memcached в php</title>
		<link>http://www.job-blog.bullgare.ru/2011/10/%d0%bf%d1%80%d0%be%d0%b1%d0%bb%d0%b5%d0%bc%d0%b0-%d0%bf%d1%80%d0%b8-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b5-%d1%81-%d1%80%d0%b0%d1%81%d1%88%d0%b8%d1%80%d0%b5%d0%bd%d0%b8%d0%b5%d0%bc-memcached-%d0%b2-php/</link>
		<comments>http://www.job-blog.bullgare.ru/2011/10/%d0%bf%d1%80%d0%be%d0%b1%d0%bb%d0%b5%d0%bc%d0%b0-%d0%bf%d1%80%d0%b8-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b5-%d1%81-%d1%80%d0%b0%d1%81%d1%88%d0%b8%d1%80%d0%b5%d0%bd%d0%b8%d0%b5%d0%bc-memcached-%d0%b2-php/#comments</comments>
		<pubDate>Tue, 18 Oct 2011 12:19:29 +0000</pubDate>
		<dc:creator>bullgare</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[администрирование]]></category>
		<category><![CDATA[memcache]]></category>
		<category><![CDATA[memcached]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=1260</guid>
		<description><![CDATA[Работал раньше сайт с memcache. Решили перейти на memcached. И повалились ошибки SERVER HAS FAILED AND IS DISABLED UNTIL TIMED RETRY, причём сначала одна CLIENT ERROR, а уже потом куча SERVER HAS FAILED AND IS DISABLED UNTIL TIMED RETRY. Гугление ничего не дало, а проблема оказалась в следующем: первая ошибка возникала из-за некорректного ключа (пробел [...]]]></description>
			<content:encoded><![CDATA[<p>Работал раньше сайт с memcache.<br />
Решили перейти на memcached.<br />
И повалились ошибки <strong>SERVER HAS FAILED AND IS DISABLED UNTIL TIMED RETRY</strong>, причём сначала одна <strong>CLIENT ERROR</strong>, а уже потом куча <strong>SERVER HAS FAILED AND IS DISABLED UNTIL TIMED RETRY</strong>.<br />
Гугление ничего не дало, а проблема оказалась в следующем: первая ошибка возникала из-за некорректного ключа (пробел в названии ключа), после чего сервер расстраивался, и больше ничего делать не давал.<br />
Ключ был следующий: <strong>info__rating DESC__1</strong>, генерился автоматически и никаких проблем при использовании его в memcache не вызывал. Понятное дело, что ключ плохой, но это не мешало другому расширению успешно работать.<br />
А решение применили банальное: <strong>$Key = str_replace( &#8216; &#8216;, &#8216;_&#8217;, $Key );</strong>, теперь вроде работает).<br />
Окончательно все проблемы решила опция</p>
<pre class="code">
$this->setOption( Memcached::OPT_BINARY_PROTOCOL,   true );
</pre>
<p>После этого лог ошибок стал пустым.<br />
Коллега, который этим вопросом плотно занимается, считает, что это оттого, что по умолчанию протокол используется plain text (а именно, ascii), и UTF-символы интерпретируются неправильно (у нас ферма из нескольких машин, и на каждой окружение несколько отличается, к сожалению). И как только включили бинарный протокол, разногласия исчезли.</p>
<pre class="code">
	function __construct()
	{
		parent::__construct();

		$this->setOption( Memcached::OPT_BINARY_PROTOCOL, true );
		$this->setOption( Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT );
		$this->setOption( Memcached::OPT_HASH, Memcached::HASH_CRC );
		$this->setOption( Memcached::OPT_SERVER_FAILURE_LIMIT, 3 );
		$this->setOption( Memcached::OPT_NO_BLOCK, true );									// асинхронный ввод-вывод
		$this->setOption( Memcached::OPT_TCP_NODELAY, true );									// при работе с сокетами надо потестить - может ускорить работу

		$this->connection = $this->addServers( array(	array( &lt;хост&gt;, &lt;порт&gt; ) ) );
		...
	}
</pre>
<p>При использовании ключа:</p>
<pre class="code">
	...
	$key = str_replace( array( ' ', ',', ':' ), '_', $key );

	if ( strlen($key) > 220 ) {
		$key = md5( $key );
	}
	...
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2011/10/%d0%bf%d1%80%d0%be%d0%b1%d0%bb%d0%b5%d0%bc%d0%b0-%d0%bf%d1%80%d0%b8-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b5-%d1%81-%d1%80%d0%b0%d1%81%d1%88%d0%b8%d1%80%d0%b5%d0%bd%d0%b8%d0%b5%d0%bc-memcached-%d0%b2-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Новое в PHP 5.4 &#8211; трейты (traits)</title>
		<link>http://www.job-blog.bullgare.ru/2011/03/%d0%bd%d0%be%d0%b2%d0%be%d0%b5-%d0%b2-php-5-4-%d1%82%d1%80%d0%b5%d0%b9%d1%82%d1%8b-traits/</link>
		<comments>http://www.job-blog.bullgare.ru/2011/03/%d0%bd%d0%be%d0%b2%d0%be%d0%b5-%d0%b2-php-5-4-%d1%82%d1%80%d0%b5%d0%b9%d1%82%d1%8b-traits/#comments</comments>
		<pubDate>Sun, 27 Mar 2011 20:04:50 +0000</pubDate>
		<dc:creator>bullgare</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[php 5.4]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=995</guid>
		<description><![CDATA[Вкратце: трейт (аналог mixin в Ruby) &#8211; возможность в классе использовать функционал нескольких классов в обход традиционного наследования (по-моему, костыль, чтобы не реализовывать множественное наследование). Всё сводится к новой инструкции use внутри класса, при этом класс, функциональность которого нужно подмешивать. объявляется инструкцией trait. trait Singleton { public static function getInstance() { ... } } class [...]]]></description>
			<content:encoded><![CDATA[<p>Вкратце: трейт (аналог mixin в Ruby) &#8211; возможность в классе использовать функционал нескольких классов в обход традиционного наследования (по-моему, костыль, чтобы не реализовывать множественное наследование).<br />
Всё сводится к новой инструкции <strong>use</strong> внутри класса, при этом класс, функциональность которого нужно подмешивать. объявляется инструкцией <strong>trait</strong>.</p>
<pre class="code">
trait Singleton {
    public static function getInstance() { ... }
}

class A {
    use Singleton;
    // ...
}

class B extends ArrayObject {
    use Singleton;
    // ...
}

// Singleton method is now available for both classes
A::getInstance();
B::getInstance();
</pre>
<p>Подробнее:<br />
<a href="http://simas.posterous.com/new-to-php-54-traits">New to PHP 5.4: Traits</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2011/03/%d0%bd%d0%be%d0%b2%d0%be%d0%b5-%d0%b2-php-5-4-%d1%82%d1%80%d0%b5%d0%b9%d1%82%d1%8b-traits/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Трассировка PHP-приложений с помощью xdebug</title>
		<link>http://www.job-blog.bullgare.ru/2010/07/%d1%82%d1%80%d0%b0%d1%81%d1%81%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b0-php-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b9-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c%d1%8e-xdebug/</link>
		<comments>http://www.job-blog.bullgare.ru/2010/07/%d1%82%d1%80%d0%b0%d1%81%d1%81%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b0-php-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b9-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c%d1%8e-xdebug/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 10:37:46 +0000</pubDate>
		<dc:creator>bullgare</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[xdebug]]></category>
		<category><![CDATA[отладка]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=748</guid>
		<description><![CDATA[Вот достаточно подробная статья на эту тему. В принципе достаточно написать xdebug_start_trace('&#60;Путь-к файлу&#62;.html', XDEBUG_TRACE_HTML); ... ... xdebug_stop_trace();]]></description>
			<content:encoded><![CDATA[<p>Вот достаточно подробная <a href="http://habrahabr.ru/blogs/php/31463/">статья</a> на эту тему.<br />
В принципе достаточно написать</p>
<pre class="code">
xdebug_start_trace('&lt;Путь-к файлу&gt;.html', XDEBUG_TRACE_HTML);
...
...
xdebug_stop_trace();
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2010/07/%d1%82%d1%80%d0%b0%d1%81%d1%81%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b0-php-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b9-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c%d1%8e-xdebug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Заголовки на скачивание файла</title>
		<link>http://www.job-blog.bullgare.ru/2010/01/%d0%b7%d0%b0%d0%b3%d0%be%d0%bb%d0%be%d0%b2%d0%ba%d0%b8-%d0%bd%d0%b0-%d1%81%d0%ba%d0%b0%d1%87%d0%b8%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0/</link>
		<comments>http://www.job-blog.bullgare.ru/2010/01/%d0%b7%d0%b0%d0%b3%d0%be%d0%bb%d0%be%d0%b2%d0%ba%d0%b8-%d0%bd%d0%b0-%d1%81%d0%ba%d0%b0%d1%87%d0%b8%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 12:19:06 +0000</pubDate>
		<dc:creator>bullgare</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[header]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=614</guid>
		<description><![CDATA[Чтобы при обращении по данному урлу браузер выдавал запрос на сохранение файла, нужно передать заголовки. Для этого достаточно только одного заголовка &#171;Content-Disposition: attachment; filename=\&#187;myfile.csv\&#187;\r\n&#187; Но более полно код будет выглядеть так (взято из конкретного примера на php): header("Content-Description: File Transfer\r\n"); header("Pragma: public\r\n"); header("Expires: 0\r\n"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0\r\n"); header("Cache-Control: public\r\n"); header("Content-Type: text/plain; charset=UTF-8\r\n"); header("Content-Disposition: attachment; [...]]]></description>
			<content:encoded><![CDATA[<p>Чтобы при обращении по данному урлу браузер выдавал запрос на сохранение файла, нужно передать заголовки.<br />
Для этого достаточно только одного заголовка<br />
<em>&laquo;Content-Disposition: attachment; filename=\&raquo;myfile.csv\&raquo;\r\n&raquo;</em><br />
<span id="more-614"></span><br />
Но более полно код будет выглядеть так (взято из конкретного примера на php):</p>
<pre class="code">
header("Content-Description: File Transfer\r\n");
header("Pragma: public\r\n");
header("Expires: 0\r\n");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0\r\n");
header("Cache-Control: public\r\n");
header("Content-Type: text/plain; charset=UTF-8\r\n");
header("Content-Disposition: attachment; filename=\"myfile.csv\"\r\n");
echo 123321;
</pre>
<p>В итоге будет предложено скачать файл с названием по умолчанию myfile.csv.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2010/01/%d0%b7%d0%b0%d0%b3%d0%be%d0%bb%d0%be%d0%b2%d0%ba%d0%b8-%d0%bd%d0%b0-%d1%81%d0%ba%d0%b0%d1%87%d0%b8%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Виртуальные хосты на nginx</title>
		<link>http://www.job-blog.bullgare.ru/2010/01/%d0%b2%d0%b8%d1%80%d1%82%d1%83%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d0%b5-%d1%85%d0%be%d1%81%d1%82%d1%8b-%d0%bd%d0%b0-nginx/</link>
		<comments>http://www.job-blog.bullgare.ru/2010/01/%d0%b2%d0%b8%d1%80%d1%82%d1%83%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d0%b5-%d1%85%d0%be%d1%81%d1%82%d1%8b-%d0%bd%d0%b0-nginx/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 21:35:02 +0000</pubDate>
		<dc:creator>bullgare</dc:creator>
				<category><![CDATA[администрирование]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=593</guid>
		<description><![CDATA[В двух местах прописываем. В nginx.conf добавляем раздел server: worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; server { listen 80; server_name localhost; charset utf-8; location / { root html/localhost; index index.php index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ [...]]]></description>
			<content:encoded><![CDATA[<p>В двух местах прописываем.<br />
<span id="more-593"></span><br />
В <em>nginx.conf</em> добавляем раздел <em>server</em>:</p>
<pre class="code">
worker_processes 1;

events {
	worker_connections 1024;
}

http {
	include mime.types;
	default_type application/octet-stream;

	server {
		listen 80;
		server_name localhost;

		charset utf-8;

		location / {
			root html/localhost;
			index index.php index.html index.htm;
		}

		error_page 500 502 503 504 /50x.html;
		location = /50x.html {
			root html;
		}

		location ~ \.php$ {
			root html;
			fastcgi_pass 127.0.0.1:9000;
			fastcgi_index  index.php;

			fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html/localhost$fastcgi_script_name;
			fastcgi_param  QUERY_STRING     $query_string;
			fastcgi_param  REQUEST_METHOD   $request_method;
			fastcgi_param  CONTENT_TYPE     $content_type;
			fastcgi_param  CONTENT_LENGTH   $content_length;
			include fastcgi_params;
		}
	}

	server {
		listen 80;
		server_name test-virtual;

		charset utf-8;

		location / {
			root html/test-virtual;
			index index.php index.html index.htm;
		}

		error_page 500 502 503 504 /50x.html;
		location = /50x.html {
			root html;
		}

		location ~ \.php$ {
			root html;
			fastcgi_pass 127.0.0.1:9000;
			fastcgi_index  index.php;

			fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html/test-virtual$fastcgi_script_name;
			fastcgi_param  QUERY_STRING     $query_string;
			fastcgi_param  REQUEST_METHOD   $request_method;
			fastcgi_param  CONTENT_TYPE     $content_type;
			fastcgi_param  CONTENT_LENGTH   $content_length;
			include fastcgi_params;
		}
	}
}
</pre>
<p>В <em>/etc/hosts</em> добавляем ещё один хост:</p>
<pre class="code">
127.0.0.1 localhost
127.0.0.1 test-virtual
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2010/01/%d0%b2%d0%b8%d1%80%d1%82%d1%83%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d0%b5-%d1%85%d0%be%d1%81%d1%82%d1%8b-%d0%bd%d0%b0-nginx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Дружим nginx и php-fpm</title>
		<link>http://www.job-blog.bullgare.ru/2010/01/%d0%b4%d1%80%d1%83%d0%b6%d0%b8%d0%bc-nginx-%d0%b8-php-fpm/</link>
		<comments>http://www.job-blog.bullgare.ru/2010/01/%d0%b4%d1%80%d1%83%d0%b6%d0%b8%d0%bc-nginx-%d0%b8-php-fpm/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 21:19:16 +0000</pubDate>
		<dc:creator>bullgare</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[администрирование]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[php-fpm]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=590</guid>
		<description><![CDATA[Мы уже установили nginx и php-fpm. К этому моменту при обращении к http://localhost/ выводится Welcome to nginx!, а через CLI запускаются php-скрипты. Самое время намекнуть nginx, где искать php-fpm. Для этого нужно в конфиге nginx написать примерно следующее (все нюансы этот конфиг не учитывает, но php-скрипты при этом отрабатывают): worker_processes 1; events { worker_connections 1024; [...]]]></description>
			<content:encoded><![CDATA[<p>Мы уже установили nginx и <a href="http://www.job-blog.bullgare.ru/2010/01/%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-mysql-php-%D0%B8-php-fpm-%D0%BF%D0%BE%D0%B4-debian-linux/">php-fpm</a>.<br />
К этому моменту при обращении к <a href="http://localhost/">http://localhost/</a> выводится <strong><em>Welcome to nginx!</em></strong>, а через CLI запускаются php-скрипты.<br />
Самое время намекнуть nginx, где искать php-fpm.<br />
<span id="more-590"></span><br />
Для этого нужно в конфиге nginx написать примерно следующее (все нюансы этот конфиг не учитывает, но php-скрипты при этом отрабатывают):</p>
<pre class="code">
worker_processes 1;

events {
	worker_connections 1024;
}

http {
	include mime.types;
	default_type application/octet-stream;

	server {
		listen 80;
		server_name localhost;

		charset utf-8;

		location / {
			root html;
			index index.php index.html index.htm;
		}

		error_page 500 502 503 504 /50x.html;
		location = /50x.html {
			root html;
		}

		location ~ \.php$ {
			root html;
			fastcgi_pass 127.0.0.1:9000;
			fastcgi_index  index.php;

			fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;
			fastcgi_param  QUERY_STRING     $query_string;
			fastcgi_param  REQUEST_METHOD   $request_method;
			fastcgi_param  CONTENT_TYPE     $content_type;
			fastcgi_param  CONTENT_LENGTH   $content_length;
			include fastcgi_params;
		}
	}
}
</pre>
<p>Ссылка на <a href="http://sysoev.ru/nginx/docs/http/ngx_http_fastcgi_module.html">полезный пример</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2010/01/%d0%b4%d1%80%d1%83%d0%b6%d0%b8%d0%bc-nginx-%d0%b8-php-fpm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Обратимое XOR-шифрование на PHP</title>
		<link>http://www.job-blog.bullgare.ru/2010/01/%d0%be%d0%b1%d1%80%d0%b0%d1%82%d0%b8%d0%bc%d0%be%d0%b5-xor-%d1%88%d0%b8%d1%84%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%bd%d0%b0-php/</link>
		<comments>http://www.job-blog.bullgare.ru/2010/01/%d0%be%d0%b1%d1%80%d0%b0%d1%82%d0%b8%d0%bc%d0%be%d0%b5-xor-%d1%88%d0%b8%d1%84%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%bd%d0%b0-php/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 15:12:51 +0000</pubDate>
		<dc:creator>bullgare</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[XOR]]></category>
		<category><![CDATA[шифрование]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=598</guid>
		<description><![CDATA[Понадобилось сделать обратимое XOR-шифрование с возможностью вставить зашифрованную строку в урл: class XorEncryptor { /** @var string строка-ключ */ private static $keyString = '964b07152d23'; /** * Производит непосредственно (де-)шифрование побитовым сравнением двух строк (поддерживает UTF) * @param string $InputString Строка для шифрования * @param string $KeyString Строка-ключ * @return string Зашифрованная строка */ public static [...]]]></description>
			<content:encoded><![CDATA[<p>Понадобилось сделать обратимое XOR-шифрование с возможностью вставить зашифрованную строку в урл:<br />
<span id="more-598"></span></p>
<pre class="code">
class XorEncryptor {

/** @var string строка-ключ */
	private static $keyString = '964b07152d23';

/**
 * Производит непосредственно (де-)шифрование побитовым сравнением двух строк (поддерживает UTF)
 * @param string $InputString Строка для шифрования
 * @param string $KeyString Строка-ключ
 * @return string Зашифрованная строка
 */
	public static function xorEncrypt( $InputString, $KeyString )
	{
		$KeyStringLength = mb_strlen( $KeyString );
		$InputStringLength = mb_strlen( $InputString );
		for ( $i = 0; $i < $InputStringLength; $i++ )
		{
		// Если входная строка длиннее строки-ключа
			$rPos = $i % $KeyStringLength;
		// Побитовый XOR ASCII-кодов символов
			$r = ord( $InputString[$i] ) ^ ord( $KeyString[$rPos] );
		// Записываем результат - символ, соответствующий полученному ASCII-коду
			$InputString[$i] = chr($r);
		}
		 return $InputString;
	}
/**
 * Вспомогательная функция для шифрования в строку, удобную для использования в ссылках
 * @param string $InputString
 * @return string
 */
	public static function encrypt( $InputString )
	{
		 $str = self::xorEncrypt( $InputString, self::$keyString );
		 $str = self::base64EncodeUrl( $str );
		 return $str;
	}
/**
 * Вспомогательная функция для дешифрования из строки, удобной для использования в ссылках (парный к @link self::encrypt())
 * @param string $InputString
 * @return string
 */
	public static function decrypt( $InputString )
	{
		$str = self::base64DecodeUrl( $InputString );
		$str = self::xorEncrypt( $str, self::$keyString );
		return $str;
	}
/**
 * Кодирование в base64 с заменой url-несовместимых символов
 * @param string $Str
 * @return string
 */
	public static function base64EncodeUrl( $Str )
	{
		return strtr( base64_encode( $Str ), '+/=', '-_,' );
	}
/**
 * Декодирование из base64 с заменой url-несовместимых символов (парный к @link self::base64EncodeUrl())
 * @param string $Str
 * @return string
 */
	public static function base64DecodeUrl( $Str )
	{
		return base64_decode( strtr( $Str, '-_,', '+/=' ) );
	}
}
</pre>
<p><strong>UPD</strong>:<br />
Итог работы этого скрипта мне не понравился, лучше использовать что-то вроде <a href="http://vladimirkim.livejournal.com/674.html">этого</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2010/01/%d0%be%d0%b1%d1%80%d0%b0%d1%82%d0%b8%d0%bc%d0%be%d0%b5-xor-%d1%88%d0%b8%d1%84%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%bd%d0%b0-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Установка MySQL, PHP и PHP-FPM под Debian linux</title>
		<link>http://www.job-blog.bullgare.ru/2010/01/%d1%83%d1%81%d1%82%d0%b0%d0%bd%d0%be%d0%b2%d0%ba%d0%b0-mysql-php-%d0%b8-php-fpm-%d0%bf%d0%be%d0%b4-debian-linux/</link>
		<comments>http://www.job-blog.bullgare.ru/2010/01/%d1%83%d1%81%d1%82%d0%b0%d0%bd%d0%be%d0%b2%d0%ba%d0%b0-mysql-php-%d0%b8-php-fpm-%d0%bf%d0%be%d0%b4-debian-linux/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 19:24:14 +0000</pubDate>
		<dc:creator>bullgare</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[администрирование]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[libevent]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php-fpm]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=541</guid>
		<description><![CDATA[Установка MySQL: # apt-get install mysql-server-50 # apt-get install mysql-client-50 Скачиваем PHP и патч PHP-FPM (выбрать в списке &#187; php-fpm-0.6~5.2.patch&#187; или в командной строке wget http://launchpad.net/php-fpm/master/0.6/+download/php-fpm-0.6~5.2.patch). Распаковка php из архива bzip2 -cd php-5.2.11.tar.bz2 &#124; tar xf - Патчим php # patch -d php-5.2.11 -p1 < php-fpm-0.6~5.2.patch Тут возникли большие проблемы - после запуска ничего не [...]]]></description>
			<content:encoded><![CDATA[<p>Установка MySQL:<br />
<span id="more-541"></span></p>
<pre class="code">
# apt-get install mysql-server-50
# apt-get install mysql-client-50
</pre>
<p>Скачиваем <a href="http://ru2.php.net/get/php-5.2.11.tar.bz2/from/a/mirror">PHP</a> и <a href="https://launchpad.net/php-fpm/+download">патч PHP-FPM</a> (выбрать в списке &raquo; php-fpm-0.6~5.2.patch&raquo; или в командной строке <em>wget http://launchpad.net/php-fpm/master/0.6/+download/php-fpm-0.6~5.2.patch</em>).<br />
Распаковка php из архива</p>
<pre class="code">
bzip2 -cd php-5.2.11.tar.bz2 | tar xf -
</pre>
<p>Патчим php</p>
<pre class="code">
# patch -d php-5.2.11 -p1 < php-fpm-0.6~5.2.patch
</pre>
<p>Тут возникли большие проблемы - после запуска ничего не выводит, но вроде выполняется. Оказалось - забыл "<" написать.<br />
Далее устанавливаем php</p>
<pre class="code">
# cd php-5.2.11
# ./buildconf --force
</pre>
<p>Указываем конфигурационные параметры</p>
<pre class="code">
./configure --enable-fastcgi --with-fpm --with-mcrypt --with-zlib --enable-mbstring --with-mysql --with-mysql-sock --with-mysqli=shared,/usr/bin/mysql_config --with-gd --with-jpeg-dir=/usr/lib --enable-gd-native-ttf --without-sqlite --disable-pdo --disable-reflection --disable-embedded-mysqli </pre>
<p>Пришлось повозиться с libxml, zlib, libjpeg, libpng, libmcrypt, mysql unix socket</p>
<pre class="code">
# apt-get install libxml2-dev
# apt-get install zlib-bin
# apt-get install zlib1g-dev
# apt-get install libjpeg-dev
# apt-get install libpng-dev
# apt-get install libmcrypt-dev
# apt-get install libmysqlclient15-dev  (после этого появляется директория /usr/bin/mysql_config)
</pre>
<p>Далее возимся с libevent (т.к. пишет <em>Libevent minimum version >= 1.4.3 could not be found.</em>):</p>
<pre class="code">
# apt-get remove --purge libevent1 //удаляем старый
</pre>
<p>Потом <a href="http://monkey.org/~provos/libevent/">скачиваем</a> новый libevent и устанавливаем:</p>
<pre class="code">
# ./configure
# make &#038;&#038; make install
</pre>
<p>))<br />
(можно посмотреть <a href="http://www.lullabot.com/articles/how_install_memcache_debian_etch">эту статью</a>)<br />
В итоге всё ставится в <em>/usr/local/lib/php/</em> (<em>/usr/local/bin/</em> &#8211; CLI-бинарник).<br />
Осталось прописать php-fpm в автозагрузку (я обошёлся без создания символической ссылки):</p>
<pre class="code">
# ln -s /usr/local/bin/php-fpm /etc/init.d/php-fpm
# /usr/sbin/update-rc.d -f php-fpm defaults
</pre>
<p>(см. <a href="http://www.job-blog.bullgare.ru/2010/01/%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9-%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8-%D0%B2-linux/">Создание символической ссылки в linux</a>).<br />
Если при вводе <em>php-fpm start</em> ругается <em> [ERROR] fpm_unix_conf_wp(), line 114: cannot get gid for group &#8216;nobody&#8217;, pool &#8216;default&#8217;</em>, то нужно попробовать создать группу &#8216;nobody&#8217;:</p>
<pre class="code">
# groupadd nobody
</pre>
<p>Вроде бы всё.<br />
Файл конфига &#8211; в <em>/etc/php-fpm.conf</em> , логи пишутся в <em>/var/log/php-fpm.log</em>, айди родительского процесса задано здесь &#8211; <em>/var/run/php-fpm.pid</em>. Сам php установлен здесь &#8211; <em>/usr/local/include/php</em>.</p>
<p>Полезные ссылки по теме:<br />
<a href="http://php-fpm.org/wiki/Documentation">официальная wiki проекта</a><br />
<a href="http://groups.google.com/group/highload-php-ru/browse_thread/thread/93e19beec78cc1db?pli=1">faq по сборке php на debian</a><br />
наткнулся на статью <a href="http://habrahabr.ru/blogs/linux/78356/">Установка PHP-FPM на Debian из пакетов</a> &#8211; может кому понадобится<br />
ещё 3 фака по установке и настройке связки php-fpm + nginx &#8211; <a href="http://adityo.blog.binusian.org/?p=428">1</a> и <a href="http://ochreblog.ochredevelopment.com/?p=13">2</a>, <a href="http://habrahabr.ru/blogs/server_side_optimization/67152/">3</a> (для freeBSD).</p>
<p>Кстати, долго выводилась надпись после того, как всё конфигурировалось:<br />
&laquo;<em>Thank you for using PHP.<br />
Notice: Following unknown configure options were used:<br />
&#8211;with-fpm</em>&raquo;<br />
Дело было в забытом ключе <em>patch -d php-5.2.11 <strong>-p1</strong> < php-fpm-0.6~5.2.patch</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2010/01/%d1%83%d1%81%d1%82%d0%b0%d0%bd%d0%be%d0%b2%d0%ba%d0%b0-mysql-php-%d0%b8-php-fpm-%d0%bf%d0%be%d0%b4-debian-linux/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Паттерны проектирования с подробными описаниями и с примерами</title>
		<link>http://www.job-blog.bullgare.ru/2009/12/%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f-%d1%81-%d0%bf%d0%be%d0%b4%d1%80%d0%be%d0%b1%d0%bd%d1%8b%d0%bc/</link>
		<comments>http://www.job-blog.bullgare.ru/2009/12/%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f-%d1%81-%d0%bf%d0%be%d0%b4%d1%80%d0%be%d0%b1%d0%bd%d1%8b%d0%bc/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 12:04:40 +0000</pubDate>
		<dc:creator>bullgare</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[пат]]></category>
		<category><![CDATA[патт]]></category>
		<category><![CDATA[паттерн]]></category>
		<category><![CDATA[паттерны проектирования]]></category>
		<category><![CDATA[ссы]]></category>
		<category><![CDATA[Ссылки]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=526</guid>
		<description><![CDATA[http://sourcemaking.com/design_patterns]]></description>
			<content:encoded><![CDATA[<p><a href="http://sourcemaking.com/design_patterns">http://sourcemaking.com/design_patterns</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2009/12/%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f-%d1%81-%d0%bf%d0%be%d0%b4%d1%80%d0%be%d0%b1%d0%bd%d1%8b%d0%bc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

