<?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>Ars Longa, Vita Brevis &#187; ошибка</title>
	<atom:link href="http://blog.sjinks.pro/tag/bug/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sjinks.pro</link>
	<description>Quod scripsi, scripsi</description>
	<lastBuildDate>Fri, 10 Sep 2010 16:40:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Core Control: лечим некорректное отображение методов в модуле cron</title>
		<link>http://blog.sjinks.pro/wordpress/patches/815-core-control-cron-module-bugfix/</link>
		<comments>http://blog.sjinks.pro/wordpress/patches/815-core-control-cron-module-bugfix/#comments</comments>
		<pubDate>Fri, 10 Sep 2010 16:18:52 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Патчи]]></category>
		<category><![CDATA[Core Control]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=815</guid>
		<description><![CDATA[Есть один замечательный плагин для разработчиков, называется Core Control. Данный плагин позволяет контролировать различные аспекты работы WordPress: транспорт HTTP (например, расширение PHP HTTP, cURL, потоки PHP и т.п.), протоколирование HTTP-запросов, контроль обновлений ядра, плагинов и тем, способы доступа к файловой системе, а также отображение запланированных задач. Работая над одним плагином, в котором усиленно использовалось планирование заданий, мы [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/wordpress/patches/815-core-control-cron-module-bugfix/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<p>Есть один замечательный плагин для разработчиков, называется <a href="http://wordpress.org/extend/plugins/core-control/">Core Control</a>. Данный плагин позволяет контролировать различные аспекты работы <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Posts tagged with WordPress">WordPress</a>: транспорт HTTP (например, расширение <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">PHP</a> HTTP, cURL, потоки <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">PHP</a> и т.п.), протоколирование HTTP-запросов, контроль обновлений ядра, плагинов и тем, способы доступа к файловой системе, а также отображение запланированных задач.<span id="more-815"></span></p>
<p>Работая над одним плагином, в котором усиленно использовалось планирование заданий, мы столкнулись с проблемой, что cron-модуль плагина <a href="http://blog.sjinks.pro/tag/core-control/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Core Control">Core Control</a> неправильно отображает запланированные задания, если задание представлено не обычной функцией, а методом класса:</p>
<p><a href="http://static.sjinks.info/wp-content/uploads/2010/09/cron-tasks.png"><img src="http://static.sjinks.info/wp-content/uploads/2010/09/cron-tasks-300x110.png" alt="Запланированные задания" title="Scheduled Tasks" width="300" height="110" class="alignnone size-medium wp-image-816" /></a>.</p>
<p>К счастью, исправляется довольно легко.</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8152">
        <div class="code diff" id="p815code2">
--- core-control/modules/core_control_cron.php.orig 2010-09-10 09:20:08.000000000 -0400<br />
<span class="re4">+++ core-control/modules/core_control_cron.php&nbsp; <span class="nu0">2010</span>-09-<span class="nu0">10</span> 09:<span class="nu0">31</span>:<span class="nu0">38.000000000</span> -0400</span><br />
<span class="re6">@@ -<span class="nu0">138</span>,<span class="nu0">8</span> +<span class="nu0">138</span>,<span class="nu0">23</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span> isset<span class="br0">&#40;</span>$GLOBALS<span class="br0">&#91;</span>'wp_filter'<span class="br0">&#93;</span><span class="br0">&#91;</span>$hook<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $functions = array<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach <span class="br0">&#40;</span> <span class="br0">&#40;</span>array<span class="br0">&#41;</span>$GLOBALS<span class="br0">&#91;</span>'wp_filter'<span class="br0">&#93;</span><span class="br0">&#91;</span>$hook<span class="br0">&#93;</span> as $priority =&gt; $function <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach <span class="br0">&#40;</span> $function as $hook_details <span class="br0">&#41;</span></span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $functions<span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="br0">&#40;</span>isset<span class="br0">&#40;</span>$hook_details<span class="br0">&#91;</span>'class'<span class="br0">&#93;</span><span class="br0">&#41;</span> ? $hook_details<span class="br0">&#91;</span>'class'<span class="br0">&#93;</span> . '::' : ''<span class="br0">&#41;</span> . $hook_details<span class="br0">&#91;</span>'function'<span class="br0">&#93;</span> . '<span class="br0">&#40;</span><span class="br0">&#41;</span>';</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach <span class="br0">&#40;</span> $function as $hook_details <span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $hook = '';</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $f &nbsp; &nbsp;= $hook_details<span class="br0">&#91;</span>'function'<span class="br0">&#93;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>is_array<span class="br0">&#40;</span>$f<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>is_object<span class="br0">&#40;</span>$f<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $hook = get_class<span class="br0">&#40;</span>$f<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $hook = $f<span class="br0">&#91;</span>0<span class="br0">&#93;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $hook .= '::' . $f<span class="br0">&#91;</span>1<span class="br0">&#93;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $hook = $f;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $functions<span class="br0">&#91;</span><span class="br0">&#93;</span> = $hook . '<span class="br0">&#40;</span><span class="br0">&#41;</span>';</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo '&lt;br/&gt;&lt;strong&gt;Hooked functions:&lt;/strong&gt; ' . implode<span class="br0">&#40;</span>', ', $functions<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
        </div>
    </div>
</div>

<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/wordpress/patches/815-core-control-cron-module-bugfix/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.sjinks.pro/wordpress/patches/201-patch-for-wassup-16/" title="Патч для WassUp 1.6 (Июнь 20, 2008)">Патч для WassUp 1.6</a> (2)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/plugins/808-making-google-xml-sitemaps-work-with-wordpress-multisite/" title="Как заставить Google XML Sitemaps дружить с WordPress MultiSite (Август 23, 2010)">Как заставить Google XML Sitemaps дружить с WordPress MultiSite</a> (0)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/patches/370-wordpress-27-and-simple-tags/" title="WordPress 2.7 и Simple Tags (Ноябрь 22, 2008)">WordPress 2.7 и Simple Tags</a> (3)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/patches/372-simple-tags-auto-link-tags-in-russian/" title="Simple Tags и автоматические ссылки меток на русском языке (Ноябрь 22, 2008)">Simple Tags и автоматические ссылки меток на русском языке</a> (17)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/patches/782-simple-tags-1-7-4-4-the-new-bugs/" title="Simple Tags 1.7.4.4: The New Bugs (Март 23, 2010)">Simple Tags 1.7.4.4: The New Bugs</a> (5)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/patches/815-core-control-cron-module-bugfix/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Как заставить Google XML Sitemaps дружить с WordPress MultiSite</title>
		<link>http://blog.sjinks.pro/wordpress/plugins/808-making-google-xml-sitemaps-work-with-wordpress-multisite/</link>
		<comments>http://blog.sjinks.pro/wordpress/plugins/808-making-google-xml-sitemaps-work-with-wordpress-multisite/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 15:35:56 +0000</pubDate>
		<dc:creator>Wandering Soul</dc:creator>
				<category><![CDATA[Плагины WordPress]]></category>
		<category><![CDATA[Google XML Sitemaps]]></category>
		<category><![CDATA[multisite]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=808</guid>
		<description><![CDATA[При попытке использования плагина Google XML Sitemaps с WordPress 3.0 в конфигурации multisite, плагин обижается и работать категорически отказывается: Google XML Sitemaps is not multisite compatible. Unfortunately the Google XML Sitemaps plugin was not tested with the multisite feature of WordPress 3.0 yet. The plugin will not be active until you disable the multisite mode. Otherwise [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/wordpress/plugins/808-making-google-xml-sitemaps-work-with-wordpress-multisite/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<p>При попытке использования плагина <a href="http://wordpress.org/extend/plugins/google-sitemap-generator/">Google XML Sitemaps</a> с <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Posts tagged with WordPress">WordPress</a> 3.0 в конфигурации <a href="http://blog.sjinks.pro/tag/multisite/" class="st_tag internal_tag" rel="tag" title="Posts tagged with multisite">multisite</a>, плагин обижается и работать категорически отказывается:</p>
<blockquote>Google XML Sitemaps is not <a href="http://blog.sjinks.pro/tag/multisite/" class="st_tag internal_tag" rel="tag" title="Posts tagged with multisite">multisite</a> compatible.<br />
Unfortunately the Google XML Sitemaps plugin was not tested with the <a href="http://blog.sjinks.pro/tag/multisite/" class="st_tag internal_tag" rel="tag" title="Posts tagged with multisite">multisite</a> feature of <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Posts tagged with WordPress">WordPress</a> 3.0 yet. The plugin will not be active until you disable the <a href="http://blog.sjinks.pro/tag/multisite/" class="st_tag internal_tag" rel="tag" title="Posts tagged with multisite">multisite</a> mode. Otherwise go to active plugins and deactivate the Google XML Sitemaps plugin to make this message disappear.</blockquote>
<p>Это раздражает. Но к счастью, проблема решаема.<span id="more-808"></span></p>
<p>Открываем файл <code>wp-content/plugins/google-sitemap-generator/sitemap.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">php</a></code>, ищем строки:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8085">
        <div class="code php" id="p808code5">
<ol class="php" style="font-family:monospace;" start="51"><li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Check for 3.0 multisite, NOT supported yet!</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="br0">&#40;</span><span class="kw3">defined</span><span class="br0">&#40;</span><span class="st_h">'WP_ALLOW_MULTISITE'</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> WP_ALLOW_MULTISITE<span class="br0">&#41;</span> <span class="sy0">||</span> <span class="br0">&#40;</span><span class="kw3">function_exists</span><span class="br0">&#40;</span><span class="st_h">'is_multisite'</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> is_multisite<span class="br0">&#40;</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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">function_exists</span><span class="br0">&#40;</span><span class="st_h">'is_super_admin'</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> is_super_admin<span class="br0">&#40;</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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; add_action<span class="br0">&#40;</span><span class="st_h">'admin_notices'</span><span class="sy0">,</span> &nbsp;<span class="kw1">array</span><span class="br0">&#40;</span><span class="st_h">'GoogleSitemapGeneratorLoader'</span><span class="sy0">,</span> <span class="st_h">'AddMultisiteWarning'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> &nbsp; &nbsp; &nbsp; </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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
</ol>
        </div>
    </div>
</div>

<p>и комментируем их. Должно получиться нечто такое:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8086">
        <div class="code php" id="p808code6">
<ol class="php" style="font-family:monospace;" start="51"><li class="li1"><div class="de1"><span class="coMULTI">/*</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Check for 3.0 multisite, NOT supported yet!</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if((defined('WP_ALLOW_MULTISITE') &amp;&amp; WP_ALLOW_MULTISITE) || (function_exists('is_multisite') &amp;&amp; is_multisite())) {</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(function_exists('is_super_admin') &amp;&amp; is_super_admin()) {</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; add_action('admin_notices', &nbsp;array('GoogleSitemapGeneratorLoader', 'AddMultisiteWarning'));</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; </span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">*/</span></div></li>
</ol>
        </div>
    </div>
</div>

<p>Сохраняем, наслаждаемся.</p>
<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/wordpress/plugins/808-making-google-xml-sitemaps-work-with-wordpress-multisite/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.sjinks.pro/wordpress/patches/201-patch-for-wassup-16/" title="Патч для WassUp 1.6 (Июнь 20, 2008)">Патч для WassUp 1.6</a> (2)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/patches/370-wordpress-27-and-simple-tags/" title="WordPress 2.7 и Simple Tags (Ноябрь 22, 2008)">WordPress 2.7 и Simple Tags</a> (3)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/patches/372-simple-tags-auto-link-tags-in-russian/" title="Simple Tags и автоматические ссылки меток на русском языке (Ноябрь 22, 2008)">Simple Tags и автоматические ссылки меток на русском языке</a> (17)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/patches/782-simple-tags-1-7-4-4-the-new-bugs/" title="Simple Tags 1.7.4.4: The New Bugs (Март 23, 2010)">Simple Tags 1.7.4.4: The New Bugs</a> (5)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/plugins/757-simple-tags-1-7-4-2/" title="Simple Tags 1.7.4.2 (Февраль 3, 2010)">Simple Tags 1.7.4.2</a> (6)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/plugins/808-making-google-xml-sitemaps-work-with-wordpress-multisite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DoS для PHP через imap_fetchbody</title>
		<link>http://blog.sjinks.pro/php/807-php-dos-with-imap_fetchbody/</link>
		<comments>http://blog.sjinks.pro/php/807-php-dos-with-imap_fetchbody/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 07:04:55 +0000</pubDate>
		<dc:creator>Wandering Soul</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[IMAP]]></category>
		<category><![CDATA[segfault]]></category>
		<category><![CDATA[ошибка]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=807</guid>
		<description><![CDATA[Как оказалось, если передать функции imap_fetchbody() параметр $secton, длина которого больше 1004 байт, PHP падает по segmentation fault. На некоторых конфигурациях с применением некоторых усилий (подробности, понятное дело, разглашаться не будут) получалось вместе с PHP положить и Apache. Пример кода, убивающего PHP: imap_fetchbody($imap_handle, $message_number, &#34;3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.0&#34;); Предполагается, что $imap_handle — ресурс, возвращенный функцией imap_open(), $message_number — номер существующего сообщения в почтовом ящике. [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/php/807-php-dos-with-imap_fetchbody/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<p>Как оказалось, если передать функции <a href="http://us.php.net/manual/en/function.imap-fetchbody.php"><span class="codebox"><code class="php"><span class="kw3">imap_fetchbody</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code></span></a> параметр <code>$secton</code>, длина которого больше 1004 байт, <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">PHP</a> падает по segmentation fault. На некоторых конфигурациях с применением некоторых усилий (подробности, понятное дело, разглашаться не будут) получалось вместе с <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">PHP</a> положить и Apache.<span id="more-807"></span></p>
<p>Пример кода, убивающего <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">PHP</a>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p80717">
        <div class="code php" id="p807code17">
<span class="kw3">imap_fetchbody</span><span class="br0">&#40;</span><span class="re0">$imap_handle</span><span class="sy0">,</span> <span class="re0">$message_number</span><span class="sy0">,</span> <span class="st0">&quot;3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.0&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>Предполагается, что <code>$imap_handle</code> — ресурс, возвращенный функцией <code>imap_open()</code>, $message_number — номер существующего сообщения в почтовом ящике.</p>
<p>Анализ посмертного дампа памяти показывает, где происходит сбой:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p80718">
        <div class="code text" id="p807code18">
$ gdb /usr/bin/php core<br />
...<br />
Program terminated with signal 11, Segmentation fault.<br />
#0 &nbsp;memcpy () at ../sysdeps/x86_64/memcpy.S:398<br />
398 &nbsp; &nbsp; ../sysdeps/x86_64/memcpy.S: Нет такого файла или каталога.<br />
&nbsp; &nbsp; &nbsp; &nbsp; in ../sysdeps/x86_64/memcpy.S<br />
(gdb) bt full<br />
#0 &nbsp;memcpy () at ../sysdeps/x86_64/memcpy.S:398<br />
No locals.<br />
#1 &nbsp;0x0000000000678788 in _estrndup (s=0x7ff1797aaf4e &quot;&quot;, length=2136037704) at /usr/include/bits/string3.h:52<br />
No locals.<br />
#2 &nbsp;0x00007ff1799ce292 in zif_imap_fetchbody () from /usr/lib/php5/20090626/imap.so<br />
No symbol table info available.<br />
#3 &nbsp;0x00000000006e611a in zend_do_fcall_common_helper_SPEC (execute_data=0x7ff17f3e3068) at /build/buildd/php5-5.3.2/Zend/zend_vm_execute.h:313<br />
&nbsp; &nbsp; &nbsp; &nbsp; opline = 0x7ff17f5141a8<br />
&nbsp; &nbsp; &nbsp; &nbsp; should_change_scope = 200 '\310'<br />
...
        </div>
    </div>
</div>

<p>Видно, что ошибка произошла в функции <code>zif_imap_fetchbody()</code> (что соответствует <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">PHP</a>-функции <span class="codebox"><code class="php"><span class="kw3">imap_fetchbody</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>), когда та вызвала функцию <code>estrndup()</code> для пустой строки (адрес строки — 0x7ff1797aaf4e), но при этом передав ошибочную длину строки (<code>length=2136037704</code>). Значение <code>length</code> примерно равное двум гигабайтам в любом случае должно настораживать.</p>
<p>Пересоберём php5-imap с отладочной информацией:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p80719">
        <div class="code bash" id="p807code19">
<span class="re2">CFLAGS</span>=<span class="st0">&quot;-g3 -O2&quot;</span><br />
<span class="kw3">export</span> CFLAGS<br />
phpize<br />
.<span class="sy0">/</span>configure <span class="re5">--with-kerberos</span> <span class="re5">--with-imap-ssl</span> <span class="re2">PHP_OPENSSL</span>=<span class="st0">&quot;yes&quot;</span><br />
<span class="kw2">make</span> <span class="sy0">&amp;&amp;</span> <span class="kw2">sudo</span> <span class="kw2">make</span> <span class="kw2">install</span>
        </div>
    </div>
</div>

<p>Повторим тест. <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">PHP</a> по-прежнему должен упасть. На этот раз у нас будет больше информации о сбое:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p80720">
        <div class="code text" id="p807code20">
(gdb) bt full<br />
#0 &nbsp;memcpy () at ../sysdeps/x86_64/memcpy.S:398<br />
No locals.<br />
#1 &nbsp;0x0000000000678788 in _estrndup (s=0x7ff8881ddf4e &quot;&quot;, length=2381609288) at /usr/include/bits/string3.h:52<br />
No locals.<br />
#2 &nbsp;0x00007ff8884013c2 in zif_imap_fetchbody (ht=3, return_value=0x7ff88df465d0, return_value_ptr=&lt;value optimized out&gt;, this_ptr=&lt;value optimized out&gt;, return_value_used=&lt;value optimized out&gt;) at /opt/php-imap-5.3.2/php_imap.c:2361<br />
&nbsp; &nbsp; &nbsp; &nbsp; streamind = 0x7ff88df46670<br />
&nbsp; &nbsp; &nbsp; &nbsp; msgno = 1<br />
&nbsp; &nbsp; &nbsp; &nbsp; flags = 0<br />
&nbsp; &nbsp; &nbsp; &nbsp; body = 0x0<br />
&nbsp; &nbsp; &nbsp; &nbsp; sec = 0x7ff88df468c8 &quot;3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.&quot;...<br />
&nbsp; &nbsp; &nbsp; &nbsp; sec_len = 1005<br />
&nbsp; &nbsp; &nbsp; &nbsp; len = 140705510226248
        </div>
    </div>
</div>

<p>Теперь у нас есть номер строки, где произошел сбой (файл /opt/<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">php</a>-imap-5.3.2/php_imap.c, строка 2361).</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p80721">
        <div class="code text" id="p807code21">
(gdb) frame 2<br />
#2 &nbsp;0x00007ff8884013c2 in zif_imap_fetchbody (ht=3, return_value=0x7ff88df465d0, return_value_ptr=&lt;value optimized out&gt;, this_ptr=&lt;value optimized out&gt;, return_value_used=&lt;value optimized out&gt;) at /opt/php-imap-5.3.2/php_imap.c:2361<br />
2361 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;RETVAL_STRINGL(body, len, 1);<br />
(gdb) print len<br />
$1 = 140705510226248<br />
(gdb) print &amp;len<br />
$2 = (long unsigned int *) 0x7ffffa9bdd80<br />
(gdb) frame 1<br />
#1 &nbsp;0x0000000000678788 in _estrndup (s=0x7ff8881ddf4e &quot;&quot;, length=2381609288) at /usr/include/bits/string3.h:52<br />
warning: Source file is more recent than executable.<br />
52 &nbsp; &nbsp; &nbsp; &nbsp;return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest));<br />
(gdb) print s<br />
$3 = 0x7ff8881ddf4e &quot;&quot;<br />
(gdb) print length<br />
$4 = 2381609288
        </div>
    </div>
</div>

<p>О локальной переменной <code>len</code> сказать что-либо трудно, так как функция <code>__builtin___memcpy_chk()</code> могла ее перетереть. Придется исправлять код.</p>
<p>Находим в php_imap.c в функции <code>imap_fetchbody</code> строку</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p80722">
        <div class="code c" id="p807code22">
body <span class="sy0">=</span> mail_fetchbody_full<span class="br0">&#40;</span>imap_le_struct<span class="sy0">-&gt;</span>imap_stream<span class="sy0">,</span> msgno<span class="sy0">,</span> sec<span class="sy0">,</span> <span class="sy0">&amp;</span>len<span class="sy0">,</span> <span class="br0">&#40;</span>argc <span class="sy0">==</span> 4 <span class="sy0">?</span> flags <span class="sy0">:</span> NIL<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>и исправляем её на</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p80723">
        <div class="code c" id="p807code23">
<span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;len before = %ld<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> len<span class="br0">&#41;</span><span class="sy0">;</span><br />
body <span class="sy0">=</span> mail_fetchbody_full<span class="br0">&#40;</span>imap_le_struct<span class="sy0">-&gt;</span>imap_stream<span class="sy0">,</span> msgno<span class="sy0">,</span> sec<span class="sy0">,</span> <span class="sy0">&amp;</span>len<span class="sy0">,</span> <span class="br0">&#40;</span>argc <span class="sy0">==</span> 4 <span class="sy0">?</span> flags <span class="sy0">:</span> NIL<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;len after = %ld<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> len<span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>Пересобираем, запускаем, получаем:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p80724">
        <div class="code text" id="p807code24">
len before = 140425249339720<br />
len after = 140425249339720<br />
Segmentation fault (core dumped)
        </div>
    </div>
</div>

<p>Становится видно, что по каким-то причинам функция <code>mail_fetchbody_full()</code> может вернуть пустую строку, но при этом не установить len в 0.</p>
<p>Исправление тривиально: находим</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p80725">
        <div class="code c" id="p807code25">
<span class="kw4">unsigned</span> <span class="kw4">long</span> len<span class="sy0">;</span>
        </div>
    </div>
</div>

<p>Заменяем на</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p80726">
        <div class="code c" id="p807code26">
<span class="kw4">unsigned</span> <span class="kw4">long</span> len <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>Пересобираем, устанавливаем, запускаем — voilà, ошибка исчезла, <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">php</a> больше не падает.</p>
<p>Результат: полчаса потраченного времени, ошибка исправлена, <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">php</a> не падает.</p>
<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/php/807-php-dos-with-imap_fetchbody/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.sjinks.pro/php/785-monkey-coders/" title="Быдлокодеры хреновы :-( (Март 27, 2010)">Быдлокодеры хреновы :-(</a> (3)</li>
	<li><a href="http://blog.sjinks.pro/php/512-php-526-in-debian-lenny-unexpected-surprise/" title="PHP 5.2.6 в Debian Lenny: неожиданный сюрприз (Март 13, 2009)">PHP 5.2.6 в Debian Lenny: неожиданный сюрприз</a> (4)</li>
	<li><a href="http://blog.sjinks.pro/php/547-static-variable-inside-class-method/" title="Статические переменные внутри метода (Апрель 21, 2009)">Статические переменные внутри метода</a> (0)</li>
	<li><a href="http://blog.sjinks.pro/php/667-simple-dos-for-php/" title="Простой DoS для PHP (Октябрь 19, 2009)">Простой DoS для PHP</a> (3)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/plugins/558-redirect-plugin-by-nick-berlette/" title="Плагин Redirect от Nick Berlette (Май 15, 2009)">Плагин Redirect от Nick Berlette</a> (4)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/php/807-php-dos-with-imap_fetchbody/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Исправление ошибки в INSERT INTO … SELECT в Kohana 3 при использовании конфигурации базы данных, отличной от default</title>
		<link>http://blog.sjinks.pro/kohana/806-fix-insert-select-bug-with-non-default-db-config-in-kohana-3/</link>
		<comments>http://blog.sjinks.pro/kohana/806-fix-insert-select-bug-with-non-default-db-config-in-kohana-3/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 07:40:55 +0000</pubDate>
		<dc:creator>Wandering Soul</dc:creator>
				<category><![CDATA[Kohana]]></category>
		<category><![CDATA[Kohana 3]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[база данных]]></category>
		<category><![CDATA[ошибка]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=806</guid>
		<description><![CDATA[Ситуация: нужно выполнить запрос вида INSERT INTO `table` (`col1`, `col2`) SELECT * FROM `table` WHERE `col1` &#60;&#62; 0; Если использовать конфигурацию default, то всё отлично работает. Если же использовать другую конфигурацию, то можем получить ошибку соединения с базой данных и исключение. Например: &#60;?php // application/config/database.php // Важно, чтобы в конфигурации default нельзя было подключиться к [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/kohana/806-fix-insert-select-bug-with-non-default-db-config-in-kohana-3/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<p><strong>Ситуация:</strong> нужно выполнить запрос вида</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p80633">
        <div class="code sql" id="p806code33">
<span class="kw1">INSERT</span> <span class="kw1">INTO</span> <span class="st0">`table`</span> <span class="br0">&#40;</span><span class="st0">`col1`</span><span class="sy0">,</span> <span class="st0">`col2`</span><span class="br0">&#41;</span> <span class="kw1">SELECT</span> <span class="sy0">*</span> <span class="kw1">FROM</span> <span class="st0">`table`</span> <span class="kw1">WHERE</span> <span class="st0">`col1`</span> <span class="sy0">&lt;&gt;</span> <span class="nu0">0</span>;
        </div>
    </div>
</div>

<p>Если использовать конфигурацию <code>default</code>, то всё отлично работает. Если же использовать другую конфигурацию, то можем получить ошибку соединения с базой данных и исключение.<span id="more-806"></span></p>
<p>Например:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p80634">
        <div class="code php" id="p806code34">
<span class="kw2">&lt;?php</span><br />
<span class="co1">// application/config/database.php</span><br />
<span class="co1">// Важно, чтобы в конфигурации default нельзя было подключиться к серверу</span><br />
<span class="kw1">return</span> <span class="kw1">array</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; <span class="st_h">'test'</span> <span class="sy0">=&gt;</span> <span class="kw1">array</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'type'</span> &nbsp; &nbsp; &nbsp; <span class="sy0">=&gt;</span> <span class="st_h">'mysql'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'connection'</span> <span class="sy0">=&gt;</span> <span class="kw1">array</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'hostname'</span> &nbsp; <span class="sy0">=&gt;</span> <span class="st_h">'localhost'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'database'</span> &nbsp; <span class="sy0">=&gt;</span> <span class="st_h">'test'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'username'</span> &nbsp; <span class="sy0">=&gt;</span> <span class="st_h">'username'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'password'</span> &nbsp; <span class="sy0">=&gt;</span> <span class="st_h">'password'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'persistent'</span> <span class="sy0">=&gt;</span> <span class="kw4">FALSE</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'table_prefix'</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'charset'</span> &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="st_h">'utf8'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'caching'</span> &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="kw4">FALSE</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'profiling'</span> &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="kw4">TRUE</span><span class="sy0">,</span><br />
&nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span><br />
<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="sy1">?&gt;</span><br />
<br />
<span class="kw2">&lt;?php</span><br />
<span class="co1">// application/classes/controller/welcome.php</span><br />
<br />
<span class="kw2">class</span> Controller_Welcome <span class="kw2">extends</span> Controller<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> action_index<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">request</span><span class="sy0">-&gt;</span><span class="me1">response</span> <span class="sy0">=</span> DB<span class="sy0">::</span><span class="me2">insert</span><span class="br0">&#40;</span><span class="st_h">'test'</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="st_h">'col1'</span><span class="sy0">,</span> <span class="st_h">'col2'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">-&gt;</span><span class="me1">select</span><span class="br0">&#40;</span>DB<span class="sy0">::</span><span class="me2">select</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">from</span><span class="br0">&#40;</span><span class="st_h">'test'</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">where</span><span class="br0">&#40;</span><span class="st_h">'column1'</span><span class="sy0">,</span> <span class="st_h">'&lt;&gt;'</span><span class="sy0">,</span> <span class="st_h">'0'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">-&gt;</span><span class="me1">compile</span><span class="br0">&#40;</span>Database<span class="sy0">::</span><span class="me2">instance</span><span class="br0">&#40;</span><span class="st_h">'test'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy1">?&gt;</span>
        </div>
    </div>
</div>

<p>Важно, чтобы правая часть условия в <code>where()</code> была строкой.</p>
<p>В результате если мы запустим проект, то получим что-то вида:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p80635">
        <div class="code text" id="p806code35">
INSERT INTO `test` (`column1`, `column2`) ErrorException [ 2 ]: mysql_connect(): Access denied for user 'www-data'@'localhost' (using password: NO) ~ MODPATH/database/classes/kohana/database/mysql.php [ 56 ]
        </div>
    </div>
</div>

<p>Связано это с особенностью реализации метода <code>Kohana_Database_Query_Builder_Insert::compile()</code>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p80636">
        <div class="code php" id="p806code36">
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> compile<span class="br0">&#40;</span>Database <span class="re0">$db</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Start an insertion query</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$query</span> <span class="sy0">=</span> <span class="st_h">'INSERT INTO '</span><span class="sy0">.</span><span class="re0">$db</span><span class="sy0">-&gt;</span><span class="me1">quote_table</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span>_table<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Не интересно</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// …</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">is_array</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span>_values<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Не интересно</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// …</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$query</span> <span class="sy0">.=</span> <span class="st_h">'VALUES '</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">$groups</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Add the sub-query</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$query</span> <span class="sy0">.=</span> <span class="br0">&#40;</span>string<span class="br0">&#41;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span>_values<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$query</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Строка <span class="codebox"><code class="php"><span class="re0">$query</span> <span class="sy0">.=</span> <span class="br0">&#40;</span>string<span class="br0">&#41;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span>_values<span class="sy0">;</span></code></span> вызывает метод <code>compile()</code> для <code>SELECT</code>, но так как конфигурация базы данных не передаётся, используется конфигурация <code>default</code>.</p>
<p>Самое простое исправление очевидно: заменить строку</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p80637">
        <div class="code php" id="p806code37">
<span class="re0">$query</span> <span class="sy0">.=</span> <span class="br0">&#40;</span>string<span class="br0">&#41;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span>_values<span class="sy0">;</span>
        </div>
    </div>
</div>

<p>на </p>
          
<div class="codebox">
    <div class="the_code" style="" id="p80638">
        <div class="code php" id="p806code38">
<span class="re0">$query</span> <span class="sy0">.=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span>_values<span class="sy0">-&gt;</span><span class="me1">compile</span><span class="br0">&#40;</span><span class="re0">$db</span><span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>Тем не менее, если <code>SELECT</code> использует одну базу данных, а <code>INSERT</code> — другую, и при этом используются разные charset&#8217;ы (да, это не самое большое извращение — бывают и хуже), этого будет недостаточно. В этом случае нужно добавить дополнительный параметр в метод <code>select()</code>, указывающий, какую конфигурацию использовать. Требуемые изменения кода тривиальны, посему остаются упражнением интересующемуся читателю.</p>
<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/kohana/806-fix-insert-select-bug-with-non-default-db-config-in-kohana-3/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.sjinks.pro/kohana/805-join-support-for-delete-in-kohana-3/" title="Поддержка JOIN в запросах DELETE для Kohana 3 (Август 11, 2010)">Поддержка JOIN в запросах DELETE для Kohana 3</a> (0)</li>
	<li><a href="http://blog.sjinks.pro/mysql/327-shit-happens/" title="Чудеса&#8230; (Сентябрь 1, 2008)">Чудеса&#8230;</a> (3)</li>
	<li><a href="http://blog.sjinks.pro/mysql/43-storing-php-sessions-in-database/" title="Хранение PHP-сессий в базе данных (Март 19, 2008)">Хранение PHP-сессий в базе данных</a> (19)</li>
	<li><a href="http://blog.sjinks.pro/administering/545-backing-up-databases-to-email/" title="Резервное копирование баз данных с отправкой на email (Апрель 19, 2009)">Резервное копирование баз данных с отправкой на email</a> (0)</li>
	<li><a href="http://blog.sjinks.pro/kohana/804-patch-cache-empty-query-results-in-kohana/" title="Патч для кэширования пустых результатов запросов в Kohana (Август 11, 2010)">Патч для кэширования пустых результатов запросов в Kohana</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/kohana/806-fix-insert-select-bug-with-non-default-db-config-in-kohana-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Upstart, fork и daemon</title>
		<link>http://blog.sjinks.pro/linux/797-upstart-fork-daemon/</link>
		<comments>http://blog.sjinks.pro/linux/797-upstart-fork-daemon/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 22:49:10 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Upstart]]></category>
		<category><![CDATA[ошибка]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=797</guid>
		<description><![CDATA[У Upstart есть одна известная ошибка: неверное использование expect fork/expect daemon может подвесить initctl, после чего всякие start/stop/restart/reload &#60;service&#62; просто перестанут работать. Для полноты картины отмечу, что такой подвисший сервис не получится остановить и через /usr/sbin/service или /etc/init.d. Весёлая ошибка, но это еще не всё. Есть еще одна тонкость: если программа использует fork(), то в [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/linux/797-upstart-fork-daemon/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<p>У Upstart есть одна известная <a href="https://bugs.launchpad.net/upstart/+bug/406397">ошибка</a>: неверное использование <code>expect fork</code>/<code>expect daemon</code> может подвесить <code>initctl</code>, после чего всякие <code>start/stop/restart/reload &lt;service&gt;</code> просто перестанут работать. Для полноты картины отмечу, что такой подвисший сервис не получится остановить и через <code>/usr/sbin/service</code> или <code>/etc/init.d</code>. Весёлая ошибка, но это еще не всё.</p>
<p>Есть еще одна тонкость: если программа использует <span class="codebox"><code class="c">fork<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>, то в конфигурационном файле upstart должна присутствовать строка <code>expect fork</code>. По аналогии можно подумать, что если программа использует <span class="codebox"><code class="c">daemon<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>, то в конфигурационном файле upstart должна присутствовать строка <code>expect daemon</code>. А вот и нет!<span id="more-797"></span></p>
<p>Я всегда полагал, что вызов <code>daemon()</code> — это, грубо говоря, последовательность <code>fork()</code> + <code>setsid()</code> + <code>fork()</code>. Даже неоднократно видел такую реализация <code>daemon()</code> в скриптах autotools.</p>
<p>Но, как оказалось (по крайней мере в eglibc), <code>daemon()</code> выполняет только один вызов <code>fork()</code>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p79740">
        <div class="code c" id="p797code40">
<span class="kw4">int</span><br />
daemon<span class="br0">&#40;</span>nochdir<span class="sy0">,</span> noclose<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw4">int</span> nochdir<span class="sy0">,</span> noclose<span class="sy0">;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw4">int</span> fd<span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span>__fork<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">case</span> <span class="sy0">-</span>1<span class="sy0">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span><span class="sy0">-</span>1<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">case</span> 0<span class="sy0">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">default</span><span class="sy0">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; _exit<span class="br0">&#40;</span>0<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>__setsid<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">==</span> <span class="sy0">-</span>1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span><span class="sy0">-</span>1<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>nochdir<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>__chdir<span class="br0">&#40;</span><span class="st0">&quot;/&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>noclose<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">struct</span> stat64 st<span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>fd <span class="sy0">=</span> open_not_cancel<span class="br0">&#40;</span>_PATH_DEVNULL<span class="sy0">,</span> O_RDWR<span class="sy0">,</span> 0<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="sy0">-</span>1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>__builtin_expect <span class="br0">&#40;</span>__fxstat64 <span class="br0">&#40;</span>_STAT_VER<span class="sy0">,</span> fd<span class="sy0">,</span> <span class="sy0">&amp;</span>st<span class="br0">&#41;</span><span class="sy0">,</span> 0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">==</span> 0<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>__builtin_expect <span class="br0">&#40;</span>S_ISCHR <span class="br0">&#40;</span>st.<span class="me1">st_mode</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="nu0">0</span><br />
<span class="co2">#if defined DEV_NULL_MAJOR &amp;&amp; defined DEV_NULL_MINOR</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>st.<span class="me1">st_rdev</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">==</span> makedev <span class="br0">&#40;</span>DEV_NULL_MAJOR<span class="sy0">,</span> DEV_NULL_MINOR<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
<span class="co2">#endif</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>__dup2<span class="br0">&#40;</span>fd<span class="sy0">,</span> STDIN_FILENO<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>__dup2<span class="br0">&#40;</span>fd<span class="sy0">,</span> STDOUT_FILENO<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>__dup2<span class="br0">&#40;</span>fd<span class="sy0">,</span> STDERR_FILENO<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>fd <span class="sy0">&gt;</span> 2<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>__close <span class="br0">&#40;</span>fd<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* We must set an errno value since no<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;function call actually failed. &nbsp;*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; close_not_cancel_no_status <span class="br0">&#40;</span>fd<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; __set_errno <span class="br0">&#40;</span>ENODEV<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; close_not_cancel_no_status <span class="br0">&#40;</span>fd<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>0<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Таким образом, если программа использует <code>daemon()</code> для демонизации, безопаснее начинать с <code>expect fork</code>. Или смотреть в реализацию <code>daemon()</code>. Другой вариант — не использовать <code>upstart</code>, пока его не допилят до вменяемого состояния.</p>
<p>Мне нравится сама идея <code>upstart</code>, но текущая реализация во многом оставляет желать лучшего. В результате имеем зоопарк: традиционные <code>initrc</code>-скрипты (которые далеко не всегда просто перевести в upstart) и скрипты <code>upstart</code>. Грустно.</p>
<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/linux/797-upstart-fork-daemon/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.sjinks.pro/mysql/327-shit-happens/" title="Чудеса&#8230; (Сентябрь 1, 2008)">Чудеса&#8230;</a> (3)</li>
	<li><a href="http://blog.sjinks.pro/css/7-center-multiple-block-elements/" title="Центрирование нескольких блочных элементов (Март 10, 2008)">Центрирование нескольких блочных элементов</a> (2)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/patches/346-teaching-wordpress-to-correctly-encode-utf8-emails/" title="Учим WordPress правильно кодировать письма в UTF-8 (Сентябрь 27, 2008)">Учим WordPress правильно кодировать письма в UTF-8</a> (30)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/patches/495-deleting-parent-comment-causes-child-comments-to-be-incorrectly-displayed/" title="Удаление родительского комментария приводит к неправильному отображению дочерних комментариев (Февраль 1, 2009)">Удаление родительского комментария приводит к неправильному отображению дочерних комментариев</a> (10)</li>
	<li><a href="http://blog.sjinks.pro/uncategorized/169-weird-arithmetics/" title="Такая разная арифметика&hellip; (Май 27, 2008)">Такая разная арифметика&hellip;</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/linux/797-upstart-fork-daemon/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Как подружить Yet Another Photoblog и объектный кэш</title>
		<link>http://blog.sjinks.pro/wordpress/789-making-yapb-object-cache-work-together/</link>
		<comments>http://blog.sjinks.pro/wordpress/789-making-yapb-object-cache-work-together/#comments</comments>
		<pubDate>Thu, 08 Apr 2010 00:18:47 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[YAPB]]></category>
		<category><![CDATA[кэш]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=789</guid>
		<description><![CDATA[Один из пользователей плагина WP File Cache сообщил о конфликте с плагином Yet Another Photoblog (YAPB), проявляющейся в выдаче сообщения об ошибке вида Catchable fatal error: Object of class YapbImage could not be converted to string in /wp-includes/formatting.php on line 427 Хотя с первого взгляда на код YAPB становится ясно, что виноват ну никак не [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/wordpress/789-making-yapb-object-cache-work-together/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<p>Один из пользователей плагина <a href="http://blog.sjinks.pro/wordpress-plugins/wp-file-cache/">WP File Cache</a> сообщил о конфликте с плагином Yet Another Photoblog (YAPB), проявляющейся в выдаче сообщения об ошибке вида</p>
<p><strong>Catchable fatal error: Object of class YapbImage could not be converted to string in /wp-includes/formatting.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">php</a> on line 427</strong></p>
<p>Хотя с первого взгляда на код YAPB становится ясно, что виноват ну никак не WP File Cache, проблема тем не менее остаётся и требует решения.<span id="more-789"></span></p>
<p>Для локализации подобных проблем нужно получить трассу вызовов при помощи функции <span class="codebox"><code class="php"><span class="kw3">debug_backtrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>: результат, как правило, подсказывает, в каком направлении нужно копать.</p>
          
<div class="codebox">
    <div class="the_code" style="display: none" id="p78946">
        <div class="code text" id="p789code46">
Array<br />
(<br />
&nbsp; &nbsp; [0] =&gt; Array<br />
&nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [file] =&gt; /wp-includes/formatting.php<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [line] =&gt; 2374<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [function] =&gt; wp_check_invalid_utf8<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [args] =&gt; Array<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [0] =&gt; YapbImage Object<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [id] =&gt; 10<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [post_id] =&gt; 616<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [uri] =&gt; /wp-content/uploads/картинка2.gif<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [width] =&gt; 550<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [height] =&gt; 553<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [_thumbInfoCache] =&gt; Array<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )<br />
&nbsp; &nbsp; &nbsp; &nbsp; )<br />
<br />
&nbsp; &nbsp; [1] =&gt; Array<br />
&nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [file] =&gt; /wp-includes/post.php<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [line] =&gt; 920<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [function] =&gt; esc_attr<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [args] =&gt; Array<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [0] =&gt; YapbImage Object<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [id] =&gt; 10<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [post_id] =&gt; 616<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [uri] =&gt; /wp-content/uploads/картинка2.gif<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [width] =&gt; 550<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [height] =&gt; 553<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [_thumbInfoCache] =&gt; Array<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )<br />
&nbsp; &nbsp; &nbsp; &nbsp; )<br />
<br />
&nbsp; &nbsp; [2] =&gt; Array<br />
&nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [file] =&gt; /wp-includes/post.php<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [line] =&gt; 846<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [function] =&gt; sanitize_post_field<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [args] =&gt; Array<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [0] =&gt; image<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [1] =&gt; YapbImage Object<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [id] =&gt; 10<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [post_id] =&gt; 616<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [uri] =&gt; /wp-content/uploads/картинка2.gif<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [width] =&gt; 550<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [height] =&gt; 553<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [_thumbInfoCache] =&gt; Array<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [2] =&gt; 616<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [3] =&gt; edit<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )<br />
&nbsp; &nbsp; &nbsp; &nbsp; )<br />
<br />
&nbsp; &nbsp; [3] =&gt; Array<br />
&nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [file] =&gt; /wp-includes/post.php<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [line] =&gt; 269<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [function] =&gt; sanitize_post<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [args] =&gt; Array<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [0] =&gt; stdClass Object<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [ID] =&gt; 616<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [post_author] =&gt; 4<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [post_date] =&gt; 2010-02-15 18:46:13<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [post_date_gmt] =&gt; 2010-02-15 16:46:13<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [post_content] =&gt; Test test<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [post_title] =&gt; Test Post<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [post_category] =&gt; 0<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [post_excerpt] =&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [post_status] =&gt; publish<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [comment_status] =&gt; open<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [ping_status] =&gt; open<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [post_password] =&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [post_name] =&gt; 616<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [to_ping] =&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [pinged] =&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [post_modified] =&gt; 2010-04-07 23:19:20<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [post_modified_gmt] =&gt; 2010-04-07 21:19:20<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [post_content_filtered] =&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [post_parent] =&gt; 0<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [guid] =&gt; /uncategorized/test-post-7/<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [menu_order] =&gt; 0<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [post_type] =&gt; post<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [post_mime_type] =&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [comment_count] =&gt; 0<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [ec3_schedule] =&gt; Array<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [image] =&gt; YapbImage Object<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [id] =&gt; 10<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [post_id] =&gt; 616<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [uri] =&gt; /wp-content/uploads/картинка2.gif<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [width] =&gt; 550<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [height] =&gt; 553<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [_thumbInfoCache] =&gt; Array<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [filter] =&gt; raw<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [1] =&gt; edit<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )<br />
&nbsp; &nbsp; &nbsp; &nbsp; )<br />
<br />
&nbsp; &nbsp; [4] =&gt; Array<br />
&nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [file] =&gt; /wp-admin/includes/post.php<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [line] =&gt; 389<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [function] =&gt; get_post<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [args] =&gt; Array<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [0] =&gt; 616<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [1] =&gt; OBJECT<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [2] =&gt; edit<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )<br />
&nbsp; &nbsp; &nbsp; &nbsp; )<br />
<br />
&nbsp; &nbsp; [5] =&gt; Array<br />
&nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [file] =&gt; /wp-admin/post.php<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [line] =&gt; 161<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [function] =&gt; get_post_to_edit<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [args] =&gt; Array<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [0] =&gt; 616<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )<br />
&nbsp; &nbsp; &nbsp; &nbsp; )<br />
)
        </div>
    </div>
</div>

<p>В данном случае мы видим, что функция <code>esc_attr()</code> получает вместо строки объект класса <code>YapbImage</code>. Это происходит из-за того, что в объекте, переданном функции <code>sanitize_post()</code>, присутствует еще один объект (поле <code>image</code>).</p>
<p>Сам по себе объект внутри объекта записи/страницы в кэш попасть не может. Следовательно он либо помещается специально, либо по незнанию. Идём в функцию <code>get_posts()</code> и смотрим, из какой группы кэша берутся данные. Из группы <code>posts</code> (<span class="codebox"><code class="php"><span class="re0">$_post</span> <span class="sy0">=</span> wp_cache_get<span class="br0">&#40;</span><span class="re0">$post</span><span class="sy0">,</span> <span class="st_h">'posts'</span><span class="br0">&#41;</span></code></span>). Дальше дело техники: смотрим, где используется <code>wp_cache_xxx()</code> с группой <code>posts</code> и какие фильтры, могущие повлиять на результат, вызываются. Смотрим, на какие события вешает фильтры плагин, анализируем результат. И приходим к месту ошибки. Просто, когда знать, как.</p>
<p>Есть в <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Posts tagged with WordPress">WordPress</a> особый фильтр — называется <code>the_posts</code>. Он вызывается после получения данных о записях из БД, но перед помещением результата в кэш. Соответственно, все изменения над записями, внесённые данным фильтром, при использовании объектного кэша будут глобальными. В частности, такое происходило <a href="http://blog.portal.kharkov.ua/2008/05/10/auto_more_3/">с плагином auto_more</a>.</p>
<p>YAPB устанавливает свой обработчик для данного фильтра:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p78947">
        <div class="code php" id="p789code47">
<span class="kw2">function</span> _filter_the_posts<span class="br0">&#40;</span><span class="re0">$posts</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="re0">$i</span><span class="sy0">=</span>0<span class="sy0">,</span> <span class="re0">$len</span><span class="sy0">=</span><span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$posts</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="re0">$i</span><span class="sy0">&lt;</span><span class="re0">$len</span><span class="sy0">;</span> <span class="re0">$i</span><span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$post</span> <span class="sy0">=</span> <span class="sy0">&amp;</span><span class="re0">$posts</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">is_null</span><span class="br0">&#40;</span><span class="re0">$image</span> <span class="sy0">=</span> YapbImage<span class="sy0">::</span><span class="me2">getInstanceFromDb</span><span class="br0">&#40;</span><span class="re0">$post</span><span class="sy0">-&gt;</span><span class="me1">ID</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$post</span><span class="sy0">-&gt;</span><span class="me1">image</span> <span class="sy0">=</span> <span class="re0">$image</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$posts</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>В этом обработчике в объект записи и добавляется тот злополучный <code>YapbImage</code>, о который спотыкается <code>esc_attr()</code>.</p>
<p>С причиной ошибки разобрались, переходим к лечению.</p>
<p>Целью метода <code>_filter_the_posts()</code> было добавление объекта с информацией о картинке к записям, которые будут отображаться на странице (честно говоря, я не совсем понимаю, почему это нельзя было сделать в обработчике <code>the_content</code>).</p>
<p>В данном случае можно вместо фильтра <code>the_posts</code> использовать событие <code>loop_start</code>. В общем случае они не эквивалентны, но если записи выводятся только внутри <a href="http://codex.wordpress.org/The_Loop">The Loop</a>, то работать будет.</p>
<p>Открываем файл <code>lib/Yapb.class.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">php</a></code>, ищем строку</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p78948">
        <div class="code php" id="p789code48">
add_filter<span class="br0">&#40;</span><span class="st_h">'the_posts'</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="sy0">&amp;</span><span class="re0">$this</span><span class="sy0">,</span> <span class="st_h">'_filter_the_posts'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>Заменяем на</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p78949">
        <div class="code php" id="p789code49">
add_action<span class="br0">&#40;</span><span class="st_h">'loop_start'</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="sy0">&amp;</span><span class="re0">$this</span><span class="sy0">,</span> <span class="st_h">'_filter_the_posts'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>Затем ищем метод <code>_filter_the_posts</code> и исправляем его на такой:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p78950">
        <div class="code php" id="p789code50">
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span> _filter_the_posts<span class="br0">&#40;</span><span class="sy0">&amp;</span><span class="re0">$query</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$posts</span> <span class="sy0">=</span> <span class="re0">$query</span><span class="sy0">-&gt;</span><span class="me1">posts</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="re0">$i</span><span class="sy0">=</span>0<span class="sy0">,</span> <span class="re0">$len</span><span class="sy0">=</span><span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$posts</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="re0">$i</span><span class="sy0">&lt;</span><span class="re0">$len</span><span class="sy0">;</span> <span class="re0">$i</span><span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$post</span> <span class="sy0">=</span> <span class="sy0">&amp;</span><span class="re0">$posts</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &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="kw3">is_null</span><span class="br0">&#40;</span><span class="re0">$image</span> <span class="sy0">=</span> YapbImage<span class="sy0">::</span><span class="me2">getInstanceFromDb</span><span class="br0">&#40;</span><span class="re0">$post</span><span class="sy0">-&gt;</span><span class="me1">ID</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$post</span><span class="sy0">-&gt;</span><span class="me1">image</span> <span class="sy0">=</span> <span class="re0">$image</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Очищаем кэш и наслаждаемся прекрасной работой <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>PS: актуально для любого плагина объектного кэширования, будь то WP File Cache, SJ Object Cache или любой другой плагин.</p>
<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/wordpress/789-making-yapb-object-cache-work-together/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.sjinks.pro/wordpress/plugins/558-redirect-plugin-by-nick-berlette/" title="Плагин Redirect от Nick Berlette (Май 15, 2009)">Плагин Redirect от Nick Berlette</a> (4)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/patches/201-patch-for-wassup-16/" title="Патч для WassUp 1.6 (Июнь 20, 2008)">Патч для WassUp 1.6</a> (2)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/plugins/221-update-for-codecolorer-060/" title="Обновление для CodeColorer 0.6.0 (Июль 6, 2008)">Обновление для CodeColorer 0.6.0</a> (2)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/plugins/808-making-google-xml-sitemaps-work-with-wordpress-multisite/" title="Как заставить Google XML Sitemaps дружить с WordPress MultiSite (Август 23, 2010)">Как заставить Google XML Sitemaps дружить с WordPress MultiSite</a> (0)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/601-wp-supercache-under-high-load-part-2/" title="WP Super Cache и высокая нагрузка: часть 2 (Июль 29, 2009)">WP Super Cache и высокая нагрузка: часть 2</a> (16)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/789-making-yapb-object-cache-work-together/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Быдлокодеры хреновы :-(</title>
		<link>http://blog.sjinks.pro/php/785-monkey-coders/</link>
		<comments>http://blog.sjinks.pro/php/785-monkey-coders/#comments</comments>
		<pubDate>Sat, 27 Mar 2010 14:26:58 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Memcache]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[segfault]]></category>
		<category><![CDATA[ошибка]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=785</guid>
		<description><![CDATA[Возился сейчас с расширением Memcache; после очередного изменения кода сервер ушёл в глухую защиту и отказался реагировать на внешние раздражители. Лог Apache пестрил записями [error] child died with signal 11, в логах ядра было сказано, что PHP было очень плохо: Mar 27 07:20:02 snowboarding kernel: [501607.032560] php5[11934]: segfault at 7fc86965d190 ip 00007fc86965d190 sp 00007fc8689850e8 error [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/php/785-monkey-coders/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<p>Возился сейчас с расширением <a href="http://ua2.php.net/manual/en/book.memcache.php">Memcache</a>; после очередного изменения кода сервер ушёл в глухую защиту и отказался реагировать на внешние раздражители.<span id="more-785"></span></p>
<p>Лог Apache пестрил записями <strong>[error] child died with signal 11</strong>, в логах ядра было сказано, что <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">PHP</a> было очень плохо:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p78553">
        <div class="code txt" id="p785code53">
Mar 27 07:20:02 snowboarding kernel: [501607.032560] php5[11934]: segfault at 7fc86965d190 ip 00007fc86965d190 sp 00007fc8689850e8 error 14 in libgpg-error.so.0.4.0[7fc86c916000+3000]<br />
Mar 27 09:35:02 snowboarding kernel: [509707.070086] php5[870]: segfault at 7f58775f7190 ip 00007f58775f7190 sp 00007f587691f0e8 error 14 in librt-2.10.1.so[7f587b60e000+7000]
        </div>
    </div>
</div>

<p>Причём <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">PHP</a> мог вызвать сегфолт в любой библиотеке, что придавало охоте на баг особую пикантность. К счастью, откат кода помог локализовать баг.</p>
<p>Ошибка сегментации вызывалась следующим кодом:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p78554">
        <div class="code php" id="p785code54">
&nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">memcache</span> <span class="sy0">=</span> <span class="kw2">new</span> Memcache<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$result</span> <span class="sy0">=</span> <span class="kw4">false</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'server'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'server'</span><span class="br0">&#93;</span> <span class="kw1">as</span> <span class="re0">$x</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$result</span> <span class="sy0">|=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">memcache</span><span class="sy0">-&gt;</span><span class="me1">addServer</span><span class="br0">&#40;</span><span class="re0">$x</span><span class="br0">&#91;</span><span class="st_h">'h'</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="re0">$x</span><span class="br0">&#91;</span><span class="st_h">'p'</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="kw4">true</span><span class="sy0">,</span> <span class="re0">$x</span><span class="br0">&#91;</span><span class="st_h">'w'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Опытным путём было установлено, что когда <span class="codebox"><code class="php"><span class="re0">$x</span><span class="br0">&#91;</span><span class="st_h">'w'</span><span class="br0">&#93;</span></code></span> (вероятность выбора данного сервера) равна нулю, <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">PHP</a> вылетал с ошибкой сегментации при первом же вызове <span class="codebox"><code class="php">Memcache<span class="sy0">::</span><span class="me2">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> (кстати, при отрицательном значении веса выдаётся предупреждение и <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">PHP</a> остаётся жив). Не поленились разработчики проверить на отрицательное значение. Но почему проверку на ноль не реализовали?  Могли бы хотя бы указать допустимый диапазон значений. Козлы <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </p>
<p>Буду пробовать вместо <a href="http://blog.sjinks.pro/tag/memcache/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Memcache">Memcache</a> расширение <a href="http://ua2.php.net/manual/en/book.memcached.php">Memcached</a> — надеюсь, что там есть нормальная проверка на ошибки.</p>
<p>Мораль наступающим на те же грабли: данные нужно проверять. А то результату можно не обрадоваться.</p>
<p><strong>Update:</strong> <a href="http://pecl.php.net/bugs/bug.php?id=17167">bug report</a>.</p>
<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/php/785-monkey-coders/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.sjinks.pro/php/512-php-526-in-debian-lenny-unexpected-surprise/" title="PHP 5.2.6 в Debian Lenny: неожиданный сюрприз (Март 13, 2009)">PHP 5.2.6 в Debian Lenny: неожиданный сюрприз</a> (4)</li>
	<li><a href="http://blog.sjinks.pro/php/807-php-dos-with-imap_fetchbody/" title="DoS для PHP через imap_fetchbody (Август 16, 2010)">DoS для PHP через imap_fetchbody</a> (1)</li>
	<li><a href="http://blog.sjinks.pro/php/547-static-variable-inside-class-method/" title="Статические переменные внутри метода (Апрель 21, 2009)">Статические переменные внутри метода</a> (0)</li>
	<li><a href="http://blog.sjinks.pro/php/667-simple-dos-for-php/" title="Простой DoS для PHP (Октябрь 19, 2009)">Простой DoS для PHP</a> (3)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/plugins/558-redirect-plugin-by-nick-berlette/" title="Плагин Redirect от Nick Berlette (Май 15, 2009)">Плагин Redirect от Nick Berlette</a> (4)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/php/785-monkey-coders/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Simple Tags 1.7.4.4: The New Bugs</title>
		<link>http://blog.sjinks.pro/wordpress/patches/782-simple-tags-1-7-4-4-the-new-bugs/</link>
		<comments>http://blog.sjinks.pro/wordpress/patches/782-simple-tags-1-7-4-4-the-new-bugs/#comments</comments>
		<pubDate>Tue, 23 Mar 2010 14:04:55 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Патчи]]></category>
		<category><![CDATA[Simple Tags]]></category>
		<category><![CDATA[utf8]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=782</guid>
		<description><![CDATA[Сегодня наконец-то появилось время обновить старые плагины; в их числе оказался и Simple Tags. Честно говоря, версия 1.7.4.4 меня разочаровала: автор сломал автоматические ссылки меток. Теперь они не работают даже для английского языка. Резюмируя: в данной версии нужно исправить: автоматические ссылки меток; поддержку многобайтовых символов в автоматических ссылках; вызов register_uninstall_hook() при каждом обращении к блогу. Проблема [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/wordpress/patches/782-simple-tags-1-7-4-4-the-new-bugs/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<p>Сегодня наконец-то появилось время обновить старые плагины; в их числе оказался и Simple Tags. Честно говоря, версия 1.7.4.4 меня разочаровала: автор сломал автоматические ссылки меток. Теперь они не работают даже для английского языка.</p>
<p>Резюмируя: в данной версии нужно исправить:</p>
<ul>
<li>автоматические ссылки меток;</li>
<li><a href="http://blog.sjinks.pro/wordpress/plugins/566-simpletags-166-and-auto-link-tags-in-russian/">поддержку многобайтовых символов в автоматических ссылках</a>;</li>
<li><a href="http://blog.sjinks.pro/wordpress/plugins/757-simple-tags-1-7-4-2/">вызов <code>register_uninstall_hook()</code> при каждом обращении к блогу</a>.</li>
</ul>
<p><span id="more-782"></span></p>
<p>Проблема с автоматическими ссылками возникла из-за невнимательности автора:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p78257">
        <div class="code php" id="p782code57">
&nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">randomArray</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">link_tags</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">//...</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">// only continue if the database actually returned any links</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="kw1">isset</span><span class="br0">&#40;</span><span class="re0">$link_tags</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="kw3">is_array</span><span class="br0">&#40;</span><span class="re0">$link_tags</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$link_tags</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> <span class="nu0">0</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
        </div>
    </div>
</div>

<p>Метод <code>randomArray()</code> теперь не возвращает массив (как это было в предыдущих версиях плагина), а изменяет тот массив, который передан ему в параметрах (<span class="codebox"><code class="php"><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">link_tags</span></code></span>). Но если раньше результат <span class="codebox"><code class="php"><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">randomArray</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">link_tags</span><span class="br0">&#41;</span></code></span> присваивался переменной <span class="codebox"><code class="php"><span class="re0">$link_tags</span></code></span>, то теперь эта переменная исчезла, и условие в <span class="codebox"><code class="php"><span class="kw1">if</span></code></span> теперь всегда ложно.</p>
<p>Патч для плагина (unified diff):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p78258">
        <div class="code diff" id="p782code58">
diff -uwdBrN simple-tags/inc/client.php simple-tags.new/inc/client.php<br />
<span class="re3">--- simple-tags/inc/client.php&nbsp; <span class="nu0">2010</span>-03-<span class="nu0">23</span> <span class="nu0">14</span>:01:<span class="nu0">55.000000000</span> +0200</span><br />
<span class="re4">+++ simple-tags.new/inc/client.php&nbsp; <span class="nu0">2010</span>-03-<span class="nu0">23</span> <span class="nu0">15</span>:<span class="nu0">14</span>:<span class="nu0">40.000000000</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">122</span>,<span class="nu0">8</span> +<span class="nu0">122</span>,<span class="nu0">8</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; // Shuffle array<br />
<span class="re7">- &nbsp; &nbsp; &nbsp; $this-&gt;randomArray<span class="br0">&#40;</span>$this-&gt;link_tags<span class="br0">&#41;</span>;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; </span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; $link_tags = $this-&gt;link_tags;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; $this-&gt;randomArray<span class="br0">&#40;</span>$link_tags<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; // HTML Rel <span class="br0">&#40;</span>tag/no-follow<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; $rel = $this-&gt;buildRel<span class="br0">&#40;</span> $this-&gt;options<span class="br0">&#91;</span>'no_follow'<span class="br0">&#93;</span> <span class="br0">&#41;</span>;<br />
<span class="re6">@@ -<span class="nu0">157</span>,<span class="nu0">8</span> +<span class="nu0">157</span>,<span class="nu0">9</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $filtered = ''; // will filter text token by token<br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $match = &quot;/\b&quot; . preg_quote<span class="br0">&#40;</span>$term_name, &quot;/&quot;<span class="br0">&#41;</span> . &quot;\b/&quot;.$case;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $substitute = '&lt;a href=&quot;'.$term_link.'&quot; class=&quot;st_tag internal_tag&quot; '.$rel.' title=&quot;'. esc_attr<span class="br0">&#40;</span> sprintf<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Posts tagged with %s', 'simpletags'<span class="br0">&#41;</span>, $term_name <span class="br0">&#41;</span> <span class="br0">&#41;</span>.&quot;\&quot;&gt;$0&lt;/a&gt;&quot;;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $quoted = preg_quote<span class="br0">&#40;</span>$term_name, &quot;/&quot;<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $match = '/<span class="br0">&#40;</span>\PL|\A<span class="br0">&#41;</span><span class="br0">&#40;</span>' . $quoted . '<span class="br0">&#41;</span><span class="br0">&#40;</span>\PL|\Z<span class="br0">&#41;</span>/u'.$case;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $substitute = '$1&lt;a href=&quot;'.$term_link.'&quot; class=&quot;st_tag internal_tag&quot; '.$rel.' title=&quot;'. esc_attr<span class="br0">&#40;</span> sprintf<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Posts tagged with %s', 'simpletags'<span class="br0">&#41;</span>, $term_name <span class="br0">&#41;</span> <span class="br0">&#41;</span>.&quot;\&quot;&gt;$2&lt;/a&gt;$3&quot;;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // for efficiency only tokenize if forced to do so<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span> $must_tokenize <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
diff -uwdBrN simple-tags/inc/inc.functions.php simple-tags.new/inc/inc.functions.php<br />
<span class="re3">--- simple-tags/inc/inc.functions.php &nbsp; <span class="nu0">2010</span>-03-<span class="nu0">23</span> <span class="nu0">14</span>:01:<span class="nu0">55.000000000</span> +0200</span><br />
<span class="re4">+++ simple-tags.new/inc/inc.functions.php &nbsp; <span class="nu0">2010</span>-03-<span class="nu0">23</span> <span class="nu0">15</span>:09:<span class="nu0">06.000000000</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">4</span>,<span class="nu0">6</span> +<span class="nu0">4</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; *<br />
&nbsp; */<br />
&nbsp;function SimpleTags_Install<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re8">+ &nbsp; register_uninstall_hook <span class="br0">&#40;</span>dirname<span class="br0">&#40;</span>__FILE__<span class="br0">&#41;</span> . '/simple-tags.php', 'SimpleTags_Uninstall' <span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; $options_from_table = get_option<span class="br0">&#40;</span> STAGS_OPTIONS_NAME <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; if <span class="br0">&#40;</span> $options_from_table == false <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; $options = <span class="br0">&#40;</span>array<span class="br0">&#41;</span> include<span class="br0">&#40;</span> dirname<span class="br0">&#40;</span>__FILE__<span class="br0">&#41;</span> . '/default.options.php' <span class="br0">&#41;</span>;<br />
diff -uwdBrN simple-tags/simple-tags.php simple-tags.new/simple-tags.php<br />
<span class="re3">--- simple-tags/simple-tags.php <span class="nu0">2010</span>-03-<span class="nu0">23</span> <span class="nu0">14</span>:01:<span class="nu0">55.000000000</span> +0200</span><br />
<span class="re4">+++ simple-tags.new/simple-tags.php <span class="nu0">2010</span>-03-<span class="nu0">23</span> <span class="nu0">15</span>:07:<span class="nu0">42.000000000</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">3</span>,<span class="nu0">7</span> +<span class="nu0">3</span>,<span class="nu0">7</span> @@</span><br />
&nbsp;Plugin Name: Simple Tags<br />
&nbsp;Plugin URI: http://redmine.beapi.fr/projects/show/simple-tags<br />
&nbsp;Description: Extended Tagging for WordPress 2.8 and 2.9 ! Suggested Tags, Mass edit tags, Autocompletion, Tag Cloud Widgets, Related Posts, Related Tags, etc!<br />
<span class="re7">-Version: 1.7.4.4</span><br />
<span class="re8">+Version: 1.7.4.4.1</span><br />
&nbsp;Author: Amaury BALMER<br />
&nbsp;Author URI: http://www.herewithme.fr<br />
&nbsp;Text Domain: simpletags<br />
<span class="re6">@@ -<span class="nu0">23</span>,<span class="nu0">6</span> +<span class="nu0">23</span>,<span class="nu0">7</span> @@</span><br />
&nbsp;Contributors:<br />
&nbsp;- Kevin Drouvin <span class="br0">&#40;</span>kevin.drouvin@gmail.com - http://inside-dev.net<span class="br0">&#41;</span><br />
&nbsp;- Martin Modler <span class="br0">&#40;</span>modler@webformatik.com - http://www.webformatik.com<span class="br0">&#41;</span><br />
<span class="re8">+- Vladimir Kolesnikov &lt;vladimir at extrememember dot com&gt; - http://blog.sjinks.pro/</span><br />
&nbsp;<br />
&nbsp;Todo:<br />
&nbsp; &nbsp; Both :<br />
<span class="re6">@@ -<span class="nu0">55</span>,<span class="nu0">9</span> +<span class="nu0">56</span>,<span class="nu0">8</span> @@</span><br />
&nbsp;require<span class="br0">&#40;</span> STAGS_DIR . '/inc/tpl.functions.php'<span class="br0">&#41;</span>; // Templates functions<br />
&nbsp;require<span class="br0">&#40;</span> STAGS_DIR . '/inc/widgets.php'<span class="br0">&#41;</span>; &nbsp;&nbsp; &nbsp; // Widgets<br />
&nbsp;<br />
<span class="re7">-// Activation, uninstall</span><br />
<span class="re8">+// Activation</span><br />
&nbsp;register_activation_hook<span class="br0">&#40;</span>__FILE__, 'SimpleTags_Install' &nbsp; <span class="br0">&#41;</span>;<br />
<span class="re7">-register_uninstall_hook <span class="br0">&#40;</span>__FILE__, 'SimpleTags_Uninstall' <span class="br0">&#41;</span>;</span><br />
&nbsp;<br />
&nbsp;// Init ST<br />
&nbsp;function simple_tags_init<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        </div>
    </div>
</div>

<p>Для тех, кто патчи не любит, есть исправленная версия плагина (из исходного архива также удалены скриншоты): <strong><a href="http://d.sjinks.pro/wordpress/simple-tags-1.7.4.4.1.zip">скачать Simple Tags 1.7.4.4.1</a></strong></p>
<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/wordpress/patches/782-simple-tags-1-7-4-4-the-new-bugs/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.sjinks.pro/wordpress/patches/370-wordpress-27-and-simple-tags/" title="WordPress 2.7 и Simple Tags (Ноябрь 22, 2008)">WordPress 2.7 и Simple Tags</a> (3)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/patches/372-simple-tags-auto-link-tags-in-russian/" title="Simple Tags и автоматические ссылки меток на русском языке (Ноябрь 22, 2008)">Simple Tags и автоматические ссылки меток на русском языке</a> (17)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/plugins/757-simple-tags-1-7-4-2/" title="Simple Tags 1.7.4.2 (Февраль 3, 2010)">Simple Tags 1.7.4.2</a> (6)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/plugins/566-simpletags-166-and-auto-link-tags-in-russian/" title="Simple Tags 1.6.6 и автоматические ссылки меток на русском языке (Июнь 2, 2009)">Simple Tags 1.6.6 и автоматические ссылки меток на русском языке</a> (15)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/patches/346-teaching-wordpress-to-correctly-encode-utf8-emails/" title="Учим WordPress правильно кодировать письма в UTF-8 (Сентябрь 27, 2008)">Учим WordPress правильно кодировать письма в UTF-8</a> (30)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/patches/782-simple-tags-1-7-4-4-the-new-bugs/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Сбой OpenJDK при использовании Eclipse в Ubuntu Lucid Lynx</title>
		<link>http://blog.sjinks.pro/linux/777-openjdk-crashes-when-using-eclipse-in-ubuntu-lucid/</link>
		<comments>http://blog.sjinks.pro/linux/777-openjdk-crashes-when-using-eclipse-in-ubuntu-lucid/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 08:02:07 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Lucid Lynx]]></category>
		<category><![CDATA[OpenJDK]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[ошибка]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=777</guid>
		<description><![CDATA[Симптом: Eclipse молча погибает при редактировании файла, в /var/log/kern.log появляется подобное сообщение об ошибке: Mar 9 09:11:44 sjinks kernel: [350411.627132] java[19570] trap int3 ip:7ff3fbd74302 sp:7ff42741b030 error:0 Ключевые слова: java trap int3. Если они есть в логе, с большой вероятностью вы читаете про ту самую ошибку Багтрекер Eclipse сообщает, что сбой возникает из-за ошибки в XULRunner 1.9.1. [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/linux/777-openjdk-crashes-when-using-eclipse-in-ubuntu-lucid/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<p>Симптом: Eclipse молча погибает при редактировании файла, в <code>/var/log/kern.log</code> появляется подобное сообщение об ошибке:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p77762">
        <div class="code text" id="p777code62">
Mar &nbsp;9 09:11:44 sjinks kernel: [350411.627132] java[19570] trap int3 ip:7ff3fbd74302 sp:7ff42741b030 error:0
        </div>
    </div>
</div>

<p>Ключевые слова: <strong>java trap int3</strong>. Если они есть в логе, с большой вероятностью вы читаете про ту самую ошибку <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> <span id="more-777"></span></p>
<p>Багтрекер Eclipse <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=303372">сообщает</a>, что сбой возникает из-за <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=522635">ошибки</a> в XULRunner 1.9.1.</p>
<p>Есть два решения проблемы:</p>
<ol>
<li>Поставить XULRunner 1.9.2 из mozilla-daily ppa и добавить <code>-Dorg.eclipse.swt.browser.XULRunnerPath=/usr/lib/xulrunner-1.9.2.1pre</code> в <code>eclipse.ini</code> (после <code>-vmargs</code>). После данной операции <code>eclipse.ini</code> будет выглядеть примерно так:
          
<div class="codebox">
    <div class="the_code" style="" id="p77763">
        <div class="code text" id="p777code63">
-startup<br />
plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar<br />
--launcher.library<br />
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.0.200.v20090519<br />
-product<br />
org.eclipse.epp.package.cpp.product<br />
-showsplash<br />
org.eclipse.platform<br />
--launcher.XXMaxPermSize<br />
256m<br />
-vmargs<br />
-Dorg.eclipse.swt.browser.XULRunnerPath=/usr/lib/xulrunner-1.9.2.1pre<br />
-Dosgi.requiredJavaVersion=1.5<br />
-XX:MaxPermSize=256m<br />
-Xms40m<br />
-Xmx256m
        </div>
    </div>
</div>

</li>
<li>Второй вариант проще: перед запуском Eclipse установить переменную окружения <code>GRE_PATH</code> в абсолютно левый путь <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Например, у меня Eclipse запускается так:
          
<div class="codebox">
    <div class="the_code" style="" id="p77764">
        <div class="code bash" id="p777code64">
<span class="kw3">export</span> <span class="re2">GDK_NATIVE_WINDOWS</span>=<span class="kw2">true</span><br />
<span class="kw3">export</span> <span class="re2">GRE_PATH</span>=<span class="sy0">/</span>tmp<span class="sy0">/</span>aaaaaaaaaaaa<br />
<span class="sy0">/</span>opt<span class="sy0">/</span>eclipse<span class="sy0">/</span>eclipse
        </div>
    </div>
</div>

</li>
</ol>
<p>После выполнения любой из двух операций всё работает просто замечательно.</p>
<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/linux/777-openjdk-crashes-when-using-eclipse-in-ubuntu-lucid/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.sjinks.pro/linux/764-update-initramfs-error-cannot-stat/" title="cpio: ./lib/udev/firmware.sh: не удаётся stat: Нет такого файла или каталога (Февраль 10, 2010)">cpio: ./lib/udev/firmware.sh: не удаётся stat: Нет такого файла или каталога</a> (1)</li>
	<li><a href="http://blog.sjinks.pro/linux/753-love-linux/" title="Люблю Linux (Февраль 1, 2010)">Люблю Linux</a> (0)</li>
	<li><a href="http://blog.sjinks.pro/linux/230-eclipse-on-ubuntu-linux-for-64-bit-architecture/" title="Запускаем Eclipse на Ubuntu Linux на 64-битной архитектуре (Июль 12, 2008)">Запускаем Eclipse на Ubuntu Linux на 64-битной архитектуре</a> (0)</li>
	<li><a href="http://blog.sjinks.pro/linux/614-bringing-skype-back-in-ubuntu-karmic-koala-64-bit/" title="Возвращаем Skype к жизни в Ubuntu Karmic Koala на 64-битной платформе (Август 10, 2009)">Возвращаем Skype к жизни в Ubuntu Karmic Koala на 64-битной платформе</a> (2)</li>
	<li><a href="http://blog.sjinks.pro/linux/345-bringing-skype-back-in-ubuntu-intrepid-ibex-64-bit/" title="Возвращаем Skype к жизни в Ubuntu Intrepid Ibex на 64-битной платформе (Сентябрь 26, 2008)">Возвращаем Skype к жизни в Ubuntu Intrepid Ibex на 64-битной платформе</a> (15)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/linux/777-openjdk-crashes-when-using-eclipse-in-ubuntu-lucid/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Ошибка в ORM Kohana 3 при использовании префиксов таблиц</title>
		<link>http://blog.sjinks.pro/kohana/772-bug-in-kohana-3-orm-when-using-table-prefixes/</link>
		<comments>http://blog.sjinks.pro/kohana/772-bug-in-kohana-3-orm-when-using-table-prefixes/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 11:00:51 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Kohana]]></category>
		<category><![CDATA[Kohana 3]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[патч]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=772</guid>
		<description><![CDATA[Ситуация: имеем две таблицы: пользователи и подписки: CREATE TABLE prefix_users ( id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(255) NOT NULL ); CREATE TABLE prefix_subscriptions ( id INTEGER NOT NULL PRIMARY KEY, user_id INTEGER UNSIGNED NOT NULL, some_data TEXT NOT NULL ); Один пользователь может иметь несколько подписок, одна подписка может принадлежать только одному пользователю. [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/kohana/772-bug-in-kohana-3-orm-when-using-table-prefixes/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<p>Ситуация: имеем две таблицы: пользователи и подписки:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p77272">
        <div class="code mysql" id="p772code72">
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> prefix_users <span class="br0">&#40;</span><br />
&nbsp; &nbsp; id <span class="kw4">INTEGER</span> <span class="kw10">NOT</span> <span class="kw3">NULL</span> <span class="kw1">PRIMARY KEY</span><span class="sy2">,</span><br />
&nbsp; &nbsp; name <span class="kw4">VARCHAR</span><span class="br0">&#40;</span>255<span class="br0">&#41;</span> <span class="kw10">NOT</span> <span class="kw3">NULL</span><br />
<span class="br0">&#41;</span><span class="sy2">;</span><br />
<br />
<span class="kw1">CREATE</span> <span class="kw1">TABLE</span> prefix_subscriptions <span class="br0">&#40;</span><br />
&nbsp; &nbsp; id <span class="kw4">INTEGER</span> <span class="kw10">NOT</span> <span class="kw3">NULL</span> <span class="kw1">PRIMARY KEY</span><span class="sy2">,</span><br />
&nbsp; &nbsp; user_id <span class="kw4">INTEGER</span> <span class="kw6">UNSIGNED</span> <span class="kw10">NOT</span> <span class="kw3">NULL</span><span class="sy2">,</span><br />
&nbsp; &nbsp; some_data <span class="kw4">TEXT</span> <span class="kw10">NOT</span> <span class="kw3">NULL</span><br />
<span class="br0">&#41;</span><span class="sy2">;</span>
        </div>
    </div>
</div>

<p>Один пользователь может иметь несколько подписок, одна подписка может принадлежать только одному пользователю.<span id="more-772"></span></p>
<p>Настройки соединения с базой данных (<code>application/config/database.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">php</a></code>) имеют следующий вид:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p77273">
        <div class="code php" id="p772code73">
<span class="kw1">return</span> <span class="kw1">array</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; <span class="st_h">'default'</span> <span class="sy0">=&gt;</span> <span class="kw1">array</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'type'</span> &nbsp; &nbsp; &nbsp; <span class="sy0">=&gt;</span> <span class="st_h">'mysql'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'connection'</span> <span class="sy0">=&gt;</span> <span class="kw1">array</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'hostname'</span> &nbsp; <span class="sy0">=&gt;</span> <span class="st_h">'localhost'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'username'</span> &nbsp; <span class="sy0">=&gt;</span> <span class="st_h">'user'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'password'</span> &nbsp; <span class="sy0">=&gt;</span> <span class="st_h">'pass'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'persistent'</span> <span class="sy0">=&gt;</span> <span class="kw4">FALSE</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'database'</span> &nbsp; <span class="sy0">=&gt;</span> <span class="st_h">'database'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'table_prefix'</span> <span class="sy0">=&gt;</span> <span class="st_h">'prefix_'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'charset'</span> &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="st_h">'utf8'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'caching'</span> &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="kw4">FALSE</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'profiling'</span> &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="kw4">TRUE</span><span class="sy0">,</span><br />
&nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span><br />
<span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>Модели в Kohana 3 будут иметь следующий вид:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p77274">
        <div class="code php" id="p772code74">
<span class="co1">// application/classes/model/user.php</span><br />
&nbsp; &nbsp; <span class="kw2">class</span> Model_User <span class="kw2">extends</span> ORM<br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">protected</span> <span class="re0">$_has_many</span> <span class="sy0">=</span> <span class="kw1">array</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'subscriptions'</span> <span class="sy0">=&gt;</span> <span class="kw1">array</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'foreign_key'</span> <span class="sy0">=&gt;</span> <span class="st_h">'user_id'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'model'</span> &nbsp; &nbsp; &nbsp; <span class="sy0">=&gt;</span> <span class="st_h">'Subscription'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
<span class="co1">// application/classes/model/subscription.php</span><br />
&nbsp; &nbsp; <span class="kw2">class</span> Model_Subscription <span class="kw2">extends</span> ORM<br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">protected</span> <span class="re0">$_belongs_to</span> <span class="sy0">=</span> <span class="kw1">array</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'user'</span> <span class="sy0">=&gt;</span> <span class="kw1">array</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'foreign_key'</span> <span class="sy0">=&gt;</span> <span class="st_h">'user_id'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'model'</span> &nbsp; &nbsp; &nbsp; <span class="sy0">=&gt;</span> <span class="st_h">'User'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Допустим, что в контроллере у нас есть вызов наподобие</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p77275">
        <div class="code php" id="p772code75">
ORM<span class="sy0">::</span><span class="me2">factory</span><span class="br0">&#40;</span><span class="st_h">'Subscription'</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">with</span><span class="br0">&#40;</span><span class="st_h">'user'</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">find_all</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>Что произойдёт? А ничего хорошего:</p>
<pre>
Database_Exception [ 1054 ]: Unknown column 'prefix_user.id' in 'field list' [ SELECT `prefix_user`.`id` AS `user:id`, `prefix_user`.`name` AS `user:name`, `prefix_subscriptions`.* FROM `prefix_subscriptions` LEFT JOIN `prefix_users` AS `user` ON (`prefix_user`.`id` = `prefix_subscriptions`.`user_id`) ORDER BY `prefix_subscriptions`.`id` ASC ] ~ MODPATH/database/classes/kohana/database/<a href="http://blog.sjinks.pro/tag/mysql/" class="st_tag internal_tag" rel="tag" title="Posts tagged with MySQL">mysql</a>.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">php</a> [ 183 ]
</pre>
<p>Почему? Модуль <a href="http://blog.sjinks.pro/tag/orm/" class="st_tag internal_tag" rel="tag" title="Posts tagged with ORM">ORM</a> предполагал, что запрос будет выглядеть так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p77276">
        <div class="code mysql" id="p772code76">
<span class="kw1">SELECT</span> <span class="st0">`user`</span>.<span class="st0">`id`</span> <span class="kw1">AS</span> <span class="st0">`user:id`</span><span class="sy2">,</span> <span class="st0">`user`</span>.<span class="st0">`name`</span> <span class="kw1">AS</span> <span class="st0">`user:name`</span><span class="sy2">,</span> <span class="st0">`subscriptions`</span>.<span class="sy1">*</span><br />
<span class="kw1">FROM</span> <span class="st0">`subscriptions`</span><br />
<span class="kw13">LEFT</span> <span class="kw1">JOIN</span> <span class="st0">`users`</span> <span class="kw1">AS</span> <span class="st0">`user`</span> <span class="kw1">ON</span> <span class="br0">&#40;</span><span class="st0">`user`</span>.<span class="st0">`id`</span> <span class="sy1">=</span> <span class="st0">`subscriptions`</span>.<span class="st0">`user<span class="es1">_</span>id`</span><span class="br0">&#41;</span><br />
<span class="kw1">ORDER BY</span> <span class="st0">`subscriptions`</span>.<span class="st0">`id`</span> <span class="kw1">ASC</span>
        </div>
    </div>
</div>

<p>Так бы и было, если бы таблицы не имели префикса. <code><a href="http://blog.sjinks.pro/tag/orm/" class="st_tag internal_tag" rel="tag" title="Posts tagged with ORM">ORM</a></code> передаёт <code>Database</code> поля в виде <code>user.id</code>, <code>Database</code> их экранирует в <code>`user`.`id`</code>. Проблема в том, что <code>Database</code> ничего не знает о псевдонимах таблиц (<code>users AS user</code> в <span class="codebox"><code class="mysql"><span class="kw1">JOIN</span></code></span>), а <a href="http://blog.sjinks.pro/tag/orm/" class="st_tag internal_tag" rel="tag" title="Posts tagged with ORM">ORM</a> ничего не знает о префиксах таблиц. Поэтому Database с чистой совестью добавляет префикс ко всему, что находится в именах слева от точки. В результате вместо <code>SELECT `user`.`id` AS `user:id`</code> получаем <code>SELECT `prefix_user`.`id` AS `user:id`</code>.</p>
<p>Есть два решения:</p>
<ol>
<li>Унаследовать свой класс <a href="http://blog.sjinks.pro/tag/orm/" class="st_tag internal_tag" rel="tag" title="Posts tagged with ORM">ORM</a> от Kohana_ORM и исправить в нём метод <code>with()</code>;</li>
<li>Исправить метод <span class="codebox"><code class="php">Kohana_ORM<span class="sy0">::</span><span class="me2">with</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>.</li>
</ol>
<p>Результат получится примерно одинаковым — код будет выглядеть так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p77277">
        <div class="code php" id="p772code77">
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> with<span class="br0">&#40;</span><span class="re0">$target_path</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">isset</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span>_with_applied<span class="br0">&#91;</span><span class="re0">$target_path</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Don't join anything already joined</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$this</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Split object parts</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$aliases</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">$target_path</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$target</span> &nbsp;<span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$aliases</span> <span class="kw1">as</span> <span class="re0">$alias</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Go down the line of objects to find the given target</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$parent</span> <span class="sy0">=</span> <span class="re0">$target</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$target</span> <span class="sy0">=</span> <span class="re0">$parent</span><span class="sy0">-&gt;</span>_related<span class="br0">&#40;</span><span class="re0">$alias</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="sy0">!</span> <span class="re0">$target</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Can't find related object</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$this</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Target alias is at the end</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$target_alias</span> <span class="sy0">=</span> <span class="re0">$alias</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Pop-off top alias to get the parent path (user:photo:tag becomes user:photo - the parent table prefix)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">array_pop</span><span class="br0">&#40;</span><span class="re0">$aliases</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$parent_path</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">$aliases</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$parent_path</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Use this table name itself for the parent path</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$parent_path</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span>_table_name<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span> <span class="sy0">!</span> <span class="kw1">isset</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span>_with_applied<span class="br0">&#91;</span><span class="re0">$parent_path</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// If the parent path hasn't been joined yet, do it first (otherwise LEFT JOINs fail)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">with</span><span class="br0">&#40;</span><span class="re0">$parent_path</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Add to with_applied to prevent duplicate joins</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span>_with_applied<span class="br0">&#91;</span><span class="re0">$target_path</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw4">TRUE</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Use the keys of the empty object to determine the columns</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="kw3">array_keys</span><span class="br0">&#40;</span><span class="re0">$target</span><span class="sy0">-&gt;</span>_object<span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re0">$column</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$name</span> &nbsp; <span class="sy0">=</span> <span class="st_h">'&quot;'</span><span class="sy0">.</span><span class="re0">$target_path</span><span class="sy0">.</span><span class="st_h">'&quot;.&quot;'</span><span class="sy0">.</span><span class="re0">$column</span> <span class="sy0">.</span> <span class="st_h">'&quot;'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$alias</span> &nbsp;<span class="sy0">=</span> <span class="re0">$target_path</span><span class="sy0">.</span><span class="st_h">':'</span><span class="sy0">.</span><span class="re0">$column</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Add the prefix so that load_result can determine the relationship</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">select</span><span class="br0">&#40;</span><span class="kw1">array</span><span class="br0">&#40;</span><span class="re0">$name</span><span class="sy0">,</span> <span class="re0">$alias</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">isset</span><span class="br0">&#40;</span><span class="re0">$parent</span><span class="sy0">-&gt;</span>_belongs_to<span class="br0">&#91;</span><span class="re0">$target_alias</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Parent belongs_to target, use target's primary key and parent's foreign key</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$join_col1</span> <span class="sy0">=</span> <span class="st_h">'&quot;'</span><span class="sy0">.</span><span class="re0">$target_path</span><span class="sy0">.</span><span class="st_h">'&quot;.&quot;'</span><span class="sy0">.</span><span class="re0">$target</span><span class="sy0">-&gt;</span>_primary_key<span class="sy0">.</span><span class="st_h">'&quot;'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$join_col2</span> <span class="sy0">=</span> <span class="re0">$parent_path</span><span class="sy0">.</span><span class="st_h">'.'</span><span class="sy0">.</span><span class="re0">$parent</span><span class="sy0">-&gt;</span>_belongs_to<span class="br0">&#91;</span><span class="re0">$target_alias</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'foreign_key'</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Parent has_one target, use parent's primary key as target's foreign key</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$join_col1</span> <span class="sy0">=</span> <span class="re0">$parent_path</span><span class="sy0">.</span><span class="st_h">'.'</span><span class="sy0">.</span><span class="re0">$parent</span><span class="sy0">-&gt;</span>_primary_key<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$join_col2</span> <span class="sy0">=</span> <span class="st_h">'&quot;'</span><span class="sy0">.</span><span class="re0">$target_path</span><span class="sy0">.</span><span class="st_h">'&quot;.&quot;'</span><span class="sy0">.</span><span class="re0">$parent</span><span class="sy0">-&gt;</span>_has_one<span class="br0">&#91;</span><span class="re0">$target_alias</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'foreign_key'</span><span class="br0">&#93;</span> <span class="sy0">.</span><span class="st_h">'&quot;'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Join the related object into the result</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">join</span><span class="br0">&#40;</span><span class="kw1">array</span><span class="br0">&#40;</span><span class="re0">$target</span><span class="sy0">-&gt;</span>_table_name<span class="sy0">,</span> <span class="re0">$target_path</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st_h">'LEFT'</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">on</span><span class="br0">&#40;</span><span class="re0">$join_col1</span><span class="sy0">,</span> <span class="st_h">'='</span><span class="sy0">,</span> <span class="re0">$join_col2</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$this</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Патч по объёму гораздо меньше:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p77278">
        <div class="code diff" id="p772code78">
--- kohana/modules/orm/classes/kohana/orm.php<br />
<span class="re4">+++ kohana/modules/orm/classes/kohana/orm.php</span><br />
<span class="re6">@@ -<span class="nu0">637</span>,<span class="nu0">7</span> +<span class="nu0">637</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; // Use the keys of the empty object to determine the columns<br />
&nbsp; &nbsp; &nbsp; &nbsp; foreach <span class="br0">&#40;</span>array_keys<span class="br0">&#40;</span>$target-&gt;_object<span class="br0">&#41;</span> as $column<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $name &nbsp; = $target_path.'.'.$column;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $name &nbsp; = '&quot;'.$target_path.'&quot;.&quot;'.$column . '&quot;';</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $alias &nbsp;= $target_path.':'.$column;<br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Add the prefix so that load_result can determine the relationship<br />
<span class="re6">@@ -<span class="nu0">647</span>,<span class="nu0">14</span> +<span class="nu0">647</span>,<span class="nu0">14</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>isset<span class="br0">&#40;</span>$parent-&gt;_belongs_to<span class="br0">&#91;</span>$target_alias<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Parent belongs_to target, use target's primary key and parent's foreign key<br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $join_col1 = $target_path.'.'.$target-&gt;_primary_key;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $join_col1 = '&quot;'.$target_path.'&quot;.&quot;'.$target-&gt;_primary_key.'&quot;';</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $join_col2 = $parent_path.'.'.$parent-&gt;_belongs_to<span class="br0">&#91;</span>$target_alias<span class="br0">&#93;</span><span class="br0">&#91;</span>'foreign_key'<span class="br0">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Parent has_one target, use parent's primary key as target's foreign key<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $join_col1 = $parent_path.'.'.$parent-&gt;_primary_key;<br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $join_col2 = $target_path.'.'.$parent-&gt;_has_one<span class="br0">&#91;</span>$target_alias<span class="br0">&#93;</span><span class="br0">&#91;</span>'foreign_key'<span class="br0">&#93;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $join_col2 = '&quot;'.$target_path.'&quot;.&quot;'.$parent-&gt;_has_one<span class="br0">&#91;</span>$target_alias<span class="br0">&#93;</span><span class="br0">&#91;</span>'foreign_key'<span class="br0">&#93;</span> .'&quot;';</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; // Join the related object into the result
        </div>
    </div>
</div>

<p><strong><a href='http://static.sjinks.info/wp-content/uploads/2010/02/orm.php.diff'>Скачать патч (unified diff)</a>.</strong></p>
<p>Идея в том, что имена псевдонимов заключаются в двойные кавычки — в этом случае <code>Database</code> не занимается «самодеятельностью» в виде добавления префиксов куда надо и не надо.</p>
<p><strong>Проверялось на Kohana 3.0.3</strong></p>
<p><strong><a href="http://dev.kohanaframework.org/issues/2634">Отчёт об ошибке в трекере Kohana</a></strong></p>
<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/kohana/772-bug-in-kohana-3-orm-when-using-table-prefixes/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.sjinks.pro/wordpress/patches/346-teaching-wordpress-to-correctly-encode-utf8-emails/" title="Учим WordPress правильно кодировать письма в UTF-8 (Сентябрь 27, 2008)">Учим WordPress правильно кодировать письма в UTF-8</a> (30)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/patches/495-deleting-parent-comment-causes-child-comments-to-be-incorrectly-displayed/" title="Удаление родительского комментария приводит к неправильному отображению дочерних комментариев (Февраль 1, 2009)">Удаление родительского комментария приводит к неправильному отображению дочерних комментариев</a> (10)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/patches/206-reset-password-in-wordpress-251/" title="Сброс пароля в WordPress 2.5.1 (Июнь 26, 2008)">Сброс пароля в WordPress 2.5.1</a> (5)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/431-cause-to-be-proud/" title="Повод для гордости (Декабрь 7, 2008)">Повод для гордости</a> (5)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/patches/201-patch-for-wassup-16/" title="Патч для WassUp 1.6 (Июнь 20, 2008)">Патч для WassUp 1.6</a> (2)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/kohana/772-bug-in-kohana-3-orm-when-using-table-prefixes/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
