mp3插放器插件,需要的拿去用吧

2009-06-28

模仿一个runcode插件改写的,wp的插件写起来还是比较简单的。

播放器是用豆瓣的,你要不喜欢可以换成别的,就需要自己改代码了。

调用方法【mp3】xxxxx【/mp3】,全角换成半角的就行了。

代码如下:

<?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(&$player, 'convert'), -500);
unset($player);
class player
{
function __builderplayer($url) {
if(empty($url)) return '';
return sprintf('<p><embed src="http://www.douban.com/swf/player.swf?url=%s&autoplay=0" type="application/x-shockwave-flash" wmode="transparent" allowscriptaccess="always" width="400" height="80" /></p>',$url);
}
function convert($content)
{

$str_pattern = "/\[mp3\](.*?)\[\/mp3\]/i";
$content = preg_replace($str_pattern,$this->__builderplayer('\\1'),$content);
return $content;
}
}
?>

上传到wp的插件目录,然后在后台启用就行了

真正兼容.net的php 3DES加解密

2009-06-15

php中3des加密的结果与.Net/java不同的帖子与话题实在是太多了,

我前不久也在倒腾这些,不过今天已经搞定了,完全与.net中的兼容

<?php
class Crypt3Des
{
private $key = "";
private $iv = "";
/**
* 构造,传递二个已经进行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->key = $key;
$this->iv = $iv;
}
/**
*加密
* @param <type> $value
* @return <type>
*/
public function encrypt ($value)
{
$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
$iv = base64_decode($this->iv);
$value = $this->PaddingPKCS7($value);
$key = base64_decode($this->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 <type> $value
* @return <type>
*/
public function decrypt ($value)
{
$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
$iv = base64_decode($this->iv);
$key = base64_decode($this->key);
mcrypt_generic_init($td, $key, $iv);
$ret = trim(mdecrypt_generic($td, base64_decode($value)));
$ret = $this->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 > strlen($text)) {
return false;
}
if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
return false;
}
return substr($text, 0, - 1 * $pad);
}
}
?>
直接拿去用吧。

UCenter简析

2009-05-10

UCenter是采用很经典的MVC架构

  阅读全文 »

寻Apache2下Discuz高性能配置方案

2009-04-28

服务器品牌 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经验的大虾们能给一个合理的配置方案。

PHP需要单例模式吗?

2009-03-19

先看看什么是单例模式
单例模式的存在在一些情况下是比较有意义的,如BlogEngine的站点配置就是采用的单例模式,而且它的载入和保存的代码是相当经典的,有兴趣可以看看它的源代码。
由于asp.net是编译型的,所以单例一直会存在于这个应用程序的生命周期里,真正可以做到这个实例在应用程序生命周期中的唯一性。

php的单例模式的实现大致如下:

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 "The Class is saying hi to u ";
}
}
echo Stat::getInstance()->sayHi();

代码来自:http://www.cnblogs.com/cocowool/archive/2009/03/18/1415660.html
但,PHP是一种解释型的语言,在这里用单例好像看不出实际的用处,一旦整个页面执行完,变量也就消失了。

static function getInstance(){
if(self::$instance == NULL){
self::$instance = new Stat();  //这里随着页面的重载会再次执行
}
return self::$instance;
}

我接触PHP时间不长,以上写出来的只是在C#与PHP二种不同语言环境下对单例模式的认知,也许这个例子只是为了说明模式可以用很多种语言来实现,但并不意味着在各种语言环境下都能真正起作用。
asp.net中的单例是在整个应用程序域唯一。PHP中的单例只在整个页面周期内唯一

消除GD库绘制中文乱码

2009-03-13

诚如论坛上一位朋友所说:

一般刚开始用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没法做了:)

Discuz中的同步登录

2009-03-08

依附于Discuz UCenter的子应用都会有一个选项:

意思很明白了,那它是如何实现的呢?
UC/Control/user.php中有一个onsynlogin方法,这里就是处理同步登录的。

function onsynlogin() {
$this->init_input();
$uid = $this->input('uid');
if($this->app['synlogin']) {
if($this->user = $_ENV['user']->get_user_by_uid($uid)) {
$synstr = '';
foreach($this->cache['apps'] as $appid => $app) {
if($app['synlogin'] && $app['appid'] != $this->app['appid']) {
$synstr .= '<script type="text/javascript" src="'.$app['url'].'/api/uc.php?time='.$this->time.'&code='.urlencode($this->authcode('action=synlogin&username='.$this->user['username'].'&uid='.$this->user['uid'].'&password='.$this->user['password']."&time=".$this->time, 'ENCODE', $app['authkey'])).'" reload="1"></script>';
}
}
return $synstr;
}
}
return '';
}

