<?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>幻想曲.Net &#187; PHP</title>
	<atom:link href="http://yibin.us/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://yibin.us</link>
	<description>面朝大海，春暖花开</description>
	<lastBuildDate>Fri, 17 Jun 2011 01:57:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>mp3插放器插件,需要的拿去用吧</title>
		<link>http://yibin.us/archives/6348</link>
		<comments>http://yibin.us/archives/6348#comments</comments>
		<pubDate>Sun, 28 Jun 2009 03:41:47 +0000</pubDate>
		<dc:creator>幻想曲</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://yibin.us/?p=6348</guid>
		<description><![CDATA[模仿一个runcode插件改写的，wp的插件写起来还是比较简单的。 播放器是用豆瓣的，你要不喜欢可以换成别的，就需要自己改代码了。 调用方法【mp3】xxxxx【/mp3】，全角换成半角的就行了。 代码如下： 上传到wp的插件目录，然后在后台启用就行了]]></description>
			<content:encoded><![CDATA[<p>模仿一个runcode插件改写的，wp的插件写起来还是比较简单的。</p>
<p>播放器是用豆瓣的，你要不喜欢可以换成别的，就需要自己改代码了。</p>
<p>调用方法【mp3】xxxxx【/mp3】，全角换成半角的就行了。</p>
<p>代码如下：</p>
<pre class="brush: php; title: ; notranslate">
&amp;lt;?php
/*
Plugin Name: mp3player
Plugin URI: http://yibin.us/archives/6348
Description: mp3player in a post
Version: 1.0
Author: yibin
Author URI: http://yibin.us
*/

$player = new player();
add_filter('the_content', array(&amp;amp;$player, 'convert'), -500);
unset($player);
class player
{
function __builderplayer($url) {
if(empty($url)) return '';
return sprintf('&amp;lt;p&amp;gt;&amp;lt;embed src=&amp;quot;http://www.douban.com/swf/player.swf?url=%s&amp;amp;amp;autoplay=0&amp;quot; type=&amp;quot;application/x-shockwave-flash&amp;quot; wmode=&amp;quot;transparent&amp;quot; allowscriptaccess=&amp;quot;always&amp;quot; width=&amp;quot;400&amp;quot; height=&amp;quot;80&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;',$url);
}
function convert($content)
{

$str_pattern = &amp;quot;/\[mp3\](.*?)\[\/mp3\]/i&amp;quot;;
$content = preg_replace($str_pattern,$this-&amp;gt;__builderplayer('\\1'),$content);
return $content;
}
}
?&amp;gt;
</pre>
<p>上传到wp的插件目录，然后在后台启用就行了</p>
]]></content:encoded>
			<wfw:commentRss>http://yibin.us/archives/6348/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>真正兼容.net的php 3DES加解密</title>
		<link>http://yibin.us/archives/6307</link>
		<comments>http://yibin.us/archives/6307#comments</comments>
		<pubDate>Mon, 15 Jun 2009 08:16:31 +0000</pubDate>
		<dc:creator>幻想曲</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[des]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://yibin.us/?p=6307</guid>
		<description><![CDATA[php中3des加密的结果与.Net/java不同的帖子与话题实在是太多了， 我前不久也在倒腾这些，不过今天已经搞定了，完全与.net中的兼容 直接拿去用吧。]]></description>
			<content:encoded><![CDATA[<p>php中3des加密的结果与.Net/java不同的帖子与话题实在是太多了，</p>
<p>我前不久也在倒腾这些，不过今天已经搞定了，完全与.net中的兼容</p>
<pre class="brush: php; title: ; notranslate">
&amp;lt;?php
class Crypt3Des
{
private $key = &amp;quot;&amp;quot;;
private $iv = &amp;quot;&amp;quot;;
/**
* 构造，传递二个已经进行base64_encode的KEY与IV
*
* @param string $key
* @param string $iv
*/
function __construct ($key, $iv)
{
if (empty($key) || empty($iv)) {
echo 'key and iv is not valid';
exit();
}
$this-&amp;gt;key = $key;
$this-&amp;gt;iv = $iv;
}
/**
*加密
* @param &amp;lt;type&amp;gt; $value
* @return &amp;lt;type&amp;gt;
*/
public function encrypt ($value)
{
$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
$iv = base64_decode($this-&amp;gt;iv);
$value = $this-&amp;gt;PaddingPKCS7($value);
$key = base64_decode($this-&amp;gt;key);
mcrypt_generic_init($td, $key, $iv);
$ret = base64_encode(mcrypt_generic($td, $value));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $ret;
}
/**
*解密
* @param &amp;lt;type&amp;gt; $value
* @return &amp;lt;type&amp;gt;
*/
public function decrypt ($value)
{
$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
$iv = base64_decode($this-&amp;gt;iv);
$key = base64_decode($this-&amp;gt;key);
mcrypt_generic_init($td, $key, $iv);
$ret = trim(mdecrypt_generic($td, base64_decode($value)));
$ret = $this-&amp;gt;UnPaddingPKCS7($ret);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $ret;
}
private function PaddingPKCS7 ($data)
{
$block_size = mcrypt_get_block_size('tripledes', 'cbc');
$padding_char = $block_size - (strlen($data) % $block_size);
$data .= str_repeat(chr($padding_char), $padding_char);
return $data;
}
private function UnPaddingPKCS7 ($text)
{
$pad = ord($text{strlen($text) - 1});
if ($pad &amp;gt; strlen($text)) {
return false;
}
if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
return false;
}
return substr($text, 0, - 1 * $pad);
}
}
?&amp;gt;
</pre>
<pre>直接拿去用吧。</pre>
]]></content:encoded>
			<wfw:commentRss>http://yibin.us/archives/6307/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>UCenter简析</title>
		<link>http://yibin.us/archives/6275</link>
		<comments>http://yibin.us/archives/6275#comments</comments>
		<pubDate>Sun, 10 May 2009 08:34:38 +0000</pubDate>
		<dc:creator>幻想曲</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ucenter]]></category>

		<guid isPermaLink="false">http://yibin.us/?p=6275</guid>
		<description><![CDATA[UCenter是采用很经典的MVC架构   UCenter采用index.php单点入口 假定我们检测用户登录，那么对应的接口址就为： xxx/index.php?m=user&#38;a=login 这样，就会初始化usercontrol并调用onlogin方法，看看usercontrol的onlogin() model层直接与数据库交互，control层与model层交互，得到结果，返回给view。 如果我们要扩展自己的方法该怎么办？ 首先，增加model类，定义我们所需要的方法，直接与DB进行交互。 其次，增加control类，并继承自base，定义on{xxxx}方法，与相对的model交互，并返回结果。]]></description>
			<content:encoded><![CDATA[<p>UCenter是采用很经典的MVC架构</p>
<p><img class="alignnone" title="mvc" src="http://pic.yupoo.com/samyi/5587076a0529/medium.jpg" alt="" width="500" height="472" /></p>
<p> <span id="more-6275"></span></p>
<p>UCenter采用index.php单点入口</p>
<pre class="brush: php; title: ; notranslate">
$m = getgpc('m'); //判断加载哪一个Model
$a = getgpc('a'); //判断加载哪一个Control
$release = getgpc('release');
if(empty($m) &amp;&amp; empty($a)) { //如果直接访问则跳转到管理界面
header('Location: admin.php');
exit;
}

//版本判断
if(empty($release)) {
define('RELEASE_ROOT', &quot;release/20080429/&quot;);
} elseif(intval($release) != UC_SERVER_RELEASE) {
define('RELEASE_ROOT', &quot;release/$release/&quot;);
} else {
define('RELEASE_ROOT', '');
}
//加载基类，基类中定义了很多的方法，所有控制器类都继承于该基类
if(file_exists(UC_ROOT.RELEASE_ROOT.'model/base.php')) {
require UC_ROOT.RELEASE_ROOT.'model/base.php';
} else {
require UC_ROOT.'model/base.php';
}
//判断是否加载的是指定的model
if(in_array($m, array('app', 'frame', 'user', 'pm', 'pm_client', 'tag', 'feed', 'friend', 'domain', 'credit', 'mail', 'version'))) {
if(file_exists(UC_ROOT.RELEASE_ROOT.&quot;control/$m.php&quot;)) {
include UC_ROOT.RELEASE_ROOT.&quot;control/$m.php&quot;;
} else {
include UC_ROOT.&quot;control/$m.php&quot;;
}
$classname = $m.'control';  //构造control类，如$m=user时control就为usercontrol
$control = new $classname();
$method = 'on'.$a;          //构造方法名

if(method_exists($control, $method) &amp;&amp; $a{0} != '_') {  //如果方法存在且不是私有方法则执行该方法
$data = $control-&gt;$method();
echo is_array($data) ? $control-&gt;serialize($data, 1) : $data;
exit;
} elseif(method_exists($control, '_call')) {  //否则执行重载
$data = $control-&gt;_call('on'.$a, '');
echo is_array($data) ? $control-&gt;serialize($data, 1) : $data;
exit;
} else {
exit('Action not found!');
}
} else {
exit('Module not found!');
}
</pre>
<p>假定我们检测用户登录，那么对应的接口址就为：<br />
xxx/index.php?m=user&amp;a=login<br />
这样，就会初始化usercontrol并调用onlogin方法，看看usercontrol的onlogin()</p>
<pre class="brush: php; title: ; notranslate"> //部分代码，有所删减
class usercontrol extends base {
function __construct() {
$this-&gt;usercontrol();
}
function usercontrol() {
parent::__construct();    //执行基类构造函数
$this-&gt;load('user');   //加载user model,base类的load方法首先从$_ENV环境变量中查找是否已设置$_ENV['user'],若未设置，则加载model/user.php，然后实例化该类并写入环境变量中，也就是此时，user model已经实例化了。
}
function onlogin() {
$this-&gt;init_input();  //调用基类init_input()方法
$isuid = $this-&gt;input('isuid');  //从基类中获取isuid
$username = $this-&gt;input('username');  //获取用户名
$password = $this-&gt;input('password');   //获取密码
$checkques = $this-&gt;input('checkques');　　//获取是否回答提示问题　
$questionid = $this-&gt;input('questionid');　//获取提示问题ID
$answer = $this-&gt;input('answer');　　//获取回答
if($isuid) {   //判断是用UID登录还是用用户名登录
$user = $_ENV['user']-&gt;get_user_by_uid($username);  //调用/model/user.php中的get_user_by_id方法从数据库中获取该用户的实例
} else {
$user = $_ENV['user']-&gt;get_user_by_username($username);
}

$passwordmd5 = preg_match('/^\w{32}$/', $password) ? $password : md5($password);
//判断各种可能的结果
if(empty($user)) {
$status = -1;
} elseif($user['password'] != md5($passwordmd5.$user['salt'])) {
$status = -2;
} elseif($checkques &amp;&amp; $user['secques'] != '' &amp;&amp; $user['secques'] != $_ENV['user']-&gt;quescrypt($questionid, $answer)) {
$status = -3;
} else {
$status = $user['uid'];
}
$merge = $status != -1 &amp;&amp; !$isuid &amp;&amp; $_ENV['user']-&gt;check_mergeuser($username) ? 1 : 0;
return array($status, $user['username'], $password, $user['email'], $merge);
}
</pre>
<p>model层直接与数据库交互，control层与model层交互，得到结果，返回给view。<br />
如果我们要扩展自己的方法该怎么办？<br />
首先，增加model类，定义我们所需要的方法，直接与DB进行交互。<br />
其次，增加control类，并继承自base，定义on{xxxx}方法，与相对的model交互，并返回结果。</p>
]]></content:encoded>
			<wfw:commentRss>http://yibin.us/archives/6275/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>寻Apache2下Discuz高性能配置方案</title>
		<link>http://yibin.us/archives/6096</link>
		<comments>http://yibin.us/archives/6096#comments</comments>
		<pubDate>Tue, 28 Apr 2009 13:42:55 +0000</pubDate>
		<dc:creator>幻想曲</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[discuz]]></category>
		<category><![CDATA[Others]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://yibin.us/?p=6096</guid>
		<description><![CDATA[服务器品牌 DELL 服务器型号 PE1850 cpu类型 Intel Xeon 2.80GHz cpu个数 2 内存条类型 512M 内存条个数 2 硬盘类型1 36G 硬盘个数1 1 操作系统：Linux centos2 2.6.18-92.el5 Apache 2.0 PHP 5.2.9 目前300并发，持续时间1小时 测试截图: 已安装Discuz7.0版，目前论坛并无帖子。 下午进行LoadRunner测试， 100用户并发时，响应时间在1.5s左右。 400用户并发时，响应时间约为3s，但每秒连接数一直处于170左右，无法继续上升。 此时，web服务器CPU占用70%-80% Db服务器为2%，基本无压力。 在网上看到一些文章，Apache在配置正确的情况下基本上可以处理每秒2K的并发请求，但今天的测试让我大跌眼镜。 响应时间也不够理想，况且这次的测试只是测了首页的访问，而且首页是做了缓存处理的。 最开始是怀疑httpd.conf中最大连接数没有设置正确，改动后重启Apache依然如此。 最令人担忧的是居高不下的CPU占用率。 希望有在Apache下配置Discuz经验的大虾们能给一个合理的配置方案。]]></description>
			<content:encoded><![CDATA[<p>服务器品牌  DELL<br />
服务器型号  PE1850<br />
cpu类型  Intel Xeon 2.80GHz<br />
cpu个数  2<br />
内存条类型  512M<br />
内存条个数  2<br />
硬盘类型1  36G<br />
硬盘个数1  1</p>
<p>操作系统：Linux centos2 2.6.18-92.el5<br />
Apache 2.0<br />
PHP 5.2.9</p>
<p>目前300并发，持续时间1小时<br />
测试截图:</p>
<p><a class="thickbox" href="http://bbs.phpchina.com/attachments/month_0904/09042911287b8c1b085214064d.png"><img class="img" src="http://bbs.phpchina.com/attachments/month_0904/09042911287b8c1b085214064d.png" alt="" /></a><br />
已安装Discuz7.0版，目前论坛并无帖子。</p>
<p>下午进行LoadRunner测试，<br />
100用户并发时，响应时间在1.5s左右。<br />
400用户并发时，响应时间约为3s，但每秒连接数一直处于170左右，无法继续上升。<br />
此时，web服务器CPU占用70%-80%<br />
Db服务器为2%，基本无压力。</p>
<p>在网上看到一些文章，Apache在配置正确的情况下基本上可以处理每秒2K的并发请求，但今天的测试让我大跌眼镜。<br />
响应时间也不够理想，况且这次的测试只是测了首页的访问，而且首页是做了缓存处理的。<br />
最开始是怀疑httpd.conf中最大连接数没有设置正确，改动后重启Apache依然如此。<br />
最令人担忧的是居高不下的CPU占用率。</p>
<p>希望有在Apache下配置Discuz经验的大虾们能给一个合理的配置方案。</p>
]]></content:encoded>
			<wfw:commentRss>http://yibin.us/archives/6096/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>PHP需要单例模式吗？</title>
		<link>http://yibin.us/archives/6090</link>
		<comments>http://yibin.us/archives/6090#comments</comments>
		<pubDate>Thu, 19 Mar 2009 02:33:45 +0000</pubDate>
		<dc:creator>幻想曲</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[设计模式]]></category>

		<guid isPermaLink="false">http://yibin.us/?p=6090</guid>
		<description><![CDATA[先看看什么是单例模式。 单例模式的存在在一些情况下是比较有意义的，如BlogEngine的站点配置就是采用的单例模式，而且它的载入和保存的代码是相当经典的，有兴趣可以看看它的源代码。 由于asp.net是编译型的，所以单例一直会存在于这个应用程序的生命周期里，真正可以做到这个实例在应用程序生命周期中的唯一性。 php的单例模式的实现大致如下： 代码来自：http://www.cnblogs.com/cocowool/archive/2009/03/18/1415660.html 但，PHP是一种解释型的语言，在这里用单例好像看不出实际的用处，一旦整个页面执行完，变量也就消失了。 我接触PHP时间不长，以上写出来的只是在C#与PHP二种不同语言环境下对单例模式的认知，也许这个例子只是为了说明模式可以用很多种语言来实现，但并不意味着在各种语言环境下都能真正起作用。 asp.net中的单例是在整个应用程序域唯一。PHP中的单例只在整个页面周期内唯一]]></description>
			<content:encoded><![CDATA[<p><a href="http://yibin.us/Archives/Singleton_pattern.aspx" target="_blank">先看看什么是单例模式</a>。<br />
单例模式的存在在一些情况下是比较有意义的，如BlogEngine的站点配置就是采用的单例模式，而且它的载入和保存的代码是相当经典的，有兴趣可以看看它的源代码。<br />
由于asp.net是编译型的，所以单例一直会存在于这个应用程序的生命周期里，真正可以做到这个实例在应用程序生命周期中的唯一性。</p>
<p>php的单例模式的实现大致如下：</p>
<pre class="brush: php; title: ; notranslate">
class Stat{
static $instance = NULL;

static function getInstance(){
if(self::$instance == NULL){
self::$instance = new Stat();
}
return self::$instance;
}

private function __construct(){
}

private function __clone(){
}

function sayHi(){
return &quot;The Class is saying hi to u &quot;;
}
}
echo Stat::getInstance()-&gt;sayHi();
</pre>
<p>代码来自：<a href="http://www.cnblogs.com/cocowool/archive/2009/03/18/1415660.html" target="_blank">http://www.cnblogs.com/cocowool/archive/2009/03/18/1415660.html</a><br />
但，PHP是一种解释型的语言，在这里用单例好像看不出实际的用处，一旦整个页面执行完，变量也就消失了。</p>
<pre class="brush: php; title: ; notranslate">
static function getInstance(){
if(self::$instance == NULL){
self::$instance = new Stat();  //这里随着页面的重载会再次执行
}
return self::$instance;
}
</pre>
<p>我接触PHP时间不长，以上写出来的只是在C#与PHP二种不同语言环境下对单例模式的认知，也许这个例子只是为了说明模式可以用很多种语言来实现，但并不意味着在各种语言环境下都能真正起作用。<br />
<span style="color: red;">asp.net中的单例是在整个应用程序域唯一。PHP中的单例只在整个页面周期内唯一</span></p>
]]></content:encoded>
			<wfw:commentRss>http://yibin.us/archives/6090/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>消除GD库绘制中文乱码</title>
		<link>http://yibin.us/archives/6088</link>
		<comments>http://yibin.us/archives/6088#comments</comments>
		<pubDate>Fri, 13 Mar 2009 14:05:16 +0000</pubDate>
		<dc:creator>幻想曲</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://yibin.us/?p=6088</guid>
		<description><![CDATA[诚如论坛上一位朋友所说： 一般刚开始用image函数库人都不知道使用这中方法来支持中文的！ 我也在这个上面卡了好久。效果图：一定要用支持中文的字体，然后配合imagettftext函数来使用。 $font = 'font/simhei.ttf'; //指定字体 $color = imagecolorallocate($img, 0,0,0); $count = count($txt); foreach($txt as $item) { imagettftext($img, 8, 0, $x, $y, $color, $font, $item); $y+=12; } 如果还乱码，请先检查是在绘制图片时出错还是绘制之前就乱码。如果绘制之前乱码可以用iconv先转换一下。另外，用mssql_connect连mssql2005时读取中文乱码还没解决。 先不弄了，看看刚到手的玩偶 顺便b4一下蓝色，论坛签名不让放图片，弄得我这个AD没法做了:)]]></description>
			<content:encoded><![CDATA[<p>诚如论坛上一位朋友所说：<br />
<blockquote class="yb-quote">一般刚开始用image函数库人都不知道使用这中方法来支持中文的！</p></blockquote>
<p>我也在这个上面卡了好久。<br />效果图：<br /><a href="http://feed.yibin001.com/sign.gif"  class="thickbox"><img src="http://feed.yibin001.com/sign.gif" class="img"  /></a><br />一定要用支持中文的字体，然后配合imagettftext函数来使用。<br /><code><br />
$font = 'font/simhei.ttf';   //指定字体<br />
$color = imagecolorallocate($img, 0,0,0);<br />
$count = count($txt);<br />
foreach($txt as $item) {<br />
    imagettftext($img, 8, 0, $x, $y, $color, $font,  $item);<br />
    $y+=12;<br />
}
</pre>
<p>如果还乱码，请先检查是在绘制图片时出错还是绘制之前就乱码。<br />如果绘制之前乱码可以用iconv先转换一下。<br />另外，用mssql_connect连mssql2005时读取中文乱码还没解决。</p>
<p>先不弄了，看看刚到手的玩偶<br /><a href="http://yibin.us/wp-content/uploads/20090313/_MG_3148.jpg"  class="thickbox"><img src="http://yibin.us/wp-content/uploads/20090313/_MG_3148.jpg" class="img"  /></a></p>
<p><a href="http://yibin.us/wp-content/uploads/20090313/_MG_3148.jpg"  class="thickbox"><img src="http://yibin.us/wp-content/uploads/20090313/_MG_3148.jpg" class="img"  /></a></p>
<p><a href="http://yibin.us/wp-content/uploads/20090313/_MG_3149.jpg"  class="thickbox"><img src="http://yibin.us/wp-content/uploads/20090313/_MG_3149.jpg" class="img"  /></a><br />顺便b4一下蓝色，论坛签名不让放图片，弄得我这个AD没法做了:)</p>
]]></content:encoded>
			<wfw:commentRss>http://yibin.us/archives/6088/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Discuz中的同步登录</title>
		<link>http://yibin.us/archives/6084</link>
		<comments>http://yibin.us/archives/6084#comments</comments>
		<pubDate>Sun, 08 Mar 2009 04:40:56 +0000</pubDate>
		<dc:creator>幻想曲</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[discuz]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://yibin.us/?p=6084</guid>
		<description><![CDATA[依附于Discuz UCenter的子应用都会有一个选项： 意思很明白了，那它是如何实现的呢？ UC/Control/user.php中有一个onsynlogin方法，这里就是处理同步登录的。 当调用该方法时，实际上会去调用该应用下api/uc.php文件，将用户名、密码及时间戳做为参数传递。 以上是实现的第一步。 第二步，当应用接收到UC的请求后，会调用uc_note类中的synlogin方法，该方法的核心是送一个P3P的HTTP头，然后种下COOKIE。 对于Disucz这种基于COOKIE验证的应用来说，就实现了同步登录。]]></description>
			<content:encoded><![CDATA[<p>依附于Discuz UCenter的子应用都会有一个选项：<br />
<a class="thickbox" href="http://yibin.us/wp-content/uploads/20090308/2009-03-08_123353.png"><img class="img" src="http://yibin.us/wp-content/uploads/20090308/2009-03-08_123353.png" alt="" /></a><br />
意思很明白了，那它是如何实现的呢？<br />
UC/Control/user.php中有一个onsynlogin方法，这里就是处理同步登录的。</p>
<pre class="brush: php; title: ; notranslate">
function onsynlogin() {
$this-&gt;init_input();
$uid = $this-&gt;input('uid');
if($this-&gt;app['synlogin']) {
if($this-&gt;user = $_ENV['user']-&gt;get_user_by_uid($uid)) {
$synstr = '';
foreach($this-&gt;cache['apps'] as $appid =&gt; $app) {
if($app['synlogin'] &amp;&amp; $app['appid'] != $this-&gt;app['appid']) {
$synstr .= '&lt;script type=&quot;text/javascript&quot; src=&quot;'.$app['url'].'/api/uc.php?time='.$this-&gt;time.'&amp;code='.urlencode($this-&gt;authcode('action=synlogin&amp;username='.$this-&gt;user['username'].'&amp;uid='.$this-&gt;user['uid'].'&amp;password='.$this-&gt;user['password'].&quot;&amp;time=&quot;.$this-&gt;time, 'ENCODE', $app['authkey'])).'&quot; reload=&quot;1&quot;&gt;&lt;/script&gt;';
}
}
return $synstr;
}
}
return '';
}
</pre>
<p>当调用该方法时，实际上会去调用该应用下api/uc.php文件，将用户名、密码及时间戳做为参数传递。<br />
以上是实现的第一步。<br />
第二步，当应用接收到UC的请求后，会调用uc_note类中的synlogin方法，该方法的核心是送一个<span style="color: navy;">P3P的HTTP头</span>，然后种下COOKIE。</p>
<pre class="brush: php; title: ; notranslate">
$discuz_auth_key = md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);
header('P3P: CP=&quot;CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR&quot;');
$uid = intval($uid);
$query = $this-&gt;db-&gt;query(&quot;SELECT username, uid, password, secques FROM &quot;.$this-&gt;tablepre.&quot;members WHERE uid='$uid'&quot;);
if($member = $this-&gt;db-&gt;fetch_array($query)) {
_setcookie('sid', '', -86400 * 365);
_setcookie('cookietime', $cookietime, 31536000);
_setcookie('auth', _authcode(&quot;$member[password]t$member[secques]t$member[uid]&quot;, 'ENCODE', $discuz_auth_key), $cookietime);
} else {
_setcookie('cookietime', $cookietime, 31536000);
_setcookie('loginuser', $username, $cookietime);
_setcookie('activationauth', _authcode($username, 'ENCODE', $discuz_auth_key), $cookietime);
}
</pre>
<p>对于Disucz这种基于COOKIE验证的应用来说，就实现了同步登录。</p>
]]></content:encoded>
			<wfw:commentRss>http://yibin.us/archives/6084/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHP中的GD操作</title>
		<link>http://yibin.us/archives/6083</link>
		<comments>http://yibin.us/archives/6083#comments</comments>
		<pubDate>Wed, 04 Mar 2009 05:23:04 +0000</pubDate>
		<dc:creator>幻想曲</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://yibin.us/?p=6083</guid>
		<description><![CDATA[这里只介绍非常非常初级的操作。 绘图时一般会经过4个过程： 1、准备好画布，并设定好宽、高以及填充色。 2、在画布上做绘图处理。 3、输出图片 4、清理资源。 在PHP中创建画布大体有二种方式： 1、直接创建一个指定宽高的画布，用imagecreate方法，只需指定宽与高即可。 2、以已有的图片为画图。基本上是在原有的图片上做二次处理。这里会涉及到多种图片格式了，方法名基本上以imagecreatefrom&#8230;开头。 创建一种颜色使用imagecolorallocate方法。 输出图片用imagepng/imagegif/imagejpg等方法生成不同格式的图片。 使用imagedestroy方法清理资源。 创建好画布后，就可以用imagestring方法书写文字了。 具体见下面的代码吧： 在线地址： http://yibin.us/demo/gd/index.php]]></description>
			<content:encoded><![CDATA[<p>这里只介绍非常非常初级的操作。<br />
绘图时一般会经过4个过程：<br />
1、准备好画布，并设定好宽、高以及填充色。<br />
2、在画布上做绘图处理。<br />
3、输出图片<br />
4、清理资源。<br />
在PHP中创建画布大体有二种方式：<br />
1、直接创建一个指定宽高的画布，用<span style="color: blue;">imagecreate</span>方法，只需指定宽与高即可。<br />
2、以已有的图片为画图。基本上是在原有的图片上做二次处理。这里会涉及到多种图片格式了，方法名基本上以<span style="color: blue;">imagecreatefrom&#8230;</span>开头。</p>
<p>创建一种颜色使用<span style="color: blue;">imagecolorallocate</span>方法。<br />
输出图片用<span style="color: blue;">imagepng/imagegif/imagejpg</span>等方法生成不同格式的图片。<br />
使用<span style="color: blue;">imagedestroy</span>方法清理资源。<br />
创建好画布后，就可以用<span style="color: blue;">imagestring</span>方法书写文字了。<br />
具体见下面的代码吧：</p>
<pre class="brush: php; title: ; notranslate">
//要书写的文字
$str=isset($_GET['s']) ? $_GET['s'] : 'yibin001.com';
//画布宽
$imagewidth = 300;
//画布高
$imageheight = 30;
//创建画布
$img = imagecreate($imagewidth,$imageheight);

//为了避免$str过长而无法在画布上完全体现出来，故对字符串做了截取
//imagefontwidth方法用来获取指定大小字体的一个字符的宽度
$StrLength = strlen($str)*imagefontwidth(2);
//将总字符的宽度控制在290以内
while($StrLength&gt;$imagewidth-10)
{
$str = substr($str, 0, strlen($str)-1);
$StrLength = strlen($str)*imagefontwidth(2);
}

//imagecolorallocate方法创建一种颜色,然后填充到画布
imagefill($img, 0,0,imagecolorallocate($img, 200, 0, 123));
$blue = imagecolorallocate($img, 0,0,255);
//计算文字在画布上起点的X与Y轴坐标,下面的算法使文本上下、左右居中
$x = ($imagewidth-(strlen($str)*imagefontwidth(2)))/2;
$y = ($imageheight-imagefontheight(2))/2;
//开始写文字了
imagestring($img,2, $x, $y, $str, $blue);
header('content-type:image/png');
//输出为png格式
imagepng($img);
//清理资源
imagedestroy($img);
</pre>
<p>在线地址：<br />
<a href="http://yibin.us/demo/gd/index.php" target="_blank">http://yibin.us/demo/gd/index.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://yibin.us/archives/6083/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Open Flash Chart For PHP</title>
		<link>http://yibin.us/archives/6082</link>
		<comments>http://yibin.us/archives/6082#comments</comments>
		<pubDate>Sun, 01 Mar 2009 07:46:56 +0000</pubDate>
		<dc:creator>幻想曲</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[ofc]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://yibin.us/?p=6082</guid>
		<description><![CDATA[OFC是一款功能强大的Flash图表控件， 网上有诸多关于它的介绍，其中官方还提供了Java/Perl/Php/.Net的相关类。 以前就想在asp.net环境下使用这款控件，但由于缺乏文档，官方的介绍比较少，一直没有真正去使用它提供的c#类库。 今天又重拾这款控件，不过是在php环境下。 可以在这里下载PHP类： http://teethgrinder.co.uk/open-flash-chart/perl-python.php 官方上提供的数据源大多是已经格式化好的.txt文件，但在实际运用的环境中，基本上是从数据库中读取数据再展示。 展示部分基本上搞定了，但目前还不知道如何去添加onclick事件。 先看在线的demo http://demo.yibin001.com/chart/chart.php 数据是随机生成的， 哪位达人告诉我如何添加事件-,- ps. google pagerank今天好像更新了,yibin001.com从3到了4，自把lemongtree.com做了301跳转后,lemongtree.com成0了。]]></description>
			<content:encoded><![CDATA[<p>OFC是一款功能强大的Flash图表控件，<br />
网上有诸多关于它的介绍，其中官方还提供了Java/Perl/Php/.Net的相关类。<br />
以前就想在asp.net环境下使用这款控件，但由于缺乏文档，官方的介绍比较少，一直没有真正去使用它提供的c#类库。<br />
今天又重拾这款控件，不过是在php环境下。<br />
可以在这里下载PHP类：<br />
<a href="http://teethgrinder.co.uk/open-flash-chart/perl-python.php" target="_blank">http://teethgrinder.co.uk/open-flash-chart/perl-python.php</a><br />
官方上提供的数据源大多是已经格式化好的.txt文件，但在实际运用的环境中，基本上是从数据库中读取数据再展示。<br />
展示部分基本上搞定了，但目前还不知道如何去添加onclick事件。<br />
先看在线的demo<br />
<a href="http://demo.yibin001.com/chart/chart.php" target="_blank">http://demo.yibin001.com/chart/chart.php</a><br />
数据是随机生成的，</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
date_default_timezone_set('PRC');
require_once('ofc_library/open-flash-chart.php');
$tmpx = array();  //X轴数据
$i = 0;
for($i=0;$i&lt;24;$i++)
{
$tmpx[] = &quot;{$i}时&quot;;
}
$tmpy = array();  //Y轴数据
$bar2_arr = array();
$i = 1;
while($i&lt;25)
{
$tmpy[] = rand(20,180);

$bar2_arr[]  = rand(25,120);
$i++;
}

$title = new title( date('r') );
$title-&gt;set_style(&quot;font-size:12px;&quot;);

$bar = new bar_glass();
$bar-&gt;text= '访问量';
$bar-&gt;set_values( $tmpy );
$bar-&gt;set_tooltip('访问量:&lt;br&gt;#val#');
$bar-&gt;set_alpha('0.3');

$bar2 = new bar_glass();
$bar2-&gt;text='IP';
$bar2-&gt;set_values($bar2_arr);
$bar2-&gt;set_colour('#FF0000');
$bar2-&gt;set_tooltip('IP&lt;br&gt;#val#');
$y = new y_axis();
$y-&gt;set_range(0,ceil(max($tmpy)),20);

$x = new x_axis();
$x-&gt;set_labels_from_array( $tmpx );

$yl =  new y_legend();
$yl-&gt;y_legend( &quot;yibin.us&quot; );
$yl-&gt;set_style( &quot;color:#000; font-size:11px;&quot; );

$chart = new open_flash_chart();
$chart-&gt;set_title( $title );

$chart-&gt;set_y_axis( $y );
$chart-&gt;set_x_axis( $x );
$chart-&gt;set_y_legend($yl);

$chart-&gt;add_element($bar);
$chart-&gt;add_element($bar2);
echo $chart-&gt;toPrettyString();
?&gt;
</pre>
<p>哪位达人告诉我如何添加事件-,-<br />
ps. google pagerank今天好像更新了,yibin001.com从3到了4，自把lemongtree.com做了301跳转后,lemongtree.com成0了。</p>
]]></content:encoded>
			<wfw:commentRss>http://yibin.us/archives/6082/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>PHP中的日期函数</title>
		<link>http://yibin.us/archives/6081</link>
		<comments>http://yibin.us/archives/6081#comments</comments>
		<pubDate>Sat, 28 Feb 2009 03:07:37 +0000</pubDate>
		<dc:creator>幻想曲</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://yibin.us/?p=6081</guid>
		<description><![CDATA[PHP中的日期时间基本上基于UNIX时间戳来处理的。比如date/getdate()/mktime()/strftime()/strtotime/time等都与时间戳有着密切的关联。这些函数的用法可查阅相关文档，这里就不对这些函数作解释了。要将时间戳转为可读的形式，就需要date函数出马了，他需要二个参数：格式化字符串与时间戳。比较难记的是格式化字符，不过常用的也就是YymdwHis，其它的亦可参阅文档。 将可读的日期转为时间戳通常用以下二个函数：mktime如：$timestam = mktime(18,30,00,8,10,1981);将得到1981年8月10日下午6点30整的时间戳。另一个比较NB的是strtotime，看名字就是将字符串转为一个时间戳。它的NB之处不在于解析如：Tue,15 Mar 2005 15:23:52或2008-01-01此类的字符串，strtotime还可以“理解”一定的英语。如下面的代码： &#60;?php date_default_timezone_set("PRC"); $mydatestring = array('now','today','tomorrow','yesterday','thursday','this thursday','last thursday','+2 hours','-1 month','30 seconds','next week','last year','2 weeks ago'); foreach($mydatestring as $item) { echo "$item:".date('r',strtotime($item)).'&#60;br /&#62;'; } ?&#62; 输出： now:Sat, 28 Feb 2009 11:03:35 +0800today:Sat, 28 Feb 2009 00:00:00 +0800tomorrow:Sun, 01 Mar 2009 00:00:00 +0800yesterday:Fri, 27 Feb 2009 00:00:00 +0800thursday:Thu, 05 Mar 2009 [...]]]></description>
			<content:encoded><![CDATA[<p>PHP中的日期时间基本上基于UNIX时间戳来处理的。<br />比如date/getdate()/mktime()/strftime()/strtotime/time等都与时间戳有着密切的关联。<br />这些函数的用法可查阅相关文档，这里就不对这些函数作解释了。<br />要将时间戳转为可读的形式，就需要date函数出马了，他需要二个参数：格式化字符串与时间戳。<br />比较难记的是格式化字符，不过常用的也就是YymdwHis，其它的亦可参阅文档。</p>
<p>将可读的日期转为时间戳通常用以下二个函数：<br /><font color="Navy">mktime</font><br />如：<br />$timestam = mktime(18,30,00,8,10,1981);<br />将得到1981年8月10日下午6点30整的时间戳。<br />另一个比较NB的是<font color="Navy">strtotime</font>，看名字就是将字符串转为一个时间戳。<br />它的NB之处不在于解析如：Tue,15 Mar 2005 15:23:52或2008-01-01此类的字符串，strtotime还可以“理解”一定的英语。<br />如下面的代码：<br /><code><br />
&lt;?php<br />
date_default_timezone_set("PRC");<br />
$mydatestring = array('now','today','tomorrow','yesterday','thursday','this thursday','last thursday','+2 hours','-1 month','30 seconds','next week','last year','2 weeks ago');<br />
foreach($mydatestring as $item)<br />
{<br />
	echo "$item:".date('r',strtotime($item)).'&lt;br /&gt;';<br />
}<br />
?&gt;
</pre>
<p>输出：<br />
<blockquote class="yb-quote">now:Sat, 28 Feb 2009 11:03:35 +0800<br />today:Sat, 28 Feb 2009 00:00:00 +0800<br />tomorrow:Sun, 01 Mar 2009 00:00:00 +0800<br />yesterday:Fri, 27 Feb 2009 00:00:00 +0800<br />thursday:Thu, 05 Mar 2009 00:00:00 +0800<br />this thursday:Thu, 05 Mar 2009 00:00:00 +0800<br />last thursday:Thu, 26 Feb 2009 00:00:00 +0800<br />+2 hours:Sat, 28 Feb 2009 13:03:35 +0800<br />-1 month:Wed, 28 Jan 2009 11:03:35 +0800<br />30 seconds:Sat, 28 Feb 2009 11:04:05 +0800<br />next week:Sat, 07 Mar 2009 11:03:35 +0800<br />last year:Thu, 28 Feb 2008 11:03:35 +0800<br />2 weeks ago:Sat, 14 Feb 2009 11:03:35 +0800</p></blockquote>
<p>再如我要查找下个月的第一个星期五：<br /><code><br />
$nextmonth = date('Y-'.(date('n')+1).'-0');<br />
$nextmonth_timest = strtotime($nextmonth);<br />
$first_fri = strtotime('Fri',$nextmonth_timest);<br />
echo "Today:".date('Y-m-d');<br />
echo '&lt;br /&gt;';<br />
echo 'the first Fri of next month is :'.date('Y-m-d',$first_fri);
</pre>
<p>输出：<br />Today:2009-02-28<br />the first Fri of next month is :2009-03-06</p>
<p>还有太多太多，以后有时间再写。</p>
]]></content:encoded>
			<wfw:commentRss>http://yibin.us/archives/6081/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

