php使用json代替serialize的想法

2012.01.27 3:49 上午 »Author: qlj » 22 views

我需要把一些内容存放在数据库,感觉这些没必要建立字段,于是索性放在数组中序列化后存入数据库.
使用serialize序列化后的字符串很多内容都是不需要的,比如长度信息,数据类型.
感觉平时用的json不错.
打算用json代替,
网上好多结果都是json语serialize的速度比较,这个倒没很大的必要.
需要注意的是 json_decode时返回的是object,需要

json_decode("字符串",ture);

后来发现也不是那么完美..
json_encode会对中文进行编码.如果含有大量的中文,那长度超过了serialize.
这让人很蛋疼,网上给出的办法是对内容进行urlencode,json_enocde后再urldecode

function jsonencode($code){ //新json_encode
 $code = json_encode(urlencodearray($code));//对数组处理
 return urldecode($code);
}
function urlencodearray($data){//urlencode数组
 if(is_array($data)){
 foreach($data as $key=>$val){
 $data[$key] = urlencodearray($val);
 }
 return $data;
 }else{
 return urlencode($data);
 }
}

真是菊花一紧啊….
再这之后还可以进行一次压缩.
当然,如果不考虑内容的可读性,用其他的扩展也不错,比如msgpack,

linux下通过wget模拟 批量回帖抢楼

2011.11.19 4:16 下午 »Author: qlj » 635 views

discuz 回帖必要的参数

header 中
referer 帖子地址 若出现 意外提交一般为这个不对

cookies 登录状态

内容中
formhash

message

有了这些 就可以模拟发帖了

Read More »

php邮件发送类推荐 PHPMailer:smtp法

2011.05.26 3:48 上午 »Author: qlj » 1,296 views

这里说明下 我用的是SMTP 其他方法的请继续 GOOGLE
刚拿到的时候 测试了下发信 无异常 支持HTML
但是SMTP 发送的过程中 需要先于SMTP 服务器建立连接 然后发信
这个过程可能需要1-3秒 可能会导致网页响应较长时间
所以呢. 我们建立一个表用于存放发送的邮件队列
每次发送邮件是将 邮件内容加入表中
然后 用CRON 每分钟检查下表 若存在 则 队列发送
目前在起哄网上使用中.用于发送EMAIL认证邮件

 
--
-- 表的结构 `qlj_sendmail`
--
 
CREATE TABLE IF NOT EXISTS `qlj_sendmail` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(50) DEFAULT NULL,
  `subject` varchar(120) DEFAULT NULL,
  `body` text,
  `error` tinyint(1) NOT NULL DEFAULT '0',
  `dateline` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
#!/usr/local/php/bin/php -q
<?php
include_once('mysql.class.php');
include_once('class.phpmailer.php');
$mail                = new PHPMailer();
$db = new DB;
$db->connect('', '', '', '');
$mail->IsSMTP(); 
	$mail->Host = "";  //SMTP服务器
	$mail->Username = "no-reply@qihoon.com";  
	$mail->Password = "";    
	$mail->FromName =  "起哄网信使";   
	$mail->SMTPAuth = true;          
	$mail->From = $mail->Username;
	$mail->CharSet = "utf8";           
	$mail->Encoding = "base64"; 
	$mail->AddAddress($sendto_email);  
$result=$db->query("SELECT id,email,subject,body FROM `qlj_sendmail` where error='0' LIMIT 0 , 30");
if($db->num_rows($result)<1) exit(); 
while ($row =$db->fetch_array($result)) {
$mail->AltBody ="text/html"; 
$mail->Subject = $row['subject'];
$mail->MsgHTML($row['body']);
  $mail->AddAddress($row["email"], $row["full_name"]);
  if(!$mail->Send()) {
    //$errorid[]=array(id=>$row['id'],error=>$mail->ErrorInfo);//本来想记录出错信息的.但是表是INT 不浪费字段了.
	  $errid[]=$row['id'];
  } else {
     $okid[]=$row['id'];
  }
  $mail->ClearAddresses();
}
if(count($okid)>0){
	$sok=implode(',',$okid);
	$db->query("delete from `qlj_sendmail` where id in($sok) ;");
	}
	if(count($errid)>0){
	$serr=implode(',',$errid);
	$db->query("update `qlj_sendmail` set error='1' where id in($serr) ;");
	}
?>

最后在 CRONTAB中 加入 每分钟的计划任务
*/1 * * * * /usr/local/php/bin/php /home/yingouqlj/send_mail.php

参考官方实例.

DISCUZ漫游平台移植记

2011.03.20 3:30 上午 »Author: qlj » 1,089 views

想让自己的网站支持应用平台
个人能力有限.不可能自己搭建应用平台
国内的开源SNS程序中 只有DISCUZ提供了应用平台(漫游)
GOOGLE 的OPENSOCIAL 目前没找到方法
FACEBOOK 的是被墙的..

刚好THINKSNS 也已经使用了漫游平台.
那应该是没问题的.. 用THINKSNS 的代码看了下差不多是从UCHOME 移过来的

所以打算吧THINKSNS 的这个移动到我自己的SNS程序上
discuz漫游平台分析
Read More »

3月11日去了上海gtug谷歌开发技术分享活动

2011.03.14 4:01 上午 »Author: qlj » 2,145 views

挺有意思的活动,来自GOOGLE GROUP 分享一下 也算是宣传吧 shanghai-gtug@googlegroups.com
上海GTUG
内容安排:
18:00 – 18:30 Set Up / Registration 签到
18:30 – 18:50 Opening 开场
18:50 – 19:00 HTML5 Identity
19:00 – 20:00 Chrome / HTML5
20:00 – 20:15 Break 休息
20:15 – 21:00 Andriod
21:00 – 21:20 AdMob
21:20 – 21:30 Q & A 问答
Read More »