当调用该方法时,实际上会去调用该应用下api/uc.php文件,将用户名、密码及时间戳做为参数传递。
以上是实现的第一步。
第二步,当应用接收到UC的请求后,会调用uc_note类中的synlogin方法,该方法的核心是送一个P3P的HTTP头,然后种下COOKIE。

$discuz_auth_key = md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
$uid = intval($uid);
$query = $this->db->query("SELECT username, uid, password, secques FROM ".$this->tablepre."members WHERE uid='$uid'");
if($member = $this->db->fetch_array($query)) {
_setcookie('sid', '', -86400 * 365);
_setcookie('cookietime', $cookietime, 31536000);
_setcookie('auth', _authcode("$member[password]t$member[secques]t$member[uid]", 'ENCODE', $discuz_auth_key), $cookietime);
} else {
_setcookie('cookietime', $cookietime, 31536000);
_setcookie('loginuser', $username, $cookietime);
_setcookie('activationauth', _authcode($username, 'ENCODE', $discuz_auth_key), $cookietime);
}

对于Disucz这种基于COOKIE验证的应用来说,就实现了同步登录。

PHP中的GD操作

2009-03-04

这里只介绍非常非常初级的操作。
绘图时一般会经过4个过程:
1、准备好画布,并设定好宽、高以及填充色。
2、在画布上做绘图处理。
3、输出图片
4、清理资源。
在PHP中创建画布大体有二种方式:
1、直接创建一个指定宽高的画布,用imagecreate方法,只需指定宽与高即可。
2、以已有的图片为画图。基本上是在原有的图片上做二次处理。这里会涉及到多种图片格式了,方法名基本上以imagecreatefrom…开头。

创建一种颜色使用imagecolorallocate方法。
输出图片用imagepng/imagegif/imagejpg等方法生成不同格式的图片。
使用imagedestroy方法清理资源。
创建好画布后,就可以用imagestring方法书写文字了。
具体见下面的代码吧:

//要书写的文字
$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>$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);

在线地址:
http://yibin.us/demo/gd/index.php

Open Flash Chart For PHP

2009-03-01

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
数据是随机生成的,

<?php
date_default_timezone_set('PRC');
require_once('ofc_library/open-flash-chart.php');
$tmpx = array();  //X轴数据
$i = 0;
for($i=0;$i<24;$i++)
{
$tmpx[] = "{$i}时";
}
$tmpy = array();  //Y轴数据
$bar2_arr = array();
$i = 1;
while($i<25)
{
$tmpy[] = rand(20,180);

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

$title = new title( date('r') );
$title->set_style("font-size:12px;");

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

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

$x = new x_axis();
$x->set_labels_from_array( $tmpx );

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

$chart = new open_flash_chart();
$chart->set_title( $title );

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

$chart->add_element($bar);
$chart->add_element($bar2);
echo $chart->toPrettyString();
?>

哪位达人告诉我如何添加事件-,-
ps. google pagerank今天好像更新了,yibin001.com从3到了4,自把lemongtree.com做了301跳转后,lemongtree.com成0了。

PHP中的日期函数

2009-02-28

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还可以“理解”一定的英语。
如下面的代码:

<?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)).'<br />';
}
?>

输出:

now:Sat, 28 Feb 2009 11:03:35 +0800
today:Sat, 28 Feb 2009 00:00:00 +0800
tomorrow:Sun, 01 Mar 2009 00:00:00 +0800
yesterday:Fri, 27 Feb 2009 00:00:00 +0800
thursday:Thu, 05 Mar 2009 00:00:00 +0800
this thursday:Thu, 05 Mar 2009 00:00:00 +0800
last thursday:Thu, 26 Feb 2009 00:00:00 +0800
+2 hours:Sat, 28 Feb 2009 13:03:35 +0800
-1 month:Wed, 28 Jan 2009 11:03:35 +0800
30 seconds:Sat, 28 Feb 2009 11:04:05 +0800
next week:Sat, 07 Mar 2009 11:03:35 +0800
last year:Thu, 28 Feb 2008 11:03:35 +0800
2 weeks ago:Sat, 14 Feb 2009 11:03:35 +0800

再如我要查找下个月的第一个星期五:

$nextmonth = date('Y-'.(date('n')+1).'-0');
$nextmonth_timest = strtotime($nextmonth);
$first_fri = strtotime('Fri',$nextmonth_timest);
echo "Today:".date('Y-m-d');
echo '<br />';
echo 'the first Fri of next month is :'.date('Y-m-d',$first_fri);

输出:
Today:2009-02-28
the first Fri of next month is :2009-03-06

还有太多太多,以后有时间再写。