<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[kakapo's nest]]></title> 
<link>http://www.kakapo.cn/blog/index.php</link> 
<description><![CDATA[My Technical Knowledge Management System]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[kakapo's nest]]></copyright>
<item>
<link>http://www.kakapo.cn/blog/read.php?165</link>
<title><![CDATA[php网站生产环境之安全配置推荐]]></title> 
<author>kakapo &lt;kakapowu@gmail.com&gt;</author>
<category><![CDATA[PHP]]></category>
<pubDate>Wed, 21 Jul 2010 03:14:13 +0000</pubDate> 
<guid>http://www.kakapo.cn/blog/read.php?165</guid> 
<description>
<![CDATA[ 
	主要从安全Security，性能Performance，代码整洁度Code cleanliness角度考虑<br/><br/>- register_globals = Off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Security, Performance]<br/>- register_long_arrays = Off&nbsp;&nbsp;&nbsp;&nbsp; [Performance]<br/>- display_errors = Off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Security]<br/>- log_errors = On&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[Security]<br/>- output_buffering = 4096&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[Performance]<br/>- register_argc_argv = Off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Performance]<br/>- magic_quotes_gpc = Off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Performance]<br/>- variables_order = "GPCS"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Performance]<br/>- error_reporting = E_ALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[Code Cleanliness, Security(?)]<br/>- allow_call_time_pass_reference = Off&nbsp;&nbsp;&nbsp;&nbsp; [Code cleanliness]<br/><br/><br/>安全模式必须要开启<br/>safe_mode = on<br/>safe_mode_gid = off<br/><br/>启动safe_mode，会对许多PHP函数进行限制，特别是和系统相关的文件打开、命令执行等函数<br/><br/>safe_mode_include_dir = [WEBSITE]<br/><br/>运行文件目录<br/>safe_mode_exec_dir = <br/>safe_mode_allowed_env_vars = PHP_<br/><br/>open_basedir = [WEBSITE]<br/><br/>必须要禁用的函数<br/><br/>disable_functions=exec,passthru,popen,proc_open,shell_exec,system,phpinfo, assert<br/><br/>建议禁用的函数disable_functions=chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir,rmdir,rename,<br/>file,file_get_contents,fputs,fwrite,chgrp,chmod,chown<br/><br/>expose_php = Off<br/><br/>关闭错误信息提示<br/>display_errors = Off<br/><br/>关闭全局变量<br/>register_globals = Off<br/><br/>不允许调用dl<br/>enable_dl = Off<br/><br/>关闭远程文件<br/><br/>allow_url_fopen = Off<br/>allow_url_include = Off<br/><br/>http only 开启<br/>session.cookie_httponly = 1<br/><br/>https secure 开启<br/>session.cookie_secure = 1<br/><br/>明确定义upload_tmp_dir设置为系统tmp目录<br/><br/>Tags - <a href="http://www.kakapo.cn/blog/tag.php?tag=php" rel="tag">php</a> , <a href="http://www.kakapo.cn/blog/tag.php?tag=%25E5%25AE%2589%25E5%2585%25A8" rel="tag">安全</a> , <a href="http://www.kakapo.cn/blog/tag.php?tag=safe_mode" rel="tag">safe_mode</a>
]]>
</description>
</item><item>
<link>http://www.kakapo.cn/blog/read.php?162</link>
<title><![CDATA[ICE for PHP 安装和使用指南]]></title> 
<author>kakapo &lt;kakapowu@gmail.com&gt;</author>
<category><![CDATA[PHP]]></category>
<pubDate>Thu, 29 Apr 2010 13:46:03 +0000</pubDate> 
<guid>http://www.kakapo.cn/blog/read.php?162</guid> 
<description>
<![CDATA[ 
	介绍<br/>ICE 的官网是http://www.zeroc.com。ICE（Internet Communications Engine 网络通讯引擎），是由Corba原核心成员开发的一个开源中间件，据称其各种性能完全优于Corba。<br/><br/><br/>1、下载地址<br/>http://www.zeroc.com/download/Ice/3.2/Ice-3.2.0.tar.gz<br/>http://www.zeroc.com/download/Ice/3.2/IcePHP-3.2.0.tar.gz<br/><br/>2、安装<br/>2.1 安装Ice for C++ 3.2.0<br/>&nbsp;&nbsp;&nbsp;&nbsp;$tar xzvf Ice-3.2.0.tar.gz<br/>&nbsp;&nbsp;&nbsp;&nbsp;$cd Ice-3.2.0<br/>&nbsp;&nbsp;&nbsp;&nbsp;编辑文件config/Make.rules，修改一些参数（可以不修改，按默认值安装）<br/>&nbsp;&nbsp;&nbsp;&nbsp;$make && make install<br/>&nbsp;&nbsp;&nbsp;&nbsp;一般这一步不会出问题的，但是编译时间较长，<br/>&nbsp;&nbsp;&nbsp;&nbsp;如果出问题，一般是缺少一些库，参照出错信息安装相应的库。<br/>&nbsp;&nbsp; 默认安装地址在 /opt/Ice-3.2.0<br/><br/>2.2 安装IcePHP<br/>&nbsp;&nbsp;&nbsp;&nbsp;$tar xzvf IcePHP-3.2.0.tar.gz<br/>&nbsp;&nbsp;&nbsp;&nbsp;$cd IcePHP-3.2.0<br/>&nbsp;&nbsp;&nbsp;&nbsp;$vi config/Make.rules&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 修改 PHP_HOME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?= /usr/local/php&nbsp;&nbsp;#php的安装目录，如果已经编译安装过了PHP的话。<br/>&nbsp;&nbsp;&nbsp;&nbsp;$export ICE_HOME=/opt/Ice-3.2.0 ＃这一步很重要，否则后面编译会出错，报没有找到IceUtil::stringToInt64()方法<br/>&nbsp;&nbsp;&nbsp;&nbsp;$make && make install<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 编译过程我还遇到如下错误<br/>&nbsp;&nbsp;<div class="code"><br/>Marshal.cpp:1932: error: &#039;ZVAL_ADDREF&#039; was not declared in this scope<br/>&nbsp;&nbsp; </div><br/>&nbsp;&nbsp; 通过Google，ICE的论坛有技术支持，解决办法是在 Marshal.cpp将ZVAL_ADDREF 改成 Z_ADDREF_P。这种错误我不知道笔误还是故意，希望在以后的版本会修复这个bug。<br/><br/>&nbsp;&nbsp; 安装完成后，会在/opt/下出现IcePHP-3.2.0目录，lib/IcePHP.so就是下面要用到的。<br/><br/>2.3 配置php.ini<br/>&nbsp;&nbsp; vi /etc/php.ini<br/><br/>在任意位置增加两行：<br/>extension_dir = /opt/IcePHP-3.2.0/lib/<br/>extension=IcePHP.so<br/>ice.profiles = /etc/ice.prop<br/><br/>#也可以将IcePHP.so拷贝到原来的php的extension_dir目录<br/><br/>2.4.准备/etc/ice.prop<br/>vi /etc/ice.prop<br/><br/>加入以下两行：<br/><br/>[profile_demo]<br/>ice.slice=/usr/local/apache2/htdocs/hello/Hello.ice<br/><br/>这两行的意思就是，增加一个ice的配置，名字是profile_demo，slice文件是…Hello.ice<br/><br/><br/><br/>3.创建一个php client<br/>方法一：<br/>将ice文件编译成php文件<br/>举例，<br/> $ /opt/Ice-3.2.0/bin/slice2php Printer.ice #生成一个Printer.php文件<br/><br/>编写一个client.php例子<br/><div class="code"><br/>&lt;?php?<br/>ini_set(&#039;include_path&#039;,ini_get(&#039;include_path&#039;) . PATH_SEPARATOR . &#039;/opt/Ice-3.2.0/php&#039;);<br/>//Ice.php是<br/>require &#039;Ice.php&#039;;?<br/>require &#039;Printer.php&#039;;?<br/>?<br/>$ic = null;?<br/>try?<br/>&#123;?<br/>$ic = Ice_initialize();?<br/>$base = $ic-&gt;stringToProxy(&quot;SimplePrinter:default -p 10000&quot;);?<br/>$printer = Demo_PrinterPrxHelper::checkedCast($base);?<br/>if(!$printer)?<br/>throw new RuntimeException(&quot;Invalid proxy&quot;);?<br/>?<br/>$printer-&gt;printString(&quot;Hello World!&quot;);?<br/>&#125;?<br/>catch(Exception $ex)?<br/>&#123;?<br/>echo $ex;?<br/>&#125;?<br/>?<br/>if($ic)?<br/>&#123;?<br/>// Clean up?<br/>try?<br/>&#123;?<br/>$ic-&gt;destroy();?<br/>&#125;?<br/>catch(Exception $ex)?<br/>&#123;?<br/>echo $ex;?<br/>&#125;?<br/>&#125;?<br/>?&gt;<br/></div><br/><br/><br/><br/><br/>4、ICE在PHP应用中的缺点，无法使用PHP编写Server端，其实这也是PHP的一个缺陷——没有完善的多进程和多线程管理机制。因此，Server端可以采用ICE所支持的其它语言进行编写，比如JAVA/C++/VB/PYTHON等。<br/><br/><br/><br/><br/>参考：<br/><a href="http://www.54chen.com/php-tech/the-advanced-interconnection-technology-the-use-of-ice-unicom-php-and-java.html" target="_blank"><br/>“先进的互联互通技术”–使用ice联通php和java<br/></a><br/><a href="http://zhengdl126.javaeye.com/blog/481243" target="_blank">ICE-高效的中间件平台</a><br/><a href="http://www.webgameexpress.com/blog/?p=88" target="_blank">ICE的PHP扩展(翻译) 之一 概述和简介</a><br/><br/><br/><br/>Tags - <a href="http://www.kakapo.cn/blog/tag.php?tag=icephp" rel="tag">icephp</a> , <a href="http://www.kakapo.cn/blog/tag.php?tag=ice" rel="tag">ice</a> , <a href="http://www.kakapo.cn/blog/tag.php?tag=for" rel="tag">for</a> , <a href="http://www.kakapo.cn/blog/tag.php?tag=php" rel="tag">php</a> , <a href="http://www.kakapo.cn/blog/tag.php?tag=zval_addref" rel="tag">zval_addref</a> , <a href="http://www.kakapo.cn/blog/tag.php?tag=stringtoint64" rel="tag">stringtoint64</a>
]]>
</description>
</item><item>
<link>http://www.kakapo.cn/blog/read.php?160</link>
<title><![CDATA[如何在window7下使用zend studio 5]]></title> 
<author>kakapo &lt;kakapowu@gmail.com&gt;</author>
<category><![CDATA[PHP]]></category>
<pubDate>Thu, 26 Nov 2009 18:43:31 +0000</pubDate> 
<guid>http://www.kakapo.cn/blog/read.php?160</guid> 
<description>
<![CDATA[ 
	zend 公司目前还没有开发兼容 window 7 64 位的 zend studio 5.5版本的软件，我从zend 论坛里头搜到一个帖子，有高人已经能搞定了<a href="http://forums.zend.com/viewtopic.php?f=50&t=997" target="_blank">Zend Studio 5.5 on Windows 7</a>，我自己试用了好久，最终也算搞定了。为了节约时间，我将中文的理解记下：<br/><br/>1. 下载并安装最新的 JRE for Windows: http://java.com/en/download/manual.jsp<br/>2. 下载并安装 WinRAR: http://rarlabs.com (be sure to install with Explorer shell extension).<br/>3. 下载 Zend Studio 5.5.1<br/>4. 点右键将ZendStudio-5_5_1.exe 解压缩在当前目录.<br/>5. 进入解压后产生的目录 Windows&#92;resource (主要这不是系统盘的windows/resources).<br/>6. 然后将 "jre" 目录重命名为 "jre backup".<br/>7. 然后复制 C:&#92;Program Files (x86)&#92;Java&#92;jre6 目录到Windows/resource/下 重命名 "jre6" 为 "jre".<br/>8. 回到上级Windows/目录下执行ZendStudio-5_5_1.exe ，安装.<br/>9. 安装完成后，从windows/resource目录下将"jre backup" 目录复制到 Zend Studio 5.5 的安装目录下.<br/>10. 将已安装目录下的 "jre" 重命名为 "jre another backup"<br/>11. 然后将"jre backup" 重命名为 "jre"<br/>12. 最后一步很关键，要设置ZDE.exe的运行兼容性，右键选择ZDE.exe的属性-->兼容性-->以兼容模式运行这个程序，选择 Windows Vista。<br/><br/>胜利！由于我一开始不知道兼容性怎么设置，总是碰到渲染的色彩问题，软件界面显示不正常，浪费了3个多小时的时间。<br/><br/>希望对后人有所帮助。我喜欢Zend Studio 5.5，讨厌后面集成到Eclips。<br/><br/>Tags - <a href="http://www.kakapo.cn/blog/tag.php?tag=window" rel="tag">window</a> , <a href="http://www.kakapo.cn/blog/tag.php?tag=7%252Czend" rel="tag">7,zend</a> , <a href="http://www.kakapo.cn/blog/tag.php?tag=studio" rel="tag">studio</a> , <a href="http://www.kakapo.cn/blog/tag.php?tag=5.5%252Cjre" rel="tag">5.5,jre</a>
]]>
</description>
</item><item>
<link>http://www.kakapo.cn/blog/read.php?159</link>
<title><![CDATA[PHP SSO 开源软件--Xppass ]]></title> 
<author>kakapo &lt;kakapowu@gmail.com&gt;</author>
<category><![CDATA[PHP]]></category>
<pubDate>Fri, 30 Oct 2009 10:28:43 +0000</pubDate> 
<guid>http://www.kakapo.cn/blog/read.php?159</guid> 
<description>
<![CDATA[ 
	最近做了一个新的开源项目,PHP 单点登录系统 Xppass，访问地址在http://xppass.googlecode.com<br/><br/>项目特点：<br/><br/>1、提供三种解决方案Cookie方案、Session方案和Ticket方案，根据需求任选其一。<br/><br/>2、可采用哈希分表设计，支持亿万级别用户数据量存储。<br/><br/>3、提供用户名和电子邮箱两种互补注册方式。<br/><br/>4、实现安全登录技术，采用密码MD5加密传输和hmac身份验证。<br/><br/>5、提供自动安装程序。<br/><br/>6、支持多语言版本。<br/><br/><a href="http://xppass.googlecode.com/files/ticket_chart.gif" target="_blank"><img src="http://xppass.googlecode.com/files/ticket_chart.gif" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0" width="400" height="400"/></a><br/><br/>官方网址:<a href="http://xppass.googlecode.com" target="_blank">http://xppass.googlecode.com</a><br/><br/><br/><br/>Tags - <a href="http://www.kakapo.cn/blog/tag.php?tag=php%252Csso%252Cxppass" rel="tag">php,sso,xppass</a>
]]>
</description>
</item><item>
<link>http://www.kakapo.cn/blog/read.php?158</link>
<title><![CDATA[KFL--PHP开发框架和项目在线管理平台介绍]]></title> 
<author>kakapo &lt;kakapowu@gmail.com&gt;</author>
<category><![CDATA[PHP]]></category>
<pubDate>Tue, 22 Sep 2009 08:05:54 +0000</pubDate> 
<guid>http://www.kakapo.cn/blog/read.php?158</guid> 
<description>
<![CDATA[ 
	最近花了很多时间和心思开发的一个开源项目，KFL,--Kindly, Fast, Light的简称。<br/>项目在GoogleCode上托管了。可以访问 <a href="http://kfl.googlecode.com" target="_blank">http://kfl.googlecode.com</a><br/><br/>Demo 访问&nbsp;&nbsp;<a href="http://www.kakapo.cn/GoogleCodeKFL/Admin/ " target="_blank">http://www.kakapo.cn/GoogleCodeKFL/Admin/ </a>&nbsp;&nbsp; 用户名 admin 密码 123456<br/><br/>KFL是一个轻快的、友好的、MVC模式的PHP开发框架，基于应用层程序框架来解决Webserver集群带来的系列开发问题。<br/>KFL Admin是一个项目在线管理平台，使用KFL框架开发。可以作为学习使用KFL框架的demo。<br/><br/><br/>主要特点:<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* 统一配置，一键同步。<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 数据片和网页的分布式缓存。<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 分布式Memcached服务的监控管理。<br/>&nbsp;&nbsp;&nbsp;&nbsp;* Session会话集群和在线用户统计。<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 错误日志管理和应用监控。<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 项目文件系统在线管理。<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 集成MySQL备份工具phpMyBackupPro。<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 集成SQLite管理工具SQLite Manager。<br/><br/>中文网站: <a href="http://kfl.googlecode.com" target="_blank">http://kfl.googlecode.com</a><br/>Tags - <a href="http://www.kakapo.cn/blog/tag.php?tag=kfl%252C%25E9%25A1%25B9%25E7%259B%25AE%25E5%259C%25A8%25E7%25BA%25BF%25E7%25AE%25A1%25E7%2590%2586%252C" rel="tag">kfl,项目在线管理,</a> , <a href="http://www.kakapo.cn/blog/tag.php?tag=%25E5%25BC%2580%25E5%258F%2591%25E6%25A1%2586%25E6%259E%25B6" rel="tag">开发框架</a>
]]>
</description>
</item><item>
<link>http://www.kakapo.cn/blog/read.php?156</link>
<title><![CDATA[[原创]一个效果还不错的验证码程序代码]]></title> 
<author>kakapo &lt;kakapowu@gmail.com&gt;</author>
<category><![CDATA[PHP]]></category>
<pubDate>Wed, 10 Jun 2009 08:28:29 +0000</pubDate> 
<guid>http://www.kakapo.cn/blog/read.php?156</guid> 
<description>
<![CDATA[ 
	最近感觉以前使用的验证码生成函数太差，优化了一下代码，新的效果如下：<br/><a href="http://www.kakapo.cn/blog/attachment.php?fid=8" target="_blank"><img src="http://www.kakapo.cn/blog/attachment.php?fid=8" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>字体文件：<br/><a href="attachment.php?fid=9">点击这里下载文件</a><br/><br/>源程序：<br/><br/><div class="code"><br/><br/>&lt;?php<br/>$width = &quot;90&quot;;<br/>$height = &quot;30&quot;;<br/>$charlen = &quot;4&quot;;<br/>$bgcolor = &quot;#eeeeee&quot;;<br/>$noise = true;<br/>$noisenum = 20;<br/>$border = false;<br/>$bordercolor = &quot;#cccccc&quot;;<br/>$font = dirname(__FILE__). &quot;/plugins/ENGR.TTF&quot;;<br/>generate($width,$height,$charlen,$font,$bgcolor,$noise,$noisenum,$borer,$bordercolor);<br/><br/>function generate($width,$height,$len,$font,$bgcolor,$noise,$noisenum,$borer,$bordercolor)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//创建画布<br/>&nbsp;&nbsp;&nbsp;&nbsp;$image = imagecreatetruecolor ( $width, $height );<br/>&nbsp;&nbsp;&nbsp;&nbsp;$back = getcolor ($image, $bgcolor );<br/>&nbsp;&nbsp;&nbsp;&nbsp;imageFilledRectangle ( $image, 0, 0, $width, $height, $back );<br/>&nbsp;&nbsp;&nbsp;&nbsp;$size = ($width-6) / $len;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$size = ($size &gt; $height)?$height:$size;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//为画布添加杂点<br/>&nbsp;&nbsp;&nbsp;&nbsp;if ($noise == true)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for($i = 0; $i &lt; $noisenum; $i++) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$randColor = imageColorAllocate ( $image, rand ( 150, 255 ), rand ( 150, 255 ), rand ( 150, 255 ) );<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$x1 = rand(0,$width);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$y1 = rand(0,$height);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$x2 = $x1+rand(-20,20);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$y2 = $y1+rand(-20,20);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imageline ( $image, $x1, $y1,&nbsp;&nbsp;$x2,&nbsp;&nbsp;$y2,&nbsp;&nbsp;$randColor );<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//生成随机数字<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;$textall = &quot;0123456789ABCDEFGHHJKLMNPQRSTWXY&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$code = &#039;&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$colorArr = array(&quot;#006633&quot;,&quot;#990000&quot;,&quot;#006699&quot;,&quot;#663333&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$angleArr = array(10,-10,-20,20);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$textColor = getcolor($image,$colorArr&#91;array_rand($colorArr)&#93;);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//echo $textColor;<br/>&nbsp;&nbsp;&nbsp;&nbsp;for($i = 0; $i &lt; $len; $i ++) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tmptext = rand ( 0, 31 );<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$randtext = $textall &#91;$tmptext&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imagettftext ( $image,18, $angleArr&#91;array_rand($angleArr)&#93;, 6+$size*$i, 24, $textColor, $font, $randtext );<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$code .= $randtext;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$_SESSION &#91;&#039;validatecode&#039;&#93; = $code;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//加上边框<br/>&nbsp;&nbsp;&nbsp;&nbsp;if ($border == true)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$bordercolor = getcolor ( $image, $bordercolor );<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imageRectangle ( $image, 0, 0, $width - 1, $height - 1, $bordercolor );<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//生成<br/>&nbsp;&nbsp;&nbsp;&nbsp;header ( &quot;Content-type: image/png&quot; );<br/>&nbsp;&nbsp;&nbsp;&nbsp;imagePng ( $image );<br/>&nbsp;&nbsp;&nbsp;&nbsp;imagedestroy ( $image );<br/>&nbsp;&nbsp;&nbsp;&nbsp;die;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;function getcolor(&amp;$image,$color) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$color = eregi_replace ( &quot;^#&quot;, &quot;&quot;, $color );<br/>&nbsp;&nbsp;&nbsp;&nbsp;$r = $color &#91;0&#93; . $color &#91;1&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$r = hexdec ( $r );<br/>&nbsp;&nbsp;&nbsp;&nbsp;$b = $color &#91;2&#93; . $color &#91;3&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$b = hexdec ( $b );<br/>&nbsp;&nbsp;&nbsp;&nbsp;$g = $color &#91;4&#93; . $color &#91;5&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$g = hexdec ( $g );<br/>&nbsp;&nbsp;&nbsp;&nbsp;$color = imagecolorallocate ( $image, $r, $b, $g );<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $color;<br/>&nbsp;&nbsp;&#125;<br/><br/>?&gt;<br/></div><br/><a href="http://www.kakapo.cn/blog/attachment.php?fid=8" target="_blank"><img src="http://www.kakapo.cn/blog/attachment.php?fid=8" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>Tags - <a href="http://www.kakapo.cn/blog/tag.php?tag=%25E9%25AA%258C%25E8%25AF%2581%25E7%25A0%2581%252Cphp" rel="tag">验证码,php</a>
]]>
</description>
</item><item>
<link>http://www.kakapo.cn/blog/read.php?155</link>
<title><![CDATA[[原创]jpg图片转化成支持透明的png图片]]></title> 
<author>kakapo &lt;kakapowu@gmail.com&gt;</author>
<category><![CDATA[PHP]]></category>
<pubDate>Tue, 09 Jun 2009 07:24:05 +0000</pubDate> 
<guid>http://www.kakapo.cn/blog/read.php?155</guid> 
<description>
<![CDATA[ 
	php的GD库支持处理图片透明化的函数如下：<br/><div class="code"><br/>$white = imagecolorallocate($src, 255, 255, 255);<br/>imagecolortransparent($src,$white);<br/></div><br/><br/>效果让人难以接受，故我写了一个函数，通过遍历像数方法，将多余的杂点去掉，处理jpeg图片效果不错。<br/><div class="code"><br/>/**<br/> * 将jpeg图片的某个背景颜色透明化，转成png图片<br/> * @param string $jpg_img 输入文件地址<br/> * @param string $png_img 输出文件地址<br/> * @param string $bg_color 背景颜色，格式 例如 #ffffff<br/> * @param int $alpha 图片透明度 其值从 0 到 127。0 表示完全不透明，127 表示完全透明。<br/> * @param float $radio RGB颜色过滤因子，0-1<br/> * @author kakapowu@gmail.com at 2009-06-09<br/> * @return boolen<br/> **/<br/>function jpeg2transpng($jpg_img,$png_img,$bg_color,$alpha,$radio)&#123;<br/>&nbsp;&nbsp;$im_in&nbsp;&nbsp;=imagecreatefromjpeg($jpg_img);<br/>&nbsp;&nbsp;if(!$im_in) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return false;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;$size&nbsp;&nbsp;=getimagesize($jpg_img);<br/><br/>&nbsp;&nbsp;//创建透明画布<br/>&nbsp;&nbsp;$im_out =imagecreatetruecolor($size&#91;0&#93;, $size&#91;1&#93;);<br/>&nbsp;&nbsp;imagealphablending($im_out, true);<br/>&nbsp;&nbsp;imagesavealpha($im_out, true);<br/>&nbsp;&nbsp;$trans_colour = imagecolorallocatealpha($im_out, 0, 0, 0, 127);<br/>&nbsp;&nbsp;imagefill($im_out, 0, 0, $trans_colour);<br/><br/>&nbsp;&nbsp;//设定透明色<br/>&nbsp;&nbsp;$red = intval( hexdec(substr($bg_color,1,2))*$radio );<br/>&nbsp;&nbsp;$green = intval( hexdec(substr($bg_color,3,2))*$radio);<br/>&nbsp;&nbsp;$blue = intval( hexdec(substr($bg_color,5,2))*$radio);<br/><br/>&nbsp;&nbsp;//像素级的图片合成<br/>&nbsp;&nbsp;for ($j=0;$j&lt;=$size&#91;1&#93;-1;$j++)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for ($i=0;$i&lt;=$size&#91;0&#93;-1;$i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$rgb = imagecolorat($im_in,$i,$j);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$r = ($rgb &gt;&gt; 16) &amp; 0xFF;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$g = ($rgb &gt;&gt; 8) &amp; 0xFF;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$b = $rgb &amp; 0xFF;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($r&gt;=$red &amp;&amp; $g&gt;=$green &amp;&amp; $b&gt;=$blue)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//echo &#039;.&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//echo &quot;&lt;a href=&#039;#&quot;.dechex($r).dechex($g).dechex($b).&quot;&#039;&gt;*&lt;/a&gt;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$color=imagecolorallocatealpha($im_out,$r,$g,$b,$alpha);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imagesetpixel($im_out,$dst_x+$i,$dst_y+$j,$color);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//echo &quot;&#92;n&quot;;<br/>&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;//生成图片<br/>&nbsp;&nbsp;imagepng($im_out,$png_img);<br/>&nbsp;&nbsp;imagedestroy($im_in);<br/>&nbsp;&nbsp;imagedestroy($im_out);<br/><br/>&nbsp;&nbsp;return true;<br/>&#125;<br/></div><br/><br/><br/><br/>$income = 'New_York_Knicks.jpg';<br/>jpeg2transpng($income,'t.png','#ffffff',0,0.618);<br/><br/>效果预览<br/><br/>原图:<br/><a href="http://www.kakapo.cn/blog/attachment.php?fid=4" target="_blank"><img src="http://www.kakapo.cn/blog/attachment.php?fid=4" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><a href="http://www.kakapo.cn/blog/attachment.php?fid=6" target="_blank"><img src="http://www.kakapo.cn/blog/attachment.php?fid=6" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>转化后<br/><a href="http://www.kakapo.cn/blog/attachment.php?fid=5" target="_blank"><img src="http://www.kakapo.cn/blog/attachment.php?fid=5" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><a href="http://www.kakapo.cn/blog/attachment.php?fid=7" target="_blank"><img src="http://www.kakapo.cn/blog/attachment.php?fid=7" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>Tags - <a href="http://www.kakapo.cn/blog/tag.php?tag=jpg%252Cpng%252Cgd%252C%25E9%2580%258F%25E6%2598%258E%25E5%258C%2596%252C%25E6%2597%25A0%25E8%2583%258C%25E6%2599%25AF" rel="tag">jpg,png,gd,透明化,无背景</a>
]]>
</description>
</item><item>
<link>http://www.kakapo.cn/blog/read.php?153</link>
<title><![CDATA[网站多服务器负载均衡引起的开发问题及解决方案]]></title> 
<author>kakapo &lt;kakapowu@gmail.com&gt;</author>
<category><![CDATA[PHP]]></category>
<pubDate>Wed, 20 May 2009 04:30:56 +0000</pubDate> 
<guid>http://www.kakapo.cn/blog/read.php?153</guid> 
<description>
<![CDATA[ 
	先罗列一下问题：<br/>1、session会话数据共享问题<br/>2、缓存数据文件共享问题<br/>3、用户数据共享问题<br/>4、上传数据存储问题<br/>5、Log日志文件共享同步问题<br/>6、配置文件管理问题<br/>7、web服务器时间获取不一致问题<br/><br/>这些问题都是从项目经验中总结出来的，接下来在一一讨论解决的办法。<br/><span style="font-size: 18px;">1、session会话数据共享问题</span>&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>推荐使用memcached分布式缓存系统来解决，可以参考我之前写一篇文章《<a href="http://www.kakapo.cn/blog/read.php?95" target="_blank">Memcached的介绍和应用</a>》。<br/><br/><span style="font-size: 18px;">2、缓存数据文件共享问题解决方案</span><br/><br/>所谓缓存数据，一般指网站前台程序本身产生的数据，比如，数据库查询类产生的数据对象缓存，缓存类产生的本地缓存数据，远程抓取类产生的本地临时缓存文件等等。&nbsp;&nbsp;&nbsp;&nbsp; <br/>有些数据看似不需要共享，就像那些在每台机器上都能自动产生的数据。但是如果刚好碰到某个时刻数据更新了，缓存时间又不同步，就会造成负载均衡上的每台机器缓存数据不相同。这也会给用户的访问带来一定的困扰。当然针对的解决办法就是想办法让缓存同时过期，保证缓存的内容相同，这就不需要考虑共享的问题。&nbsp;&nbsp;&nbsp;&nbsp; <br/>远程抓取经常会涉及到模拟登陆，在本地一般会保存模拟登陆用户的cookie数据，这个就一定得想办法解决共享。否则用户在负载A机器上执行了模拟登陆程序，在本地产生了cookie文件，但是下次请求被分配到负载B机器上执行抓取程序，却发现需要用上的cookie文件在本地不存在，马上程序就会被远程服务器拒绝访问。这种cookie的临时文件很多而且改动频繁。目前我们采用了NFS的方案，mount指定的一个缓存目录，让负载的每台机器都能像本地目录一样访问，暂且还行的通。也可以将这个单独的应用放到一台机器，来避免这个问题。<br/><br/><span style="font-size: 18px;">3、用户数据共享问题</span>&nbsp;&nbsp;&nbsp;&nbsp; <br/>所谓用户数据，范围比较广。这里一般指在用户的独立目录空间保存的用户独用的数据。比例用户自己的相片，头像等等。&nbsp;&nbsp;&nbsp;&nbsp; <br/>之前我们采用的方法是搞一台存储服务器，通过一定的规则为用户创建目录空间，然后存储服务器通过NFS共享到所有负载均衡的web服务器。这种做法在几百万用户的网站还行得通。主要问题在于NFS在高并发访问下会出现一些不稳定，会丢失文件访问句柄。另外还有mount管理带来的麻烦，以及数据安全等风险。顺便提起用户目录空间的创建规则，分散均匀是一个最大的原则，采用哈希值切分方式比较合适。 采用用户名或者时间因子虽然方便了一些记忆和查询，但是容易碰到局部目录达到系统最大限制的问题。&nbsp;&nbsp;&nbsp;&nbsp; <br/>所以，推荐使用分布式文件系统解决方案。国人happy_fish100开发了一个高效的开源的分布式文件系统<a href="http://code.google.com/p/fastdfs/" target="_blank">FastDFS</a>，比较完善，使用简单，功能强大。特别适合解决我当前遇到的问题。自称比国外的<a href="http://www.danga.com/mogilefs/" target="_blank">Mogilefs</a>还强大。让我更心动的是提供了PHP client API，采用socket访问。在应用中调用也非常方便。<br/><br/><span style="font-size: 18px;">4、上传数据存储问题</span>&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>这个问题再单独拿出来谈是有根据的。在前台用户上传的自己相关的数据可以归属前面一个问题的范畴。前台也有一些用户上传的数据跟用户无关，还有网站后台也会有很多上传的数据。之前的做法可以是通过FTP服务将这些数据上传到存储静态文件的服务器上，也有通过NFS方式共享静态文件服务器的指定目录到web服务器。现在除了FTP方案之外，我也推荐尝试使用FastDFS来管理静态文件服务器的数据，但是要修改一下设计，可以在FastDFS的storge服务器上直接架设http服务器，让静态文件能直接通过URL访问。<br/><br/><span style="font-size: 18px;">5、Log日志文件共享同步问题</span>&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>所谓的Log日志也是web服务器程序自动产生的，比如错误日志，访问日志等。在一般情况一下也可以考虑让其不共享，无非是分析日志的时候每台机器都要做一遍。<br/><br/><span style="font-size: 18px;">6、配置文件管理问题&web服务器时间获取不一致问题</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>配置文件管理问题严格来讲不属于开发遇到的问题，而是运维人员烦恼的事情。当然，通过合理的将配置文件进行归类和存储，还是可以减少运维人员的困难的。web服务器的配置文件的最好也不用共享，文件的同步可以让系统管理员通过系统命令去自动完成。<br/>web服务器时间不一致虽然可以通过系统定时跟全球的时间服务器同步，但是在开发过程中程序还是要尽量避免使用本地时间函数，特别是跟数据库有关系的数据，可以通过采用数据库的时间函数来解决。<br/>Tags - <a href="http://www.kakapo.cn/blog/tag.php?tag=%25E5%25A4%259A%25E6%259C%258D%25E5%258A%25A1%25E5%2599%25A8%252C%25E8%25B4%259F%25E8%25BD%25BD%25E5%259D%2587%25E8%25A1%25A1%252C%25E9%2597%25AE%25E9%25A2%2598" rel="tag">多服务器,负载均衡,问题</a>
]]>
</description>
</item><item>
<link>http://www.kakapo.cn/blog/read.php?150</link>
<title><![CDATA[基于OpenCV的PHP图像人脸侦查技术]]></title> 
<author>kakapo &lt;kakapowu@gmail.com&gt;</author>
<category><![CDATA[PHP]]></category>
<pubDate>Wed, 10 Sep 2008 09:38:59 +0000</pubDate> 
<guid>http://www.kakapo.cn/blog/read.php?150</guid> 
<description>
<![CDATA[ 
	本文所介绍的技术不是原创，而是从一个叫Robert Eisele的德国人那里学习来的。他写了一个PHP扩展openCV，只封装了两个函数，叫face_detect和face_count。openCV是一个开源的用C/C++开发的计算机图形图像库，非常强大，研究资料很齐全。本文重点是介绍如何使用php来调用其中的局部的功能。人脸侦查技术只是openCV一个应用分支。<br/><br/>1.安装<br/>从源代码编译成一个动态的so文件。<br/><br/>1.1.安装 OpenCV (OpenCV 1.0.0)<br/>下载地址:http://sourceforge.net/project/showfiles.php?group_id=22870&package_id=16948<br/><div class="code"><br/>#tar xvzf OpenCV-1.0.0.tar.gz<br/>#cd opencv-1.0.0<br/>#./configure<br/>#make<br/>#make install<br/>#make check (检查是否安装全部正确)<br/></div><br/>提示： 不要指定安装路径，否则后面编译facedetect会找不到OpenCV的路径。<br/><br/><br/>1.2 安装facedetect<br/>下载地址http://www.xarg.org/download/facedetect-1.0.0.tar.gz<br/><div class="code"><br/>#tar xzvf facedetect-1.0.0.tar.gz<br/>#cd facedetect-1.0.0<br/>#phpize &amp;&amp; ./configure &amp;&amp; make &amp;&amp; make install<br/></div><br/><br/>编译完之后会提示facedetect.so 文件所在的位置。<br/><br/>最后确认在php.ini加入<br/> extension=facedetect.so，重启apache.<br/><br/>2.函数使用<br/>在phpinfo()里检查是否有facedetect这个模块。<br/>从openCV源代码/data/haarcascades/里头取出所有xml文件放在php的执行目录下<br/><div class="code"><br/>//检查有多少个脸型<br/>var_dump(face_count(&#039;party.jpeg&#039;, haarcascade_frontalface_alt.xml&#039;));<br/><br/>//返回脸型在图片中的位置参数，多个则返回数组<br/>$arr = face_detect(&#039;party.jpeg&#039;, haarcascade_frontalface_alt2.xml&#039;);<br/>print_r($arr);<br/><br/></div><br/><br/>3.应用<br/>结合imagick可以将图片做一下应用。因为 face_detect只返回一个矩形参数，包含x，y坐标和w，h长宽参数。下面是我的一个应用demo<br/><div class="code"><br/>&lt;?php<br/>if($_FILES)&#123;<br/><br/>$img = $_FILES&#91;&#039;pic&#039;&#93;&#91;&#039;tmp_name&#039;&#93;;<br/>$arr = face_detect($img, &#039;haarcascade_frontalface_alt2.xml&#039;);<br/><br/>//$arr1 = face_detect($img, &#039;haarcascade_frontalface_alt_tree.xml&#039;);<br/><br/>if(is_array($arr1)) $all =array_merge($arr,$arr1);<br/>else $all = $arr;<br/><br/>$im = new Imagick($img);<br/>//$draw =new ImagickDraw();<br/>//$borderColor = new ImagickPixel(&#039;red&#039;);<br/>//$draw-&gt;setFillAlpha(0.0);<br/>//$draw-&gt;setStrokeColor&nbsp;&nbsp;($borderColor);<br/>//$draw-&gt;setStrokeWidth&nbsp;&nbsp;(1);<br/>if(is_array($all))&#123;<br/>&nbsp;&nbsp;foreach ($all as $v)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$im_cl = $im-&gt;clone();<br/>&nbsp;&nbsp;&nbsp;&nbsp;$im_cl-&gt;cropImage($v&#91;&#039;w&#039;&#93;,$v&#91;&#039;h&#039;&#93;,$v&#91;&#039;x&#039;&#93;,$v&#91;&#039;y&#039;&#93;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$im_cl-&gt;swirlImage(60);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$im-&gt;compositeImage( $im_cl, Imagick::COMPOSITE_OVER , $v&#91;&#039;x&#039;&#93;, $v&#91;&#039;y&#039;&#93; );<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//$draw-&gt;rectangle($v&#91;&#039;x&#039;&#93;,$v&#91;&#039;y&#039;&#93;,$v&#91;&#039;x&#039;&#93;+$v&#91;&#039;w&#039;&#93;,$v&#91;&#039;y&#039;&#93;+$v&#91;&#039;h&#039;&#93;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;//$im-&gt;drawimage($draw);<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/>&nbsp;&nbsp;header( &quot;Content-Type: image/png&quot; );<br/>&nbsp;&nbsp;echo $im;<br/>&#125;else&#123;<br/>&nbsp;&nbsp;?&gt;<br/>&nbsp;&nbsp;&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;<br/>&nbsp;&nbsp;&lt;form method=&quot;POST&quot; enctype=&quot;multipart/form-data&quot;&gt;<br/>&nbsp;&nbsp;人脸识别试验：只支持jpg,png&lt;br&gt;<br/>&nbsp;&nbsp;上传一张图片 &lt;input type=&quot;file&quot; name=&quot;pic&quot;&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;submit&quot; value=&quot;upload&quot;&gt;<br/>&nbsp;&nbsp;&lt;/form&gt;<br/>&nbsp;&nbsp;&lt;?<br/>&#125;<br/>?&gt;<br/><br/></div><br/><br/><br/>参考资料:<br/>http://www.xarg.org/2008/07/face-detection-with-php/<br/>http://www.opencv.org.cn/index.php/首页<br/>http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/index.html<br/><br/>Tags - <a href="http://www.kakapo.cn/blog/tag.php?tag=opencv%252Cphp%252Cface" rel="tag">opencv,php,face</a> , <a href="http://www.kakapo.cn/blog/tag.php?tag=detect%252C%25E4%25BA%25BA%25E8%2584%25B8%25E4%25BE%25A6%25E6%259F%25A5" rel="tag">detect,人脸侦查</a>
]]>
</description>
</item><item>
<link>http://www.kakapo.cn/blog/read.php?147</link>
<title><![CDATA[谈一谈模拟浏览器登陆技术]]></title> 
<author>kakapo &lt;kakapowu@gmail.com&gt;</author>
<category><![CDATA[PHP]]></category>
<pubDate>Thu, 17 Jul 2008 03:04:27 +0000</pubDate> 
<guid>http://www.kakapo.cn/blog/read.php?147</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;用PHP开发模拟浏览器的应用,首选技术是CURL函数库。但是php官方提供的技术文档资料很少，相关的示例代码也很少。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;最近由于项目需要，开发了一系列免费邮箱的导出用户自己联系人的功能，包括国内外知名邮箱，163，sina，sohu,yahoo,hotmail,gmail,qq mail等。还开发了一些方便用户嵌入代码到各大博客，个人门户的应用。比如嵌入flash代码到Qzone，网易的blog，百度的个人门户等。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;当然，最原始的技术手段是采用fsockopen函数，然后深入去学习http协议，写出标准的http头信息，也是可以完成开发的。不过麻烦的地方就出在标准。如果对http协议标准认识不深，经常会因碰到少了一个空格或者少了一个换行符号而debug很久。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;OK，还是进入正题。工欲善其事，必先利其器。要模拟浏览器访问网站，首选要学会观察浏览器是如何发送http报文的，以及网站服务器返回给浏览器是什么样的内容。我推荐安装一个国外人开发的httpwatch的软件，最好搞个破解的版本，否则有些功能是使用不了的。这个软件安装完成之后是嵌入在IE里的，启动Record，在地址栏输入网址后回车，它就会将浏览器和服务器之间的所有通讯扫描出来，让你一览无遗。关于这个软件的使用在本文不做介绍。<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;模拟浏览器登陆应用开发，最关键的地方是突破登陆验证。CURL技术不只支持http，还支持https。区别就在多了一层SSL加密传输。如果是要登陆https网站，php记得要支持openssl。还是先拿一个例子来分析。<br/><br/><div class="code"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//用户名<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$login = &#039;username&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//密码<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$password = &#039;password&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//163的用户登陆地址<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$url = &quot;https://reg.163.com/logins.jsp&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//post 要提交的数据<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$fields = &quot;verifycookie=1&amp;style=16&amp;product=mail163&amp;username=&quot;.$login.&quot;&amp;password=&quot;.$password.&quot;&amp;selType=jy&amp;remUser=&amp;secure=on&amp;%B5%C7%C2%BC%D3%CA%CF%E4=%B5%C7%C2%BC%D3%CA%CF%E4&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//用来存放cookie的文件<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$cookie_file = dirname(__FILE__).&quot;/cookie.txt&quot;;<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启动一个CURL会话<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ch = curl_init();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 要访问的地址<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_URL, $url);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 对认证证书来源的检查，0表示阻止对证书的合法性的检查。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 从证书中检查SSL加密算法是否存在<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//模拟用户使用的浏览器，在HTTP请求中包含一个”user-agent”头的字符串。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_USERAGENT, &quot;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)&quot;);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送一个常规的POST请求，类型为：application/x-www-form-urlencoded，就像表单提交的一样。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_POST, 1);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//要传送的所有数据，如果要传送一个文件，需要一个@开头的文件名<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//连接关闭以后，存放cookie信息的文件名称<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 包含cookie信息的文件名称，这个cookie文件可以是Netscape格式或者HTTP风格的header信息。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 设置curl允许执行的最长秒数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//curl_setopt($ch, CURLOPT_TIMEOUT, 6);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 获取的信息以文件流的形式返回，而不是直接输出。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 执行操作<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $result = curl_exec($ch);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($result == NULL) &#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo &quot;Error:&lt;br&gt;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo curl_errno($ch) . &quot; - &quot; . curl_error($ch) . &quot;&lt;br&gt;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 关闭CURL会话<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_close($ch);<br/><br/></div><br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;上面这个例子相对简单，因为用户名和密码可以明文传输，而且登陆也不需要验证码。qq.com的模拟登陆相对就麻烦多了，首先要突破验证码这关，然后由于QQ密码是经过javascript加密后传输的，登陆界面也要模拟出来，下一篇文章再继续深入谈谈QQ的模拟登陆。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; 参考资料:<br/>CURL详解&nbsp;&nbsp;http://www.21andy.com/blog/20080507/1095.html<br/><br/>Tags - <a href="http://www.kakapo.cn/blog/tag.php?tag=curl%252C%25E6%25A8%25A1%25E6%258B%259F%25E7%2599%25BB%25E9%2599%2586" rel="tag">curl,模拟登陆</a>
]]>
</description>
</item>
</channel>
</rss>