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

<channel>
	<title>将之典藏 &#187; PHP</title>
	<atom:link href="http://xiaobin.net/category/tech/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://xiaobin.net</link>
	<description>一个社交恐惧症患者（俗称：宅男）的互联网从业生活</description>
	<lastBuildDate>Mon, 05 Jul 2010 03:12:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Vim+XDebug调试PHP</title>
		<link>http://xiaobin.net/201007/using-vim-and-xdebug-to-debug-php-code/</link>
		<comments>http://xiaobin.net/201007/using-vim-and-xdebug-to-debug-php-code/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 04:39:00 +0000</pubDate>
		<dc:creator>肖斌</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Vim]]></category>
		<category><![CDATA[Xdebug]]></category>

		<guid isPermaLink="false">http://xiaobin.net/?p=415</guid>
		<description><![CDATA[感谢老黑和鸟哥发布的《PHP调试指南》(via)。要不是他们，我可能还在用echo/var_dump调试PHP代码。是他们解救了我，引导我走向光明，感激涕零中……本文是对指南中的《Vim + Xdebug + DBGp》一章的一些补充。 原理上，这种调试方式主要依靠Vim的插件“remote PHP debugger”来实现，该插件实现了一个DBGP服务端。调试的时候Xdebug将会与服务端建立一个连接进行通信，接收服务端的调试指令并返回调试结果。 安装和配置 XDebug 安装： 机器上装有pecl，运行&#8221;pecl install xdebug&#8221;就会编译好xdebug.so； 没装pecl则需下载Xdebug源码编译安装。过程简单，见《Compiling shared PECL extensions with phpize》； 配置： 加载Xdebug扩展： zend_extension=/&#60;extension_dir&#62;/xdebug.so 配置xdebug开启dbgp远程调试 xdebug.remote_enable=on xdebug.remote_handler=dbgp Vim的Debugger插件 这个简单，只需要将插件下载回来，解压放到~/.vim/plugin目录 调试过程 用Vim打开要调试的PHP文件，按&#60;F5&#62;进入调试状态。请移步《PHP调试指南》，上面写的详细一些。 注意事项 实际过程中，如果你发现安装完成仍然无法正常的调试PHP，极可能是下面的原因造成的： 一、Xdebug加载不成功 可以通过phpinfo或者是&#8221;php -m&#8221;来确认Xdebug是不是加载成功。加载不成功的原因可能是由于PHP是&#8221;Debug Build&#8221;（可以通过phpinfo确认），那么php.ini里不应当用“zend_extension=/&#60;extension_dir&#62;/xdebug.so”，而应该用“zend_extension_debug=/&#60;extension_dir&#62;/xdebug.so”； 其它方面就是要注意xdebug.so路径是否正确，Apache服务或者是fastcgi服务有没有重启。 二、 调试会话已经过期 XDebug 通过一个Cookie来判断你是否进行调试对话，请注意这个Cookie的过期时间是1个小时。某天你埋头工作的时候发现Vim + Xdebug刚刚还work，怎么一下又不work了，那多半是由于这个会话已经过期了。 只要在URL后面带上参数 &#8220;XDEBUG_SESSION_START=1&#8243;，调试会话就会延续1小时。 三、SeLinux 我是比较痛恨SeLinux的，因为它总是在意想不到情况下出现，每次都会给带来一些“惊喜”。如果你是在Linux+Apache + mod_php 环境用Vim + Xdebug调试PHP，那难免要注意了： 要么你永远关闭SeLinux——开发机打开SeLinux没有太大的意义： 修改配置文件/etc/selinux/config，将&#8221;SELINUX=&#8221;那一句配置改成&#8221;SELINUX=disabled&#8221;，然后重启机器。 要么，放httpd一条生路，允许它访问网络： [...]]]></description>
			<content:encoded><![CDATA[<p>感谢<a href="http://blog.csdn.net/heiyeshuwu" target="_blank">老黑</a>和<a href="http://www.laruence.com/" target="_blank">鸟哥</a>发布的《<a href="http://heiyeluren-doc.googlecode.com/files/PHP-Debug-Manual-public.pdf" target="_blank">PHP调试指南</a>》(<a href="http://www.laruence.com/2010/06/21/1608.html" target="_blank">via</a>)。要不是他们，我可能还在用echo/var_dump调试PHP代码。是他们解救了我，引导我走向光明，感激涕零中……本文是对指南中的《Vim + Xdebug + DBGp》一章的一些补充。</p>
<p>原理上，这种调试方式主要依靠Vim的插件“<a href="http://www.vim.org/scripts/script.php?script_id=1152" target="_blank">remote PHP debugger</a>”来实现，该插件实现了一个<a href="http://xdebug.org/docs-dbgp.php" target="_blank">DBGP</a>服务端。调试的时候Xdebug将会与服务端建立一个连接进行通信，接收服务端的调试指令并返回调试结果。<span id="more-415"></span></p>
<h3>安装和配置</h3>
<p><strong>XDebug</strong></p>
<p><strong><span style="font-weight: normal;">安装：</span></strong></p>
<ul>
<li>机器上装有<a href="http://pecl.php.net/" target="_blank">pecl</a>，运行&#8221;pecl install xdebug&#8221;就会编译好xdebug.so；</li>
<li>没装pecl则需下载<a href="http://pecl.php.net/package/Xdebug" target="_blank">Xdebug源码</a>编译安装。过程简单，见《<a href="http://php.net/manual/en/install.pecl.phpize.php" target="_blank">Compiling shared PECL extensions with phpize</a>》；</li>
</ul>
<p>配置：</p>
<ul>
<li>加载Xdebug扩展：<br />
<blockquote><p>zend_extension=/&lt;extension_dir&gt;/xdebug.so</p></blockquote>
</li>
<li>配置xdebug开启dbgp远程调试<br />
<blockquote><p>xdebug.remote_enable=on<br />
xdebug.remote_handler=dbgp</p></blockquote>
</li>
</ul>
<p><strong>Vim的Debugger插件</strong></p>
<p><strong><span style="font-weight: normal;">这个简单，只需要将插件下载回来，解压放到~/.vim/plugin目录</span><br />
</strong></p>
<h3>调试过程</h3>
<p>用Vim打开要调试的PHP文件，按&lt;F5&gt;进入调试状态。请移步《<a href="http://heiyeluren-doc.googlecode.com/files/PHP-Debug-Manual-public.pdf" target="_blank">PHP调试指南</a>》，上面写的详细一些。</p>
<h3>注意事项</h3>
<p>实际过程中，如果你发现安装完成仍然无法正常的调试PHP，极可能是下面的原因造成的：</p>
<p>一、<span style="font-weight: bold;">Xdebug加载不成功</span></p>
<p>可以通过phpinfo或者是&#8221;php -m&#8221;来确认Xdebug是不是加载成功。加载不成功的原因可能是由于PHP是&#8221;Debug Build&#8221;（可以通过phpinfo确认），那么php.ini里不应当用“zend_extension=/<span style="font-style: italic;">&lt;extension_dir&gt;</span>/xdebug.so”，而应该用“zend_extension<span style="color: #ff0000;">_debug</span>=/<span style="font-style: italic;">&lt;extension_dir&gt;</span>/xdebug.so”；</p>
<p>其它方面就是要注意xdebug.so路径是否正确，Apache服务或者是fastcgi服务有没有重启。</p>
<p><strong>二、 调试会话已经过期</strong></p>
<p>XDebug 通过一个Cookie来判断你是否进行调试对话，请注意这个Cookie的过期时间是1个小时。某天你埋头工作的时候发现Vim + Xdebug刚刚还work，怎么一下又不work了，那多半是由于这个会话已经过期了。</p>
<p>只要在URL后面带上参数 &#8220;XDEBUG_SESSION_START=1&#8243;，调试会话就会延续1小时。</p>
<p><strong>三、SeLinux</strong></p>
<p>我是比较痛恨SeLinux的，因为它总是在意想不到情况下出现，每次都会给带来一些“惊喜”。如果你是在Linux+Apache + mod_php 环境用Vim + Xdebug调试PHP，那难免要注意了：</p>
<p>要么你永远关闭SeLinux——开发机打开SeLinux没有太大的意义：</p>
<blockquote><p>修改配置文件/etc/selinux/config，将&#8221;SELINUX=&#8221;那一句配置改成&#8221;SELINUX=disabled&#8221;，然后重启机器。</p></blockquote>
<p>要么，放httpd一条生路，允许它访问网络：</p>
<blockquote><p>执行Shell命令&#8221;setsebool -P httpd_can_network_connect=1&#8243;，然后重启Apache。</p></blockquote>
<p><strong>四、断点位置不正确</strong></p>
<p>断点位置不正确的情况下按&lt;F4&gt;，调试器根本不会在你所设置的断点暂停；如图这样的一段代码：<br />
<a href="http://big5.cc/i/xbin/2010/07/breakboint.jpg"><img class="aligncenter size-full wp-image-434" title="断点调试" src="http://big5.cc/i/xbin/2010/07/breakboint.jpg" alt="" width="178" height="114" /></a><br />
2-6行设置了5个断点，实际会发现，调试器会跳过其它行，只会第5行暂停。所以断点的位置也要注意。</p>
<h3>参考和延伸阅读</h3>
<ol>
<li><a href="http://2bits.com/articles/using-vim-and-xdebug-dbgp-for-debugging-drupal-or-any-php-application.html" target="_blank">Using vim and xdebug DBGp for debugging Drupal (or any PHP application)</a></li>
<li><a href="http://www.vim.org/scripts/script.php?script_id=1152" target="_blank">remote PHP debugger</a></li>
</ol>
<hr />
<p><strong><a href="http://xiaobin.net/201007/using-vim-and-xdebug-to-debug-php-code/">Vim+XDebug调试PHP</a></strong> | 暂无评论，<a href="http://xiaobin.net/201007/using-vim-and-xdebug-to-debug-php-code/#comments">添加评论</a>
<br>本文网址：<a href="http://xiaobin.net/201007/using-vim-and-xdebug-to-debug-php-code/">http://xiaobin.net/201007/using-vim-and-xdebug-to-debug-php-code/</a>
<br><a href="http://xiaobin.net">将之典藏</a> - 厚积而薄发，© 2005-2010. 如无特别声明，适用<a href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" target="_blank">署名-非商业性使用-相同方式共享 3.0</a>授权，你可以署名使用全部或者部分内容用于非商业性目的。</p>]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[PHP]Base32编码/解码</title>
		<link>http://xiaobin.net/201004/php-base32-encoding-and-decoding-according-rfc4648/</link>
		<comments>http://xiaobin.net/201004/php-base32-encoding-and-decoding-according-rfc4648/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 06:14:53 +0000</pubDate>
		<dc:creator>肖斌</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://xiaobin.net/?p=369</guid>
		<description><![CDATA[一时兴起研究起BASE32，其实编码解码都还算简单，按照RFC 4648 编码： 将输入字符串的每个字符转成ASCII码； 以5个bit为一组进行二进制分割，最后一个字符如果不足5位的话就补零； 补高位转回十进制作为码表索引，参照码表就得到最终编码的字串； +--first octet--+-second octet--+--third octet--+ &#124;7 6 5 4 3 2 1 0&#124;7 6 5 4 3 2 1 0&#124;7 6 5 4 3 2 1 0&#124; +-----------+---+-------+-------+---+-----------+ &#124;5 4 3 2 1 0&#124;5 4 3 2 1 0&#124;5 4 3 2 1 0&#124;5 4 3 2 1 0&#124; +--1.index--+--2.index--+--3.index--+--4.index--+ [...]]]></description>
			<content:encoded><![CDATA[<p>一时兴起研究起BASE32，其实编码解码都还算简单，按照<a title="RFC 4648" href="http://tools.ietf.org/html/rfc4648#section-6" target="_blank">RFC 4648</a></p>
<p>编码：</p>
<ol>
<li>将输入字符串的每个字符转成ASCII码；</li>
<li>以5个bit为一组进行二进制分割，最后一个字符如果不足5位的话就补零；</li>
<li>补高位转回十进制作为码表索引，参照码表就得到最终编码的字串；</li>
</ol>
<pre style="background: none; border: none; padding: 0;">         +--first octet--+-second octet--+--third octet--+
         |7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|
         +-----------+---+-------+-------+---+-----------+
         |5 4 3 2 1 0|5 4 3 2 1 0|5 4 3 2 1 0|5 4 3 2 1 0|
         +--1.index--+--2.index--+--3.index--+--4.index--+</pre>
<p>解码：</p>
<ol>
<li>参见码表，将输入字符串取得码表索引（8位）；</li>
<li>将索引去掉前面3位，转成5位；</li>
<li>组合5位，再按8位一组进行分割，就取得了字符的ASCII码；</li>
</ol>
<pre style="background: none; border: none; padding: 0;">                        1          2          3
          01234567 89012345 67890123 45678901 23456789
         +--------+--------+--------+--------+--------+
         |&lt; 1 &gt;&lt; 2| &gt;&lt; 3 &gt;&lt;|.4 &gt;&lt; 5.|&gt;&lt; 6 &gt;&lt;.|7 &gt;&lt; 8 &gt;|
         +--------+--------+--------+--------+--------+
                                                 &lt;===&gt; 8th character
                                           &lt;====&gt; 7th character
                                      &lt;===&gt; 6th character
                                &lt;====&gt; 5th character
                          &lt;====&gt; 4th character
                     &lt;===&gt; 3rd character
               &lt;====&gt; 2nd character
          &lt;===&gt; 1st character</pre>
<p><span id="more-369"></span><br />
编/解码的实例可以见JavaEye上的《<a href="http://www.javaeye.com/topic/286240" target="_blank">淘宝网的搜索关键字的编码与解码</a>》，不过由于PHP里没有byte类型，二进制串处理起来不是很直观，有变通的办法，PHP Classes上的<a href="http://www.phpclasses.org/package/3484-PHP-Encode-and-decode-data-with-MIME-base-32-encoding.html" target="_blank">Class: Base32</a>类就是用二进制串的方式，但是不是很干脆。最利落的办法可能是下面的这种用位运算方式。</p>
<p>感谢国家，感谢同事小黑热情指导。</p>
<h3>实现代码</h3>
<pre>&lt;?php
function base32_encode($input) {
    // Reference: http://www.ietf.org/rfc/rfc3548.txt
    // If you want build alphabet own, you should modify the decode section too.
    $BASE32_ALPHABET = 'abcdefghijklmnopqrstuvwxyz234567';
    $output = '';
    $v = 0;
    $vbits = 0;

    for ($i = 0, $j = strlen($input); $i &lt; $j; $i++) {
        $v &lt;&lt;= 8;
        $v += ord($input[$i]);
        $vbits += 8;

        while ($vbits &gt;= 5) {
            $vbits -= 5;
            $output .= $BASE32_ALPHABET[$v &gt;&gt; $vbits];
            $v &amp;= ((1 &lt;&lt; $vbits) - 1);
        }
    }

    if ($vbits &gt; 0) {
        $v &lt;&lt;= (5-$vbits);
        $output .= $BASE32_ALPHABET[$v];
    }

    return $output;
}

function base32_decode($input) {
    $output = '';
    $v = 0;
    $vbits = 0;

    for($i = 0, $j = strlen($input); $i &lt; $j; $i++) {
        $v &lt;&lt;= 5;
        if ($input[$i] &gt;= 'a' &amp;&amp; $input[$i] &lt;= 'z') {
            $v += (ord($input[$i]) - 97);
        }
        elseif ($input[$i] &gt;= '2' &amp;&amp; $input[$i] &lt;= '7') {
            $v += (24 + $input[$i]);
        }
        else {
            exit(1);
        }

        $vbits += 5;
        while($vbits &gt;= 8){
            $vbits -= 8;
            $output .= chr($v &gt;&gt; $vbits);
            $v &amp;= ((1 &lt;&lt; $vbits) - 1);
        }
    }
    return $output;
}

$encode = base32_encode('肖斌-http://xiaobin.net/');
$decode = base32_decode($encode);
var_dump($encode, $decode);
?&gt;</pre>
<hr />
<p><strong><a href="http://xiaobin.net/201004/php-base32-encoding-and-decoding-according-rfc4648/">[PHP]Base32编码/解码</a></strong> | 暂无评论，<a href="http://xiaobin.net/201004/php-base32-encoding-and-decoding-according-rfc4648/#comments">添加评论</a>
<br>本文网址：<a href="http://xiaobin.net/201004/php-base32-encoding-and-decoding-according-rfc4648/">http://xiaobin.net/201004/php-base32-encoding-and-decoding-according-rfc4648/</a>
<br><a href="http://xiaobin.net">将之典藏</a> - 厚积而薄发，© 2005-2010. 如无特别声明，适用<a href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" target="_blank">署名-非商业性使用-相同方式共享 3.0</a>授权，你可以署名使用全部或者部分内容用于非商业性目的。</p>]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>基于位运算的权限控制</title>
		<link>http://xiaobin.net/200906/bitwise-permission/</link>
		<comments>http://xiaobin.net/200906/bitwise-permission/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 02:48:26 +0000</pubDate>
		<dc:creator>肖斌</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[位运算]]></category>

		<guid isPermaLink="false">http://blog.amumu.com/?p=22</guid>
		<description><![CDATA[原理 在Linux文件系统中，一个用户对文件或目录所拥有的权限分为三种：&#8221;可读&#8221;、&#8221;可写&#8221;和&#8221;可执行&#8221;，分别用 1 、2 和 4 来表示，它们之间可以任意组合：有“可读”、“可写”权限就用 3 来表示（1 + 2 = 3）；有”可读“、”可执行“权限就用5来表示（1 + 4 = 5），三种权限全部拥有就用 7 表示（1 + 2 + 4 = 7）。 实际上，这种运算是基于二进制的。 假设可执行、可写、可读三种权限分别对应三个状态位，如果用户具有某种权限，那么将对应的状态位标识为“1”，反之则标识为“0”。如图： 如果只有“可读”权限，那么就对应二进制数：001，将这个二进制数转成十进制就得到1；如果同时具有“可读”、“可写”权限，二进制数则对应为： 011，转十进制得：3；同理，三种权限都有的，十进制就等于7。 实现 在PHP中，通过位运算符很容易就可以做到类似的权限控制： &#60;?php //定义权限 define('READ', 1&#60;&#60; 0); // 把可读权限放在最右边 define('WRITE', 1&#60;&#60;1); // 可读权限向左移一位 define('EXCUTE', 1&#60;&#60;2); // 可执行权限向左移两位 //赋予权限 $user_permission = READ &#124; WRITE; //验证权限 echo '可读：', [...]]]></description>
			<content:encoded><![CDATA[<h3>原理</h3>
<p>在Linux文件系统中，一个用户对文件或目录所拥有的权限分为三种：&#8221;可读&#8221;、&#8221;可写&#8221;和&#8221;可执行&#8221;，分别用 1 、2 和 4 来表示，它们之间可以任意组合：有“可读”、“可写”权限就用 3 来表示（1 + 2 = 3）；有”可读“、”可执行“权限就用5来表示（1 + 4 = 5），三种权限全部拥有就用 7 表示（1 + 2 + 4 = 7）。</p>
<p>实际上，这种运算是基于二进制的。<span id="more-22"></span></p>
<p>假设可执行、可写、可读三种权限分别对应三个状态位，如果用户具有某种权限，那么将对应的状态位标识为“1”，反之则标识为“0”。如图：</p>
<p><img class="aligncenter size-full wp-image-32" title="位运算与权限控制" src="http://big5.cc/i/xbin/2009/09/2442391910.png" alt="位运算与权限控制" width="231" height="180" /></p>
<p style="text-align: center;">
<p>如果只有“可读”权限，那么就对应二进制数：001，将这个二进制数转成十进制就得到1；如果同时具有“可读”、“可写”权限，二进制数则对应为： 011，转十进制得：3；同理，三种权限都有的，十进制就等于7。</p>
<h3>实现</h3>
<p>在PHP中，通过<a href="http://www.php.net/language.operators.bitwise" target="_blank">位运算符</a>很容易就可以做到类似的权限控制：</p>
<pre>&lt;?php
//定义权限
define('READ', 1&lt;&lt; 0);    // 把可读权限放在最右边
define('WRITE', 1&lt;&lt;1);    // 可读权限向左移一位
define('EXCUTE', 1&lt;&lt;2);   // 可执行权限向左移两位

//赋予权限
$user_permission = READ | WRITE;

//验证权限
echo '可读：', ($user_permission &amp; READ) ? 'Yes' : 'No', "\n";
echo '可写：', ($user_permission &amp; WRITE) ? 'Yes' : 'No', "\n";
echo '可执行：', ($user_permission &amp; EXCUTE) ? 'Yes' : 'No', "\n";
?&gt;</pre>
<p>PHP语言本身的<a href="http://www.php.net/error_reporting" target="_blank">错误控制</a> 也是用位运算来做的，它甚至还利用了<em>按位异或</em>和<em>按位非</em>，使得错误控制更加精确。</p>
<h3>优点和缺陷</h3>
<p>位运算的运算对象是二进制的位，速度快，效率高，而且节省存储空间，位运算做权限控制又相当地灵活。但是，位运算也有很大的局限，因为在32位计算机上，位移不能超过32次，这就要求权限数量不超过32种。</p>
<hr />延伸阅读：</p>
<ul>
<li>MySQL的<a href="http://dev.mysql.com/doc/refman/5.1/en/set.html" target="_blank">SET</a>类型，也是基于位运算的，恰当的运用，效果不错，可以参看<a href="http://dev.mysql.com/tech-resources/articles/mysql-set-datatype.html" target="_blank">教程</a></li>
</ul>
<hr />
<p><strong><a href="http://xiaobin.net/200906/bitwise-permission/">基于位运算的权限控制</a></strong> | 暂无评论，<a href="http://xiaobin.net/200906/bitwise-permission/#comments">添加评论</a>
<br>本文网址：<a href="http://xiaobin.net/200906/bitwise-permission/">http://xiaobin.net/200906/bitwise-permission/</a>
<br><a href="http://xiaobin.net">将之典藏</a> - 厚积而薄发，© 2005-2009. 如无特别声明，适用<a href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" target="_blank">署名-非商业性使用-相同方式共享 3.0</a>授权，你可以署名使用全部或者部分内容用于非商业性目的。</p>]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