node.js 初体验

2011.03.12 3:31 上午 »Author: qlj » 516 views

依据Google著名的开源JavaScript引擎V8来进行二次开发的Web I/O服务器(http://nodejs.org/)。V8本身是非常快的JavaScript引擎,处理JS执行运行的速度非常高。相关测试表明,FireFox、Opera和IE的JS引擎速度都不及V8来得快。而且,还可以说,只要浏览器之间的JS引擎大战一日不减,NodeJs就可以从中受益。有竞争才有进步:)。
以上简介 网络复制。。不介绍了
Read More »

php延时更新点击数[文件缓存]

2011.03.09 12:56 上午 »Author: qlj » 798 views

想法来源

用户积分增加

列入 用户访问空间时增加1分

用户首次登陆增加10分

那么每次操作都要insert一次

这显然很浪费

如果可以缓存一次性写入那么就可以降低MYSQL的压力了

像上面的情况我只要一次性增加11分即可

在THINKPHP中找到了方法

下面代码转载自THINKPHP(advmodel.class.php)

setLazyInc($field,$condition='',$step=1,$lazyTime=0) { //缓存累加
        if(empty($condition) && isset($this->options['where']))
            $condition   =  $this->options['where'];
        if(empty($condition)) { // 没有条件不做任何更新
            return false;
        }
        if($lazyTime>0) {// 延迟写入
            $guid =  md5($this->name.'_'.$field.'_'.serialize($condition));
            $step = $this->lazyWrite($guid,$step,$lazyTime);
            if(false === $step ) return true; // 等待下次写入
        }
        return $this->setField($field,array('exp',$field.'+'.$step),$condition);
    }
 
function lazyWrite($guid,$step,$lazyTime) {   
        if(false !== ($value = F($guid))) { // 存在缓存写入数据
            if(time()>F($guid.'_time')+$lazyTime) {
                // 延时更新时间到了,删除缓存数据 并实际写入数据库
                F($guid,NULL);
                F($guid.'_time',NULL);
                return $value+$step;
            }else{
                // 追加数据到缓存
                F($guid,$value+$step);
                return false;
            }
        }else{ // 没有缓存数据
            F($guid,$step);
            // 计时开始
            F($guid.'_time',time());
            return false;
        }
    }

上面有个 FUNCTION F 在FACTIONS.PHP

// 快速文件数据读取和保存 针对简单类型数据 字符串、数组
function F($name,$value='',$path=DATA_PATH) { //修改$path为自己的缓存路径
    static $_cache = array();
    $filename   =   $path.$name.'.php';
    if('' !== $value) {
        if(is_null($value)) {
            // 删除缓存
            return unlink($filename);
        }else{
            // 缓存数据
            $dir   =  dirname($filename);
            // 目录不存在则创建
            if(!is_dir($dir))  mkdir($dir);
            return file_put_contents($filename,"<?php\nreturn ".var_export($value,true).";\n?>");
        }
    }

调用方法

setLazyDec($field,$condition='',$step=1,$lazyTime=0) 
//根据需要 自己修改吧我加入了table 等多个
function lazyaddint($table,$field,$condition='',$num=1,$ltime=0)
//调用方法 更具实际需要修改吧
lazyaddint('表明','字段名',"WHERE条件",增加数量,缓存时间);

此方法 会在缓存目录中创建2个临时文件

//07e8c1b06dbdc4f282bf7bf9311a1fce_time.php
<?php
return 1299602761;
?>
 
//07e8c1b06dbdc4f282bf7bf9311a1fce.php
<?php
return 21;
?>

根据时间超过 设定的时间就写入数据库
此方法已经适用无问题
感觉方法不太好.. 期待MEMCACHED的方式

10张凡客礼品卡/优惠券和密码 2011年2月底结束

2011.02.15 10:31 下午 »Author: qlj » 904 views

凡客诚品邮件过来的卡号跟密码

顺序自己试 一次性用品  点查询 如果可以使用就用吧 ,不能使用就是已经有人用了

面值10圆

您礼品卡的余额为10.00元,有效期截止2011-02-28

卡 号 密 码
1SCCL1104282X 57745797
1SCCL1104282Y 53541496
1SCCL1104282Z 13692279
1SCCL11042830 16297680
1SCCL11042831 27648202

视觉欺骗变真男人(肌肉的秘密).生日快乐

2011.02.05 3:08 上午 »Author: qlj » 1,813 views

半年没啥动静的博客..真对不起我自己..HOHO .借着生日.发篇文章凑个数.
首先.事件的开端是..
阴沟历经3个月的努力..从3个俯卧撑可以坚持到30个了..(虽然不是标准的30个…但也算可以凑数啊…前20个没问题..后10个人挺不直了)
接着..引起了我们为人民服务的好敬察胖绝泪的兴趣…
Read More »

UBUNTU默认界面关闭,最小化,最大化回到右边

2010.11.11 10:38 上午 »Author: qlj » 2,281 views

不容易习惯这感觉。。
按Alt+F2快捷键打开”运行对话框”,并输入gconf-editor或者直接在终端中输入gconf-editor命令,打开Ubuntu的 Configuration Editor对话框。找到”apps/metacity/general”项,在右边的列表中找到”button_layout”键,双击修改它的值为

menu:maximize,minimize,close

保存并关闭Configuration Editor。

早前文章 »