手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表2024年11月的文章

使用PHPRPC与论坛同步登录退出

很久以前就用过PHPRPC,几年没用了,虽然一直在关注着,最近尝试着他来做了一下DZ6.0论坛,把遇到的情况与大家分享一下

首先使用PHPRPC把服务器的一些信息传递给客户端,如cookie的一些设置还有最重要的auth_key,然而即使是这样,我最后也没有同步成功。

经过仔细检查,才发现原来是authcode函数所导致。因为authcode函数里使用了一个全局变量$discuz_auth_key,这个key是在使用common.inc.php的时候根据useragent加上一定的规范而生成的。我在传递的时候把这个变量传回给了客户端,但发现通过PHPRPC生成的key与直接使用浏览器打开生成的KEY不一样。导致最后登录所生成的COOKIE无法decode,最后根据这个生成key的规范,在客户端直接生成好发送给服务端覆盖掉全局变量,使得验证通过。

(写的有点乱,其实就是对于不是从数据库里读出来的全局变量,PHPRPC访问时与直接浏览器访问时所生成的数据不一样)

然后在登录的时候因为DZ还要判断SID,如果有SID了那肯定是无法同步登录(理由和上面一样,两边生成的SID会不一样),于是先清空SID,然后再登录,由服务端生成好SID再传回来,就OK了。。。

由于这次是加载common.inc.php进行处理的,所以很多变量会在系统加载的时候生成,但由于我采用了PHPRPC,在这一步完成后,我会尝试不再加载common.inc.php,这样也可以节约开销(在用户量不大的时候无所谓,但因为每次调用PHPRPC,可能会造成在线用户数加1 这个问题。)

逐步改进,oh yeah

Tags: phprpc

Linux关机命令 shutdown命令

LINUX的关机与WINDOWS不一样,不能象WIN那样强关,如果强关可能会导致一些数据丢失,所以。。。

shutdown
1.作用
shutdown命令的作用是关闭计算机,它的使用权限是超级用户。

2.格式
shutdown [-h][-i][-k][-m][-t]

3.重要参数
-t:在改变到其它运行级别之前,告诉init程序多久以后关机。
-k:并不真正关机,只是送警告信号给每位登录者。
-h:关机后关闭电源。
-c:cancel current process取消目前正在执行的关机程序。所以这个选项当然没有时间参数,但是可以输入一个用来解释的讯息,而这信息把会送到每位使用者。
-F:在重启计算机时强迫fsck。
-time:设定关机前的时间。
-m: 把系统改为单用户模式。
-i:关机时显示系统信息。

4.命令说明
shutdown 命令可以安全地把系统关机。有些用户会使用直接断掉电源的方式来关闭Linux系统,这是十分危险的。因为Linux与Windows不同,其后台运行着 许多进程,所以强制关机可能会导致进程的数据丢失,使系统处于不稳定的状态,甚至在有的系统中会损坏硬件设备(硬盘)。在系统关机前使用 shutdown命令,系统管理员会通知所有登录的用户系统把要关闭,并且login指令会被冻结,即新的用户不能再登录。

 

Tags: shutdown

pktmandy:php ajax开发中的字符集

最近在作一个uchome的小应用(只有两个input),为了增加体验要用到ajax,结果一折腾就是好几天,光调字符集问题就花了两天,以 前写asp,jsp时从来没费这么大劲.由于DW3中的default encoding没有GBK选项,用UTF-8写到库里是乱码,只能用GB2312.ajax总是在参数是中文时返回错误的结果(MySQL的 Connection是GBK,php页面用的是GB2312;header,meta,ajax的setRequestHeader也是 GB2312).
 
1.GBK和GB2312的不同
用FireFox的FireBug看到参数发送时是乱码,但在被请求页中返回的请求参数是正常的!就没有往字符集上想.就理所认为GBK ==GB2312,我从MSDN上看到的也验证了这个结果。让我们一起去看看:
大小: 51.43 K
尺寸: 500 x 17
浏览: 1890 次
点击打开新窗口浏览全图
大小: 56.06 K
尺寸: 500 x 31
浏览: 1718 次
点击打开新窗口浏览全图
 
折腾了2个多小时没想明白!去搜索一下吧:
以下来自:CSDN:http://blog.csdn.net/gashero/archive/2007/02/17/1511435.aspx

也许大家已经看惯了书上说的GBK是对GB2312的扩充,就是说,GB2312字符集中的所有字符都可以在GBK 字符集中找到。(by gashero)可是最近在一次调试Python爬虫的过程中就发现了一些字符的不同。同时大家也应该注意一些网页的默认编码字符集了。

当时正在分析的一个网页的默认编码字符集是GB2312,其中含有一个符号"·",这个常作为项目符号。在使用 GB2312进行解码时,得到的unicode字符是\u30fb,然后使用系统默认编码GBK进行打印时就提示了编码错误。即字符串"\xa1 \xa4"无法使用GB2312解码为unicode字符后再编码为GBK编码显示。(by gashero)实际测试中只要不会交换编码,那么使用同一种编码进行编码和解码就不会出问题。

后来查找得知,字符\u30fb是一种特殊的unicode字符,是一种不允许显示的字符,所以在GBK编码中就没有它的位置(by gashero)。而字符串"\xa1\xa4"使用GBK解码时得到的是\u00b7。

至此得知,虽然网页的默认编码是GB2312,但是实际上使用的是GBK编码,也使用了一些在GB2312和GBK之间不同的编码字符。所以也就导致了这个错误。

建议以后编程序的时候,遇到默认编码为GB2312的大可以直接使用GBK进行解码为unicode字符串。

明白了,我把所有有关字符集设置的地方都换成:GBK.这时通过FF的FireBug看到的请求参数正常了.问题解决了.

2.都有哪些地方要设置字符集呢?为什么要统一呢?

[原文中作者在此是引用他在csdn中的文字,我将他复制回来了,最后几段代码可看性不强,所以没有贴。。。http://blog.csdn.net/xiaofanku/archive/2008/06/25/2584856.aspx]

最近在学php,由于项目的需要!想在php中用ajax来完成一些体验(减少业务处理的单页压力).发现最近也有一位朋友为此苦恼不已.不废话了!
1.注意几个编码地方
1.1表单所在的网页的:meta
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

1.2XMLHTTPRequest GET的编码
httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
此处设置不对!responseText会返回empty(没有内容),如果您有FireFox并装有FireBug组件的话,点击状态栏的绿色箭头打开控件面板(非OS的,FireBug的),选中Console会看到Response选项是:
Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation '=
当然如果是连接数据库的话也可能跟下面的(1.4)有关系.

1.3ajax GET请求的页面(.php)header
header("Content-Type:text/html;charset=UTF-8");

1.4数据连接的编码
mysql_query("SET CHARACTER SET UTF8");

如果你的数据库是GBK的或其它的字符集,为了统一编码还要与以上三个统一起来.下面我的示例用的数据库也是GBK,从昨天开始我一起把它设成:
mysql_query("SET CHARACTER SET GBK");
可还是有时发现会返回空(empty 我用的是ResponseText),千万不要写成UTF-8噢,数据库的字符集是没有中间的"-"

2.如果还是返回空或无效的值

例如:a.html中有表单,a用XMLHTTPRequest和b.php通讯.
首先要保证b.php可以正确运行,例b.php?param=value打印出来的是你期望的值
如果a.html打印b.php返回的结果(ajax)与上面的(单独运行b.php)执行结果有出入.可以删除b.php中的空行试试!我想应该不会出现这种情况,但我有几次作demo删除后和删除前确实有出入

pengyuan xu:把几个任意格式的图片合成一个GIF动画的方法

一大早pengyuan就和我说了一些用多张图片合并成一个GIF的方案,他使用了我前段时间博客里提到的imagick的组件。

然后把代码贴给我看了一下。
这是他第一次的代码:

PHP代码
  1. <?php  
  2. $animation = new Imagick();  
  3. $animation->setFormat( "gif" );  
  4. for ($i=1; $i<4; $i++) {  
  5.     $thisimage = new Imagick();  
  6.     $thisimage->readImage($i.'.png');  
  7.     $thisimage->setImageFormat( "gif" );  
  8.     $animation->addImage($thisimage);  
  9.     $animation->setImageDelay(1000);  
  10. }  
  11. header( "Content-Type: image/gif" );  
  12. echo $animation->getImagesBlob();  

然后,他发现图片怎么也没有动,于是有了第二次的代码:

PHP代码
  1. <?php  
  2. $image=new Imagick();  
  3. $animation = new Imagick(); //建立一个对象。  
  4. $animation->setFormat( "gif" ); //设置它的类型。  
  5. $delay = 30; //设置播放速度。  
  6.   
  7. for ($i=1; $i<4; $i++) {  
  8.     $thisimage = new Imagick();  
  9.     $thisimage->readImage($i.'.jpg'); //我有三个图片分别叫:1.jpg,2.jpg,3.jpg 就是要合成他们三个。  
  10.     $thisimage->setFormat( "gif" ); //把他们都转成GIF格式。  
  11.     $animation->addImage($thisimage); //加入到刚才建立的那个gif imagick对象之中。  
  12.     $animation->setImageDelay( $delay ); //设置好播放速度。  
  13. }  
  14.   
  15. header( "Content-Type: image/gif" );  
  16. $animation->writeImages("9.gif",true); //文件存储。  

在这样的情况下,他发现GIF图片可以动了。看来保存成功了。

根据他写的代码,我作了一个小小的测试:

PHP代码
  1. <?php  
  2. $filelist = array(  
  3.     '1.jpg',  
  4.     '2.jpg',  
  5.     '3.jpg'  
  6. );  
  7.   
  8. $animation = new Imagick(); //create animation object  
  9. $animation->setFormat('gif'); // set file type  
  10.   
  11. foreach ( $filelist as $file ){  
  12.     $image = new Imagick();  
  13.     $image->readImage( $file );  
  14.     $animation->addImage( $image );  
  15.     $animation->setImageDelay(60);    
  16.     unset( $image );  
  17. }  
  18. header( "Content-Type: image/gif" );   
  19. echo$animation->getImagesBlob() );  
  20. //$animation->writeImages( time().".gif" ,true );  

代码几乎没变,除了在readImage行下面那个setFormat函数去掉了。同样生成了GIF图片,现在我把问题和解决情况和大家说一下,也希望大家少走点弯路吧

1、在animation里设置好setFormat为gif后,其他地方可以不需要设,因为最终都是通过 $animation->addImage 进入载入图片的,所以载进来肯定是GIF了
2、$animation->setImageDelay( 60 ) ,这个设置帧数的设定只能在每次AddImage后才能设定,否则会报错:没有加载图片时不能设定帧数
3、$animation->writeImages函数,不能使用writeImage,因为是多帧的,它会认为是多张图片
4、至于为什么在使用header设定文件头和echo 输出后图片没有动,我目前怀疑这是浏览器的设定关系,因为,你右键点击生成的图片另存下来时,图片是可以正常的跳动的。

解决完毕。感谢pengyuan的代码

Tags: imagick, gif

另类的想法:用imagick把pdf转成png图片格式

原文:http://hi.baidu.com/dream621/blog/item/7f60de82781b37b96d81196d.html

PHP代码
  1. /** 
  2. * 简单的用imagick把pdf转为png图片,需要调整图片内容大小的改120这个值 
  3. * 作者:lazy 
  4. * 版权:无,可随意使用.可以的话请保留作者跟出处 
  5. * 参数: 
  6. *        $PDF是pdf的路径,pdf文件要存在否则无法处理 
  7. *        $Path是要保存的图片路径,注意要有写权限 
  8. * 返回值:图片的路径(数组) 
  9. * 其它: 
  10. *        要加水印啥的请自己添加. 
  11. *        怎么安装imagick扩展可以看php手册或者google; 
  12. *        http://cn2.php.net/manual/en/class.imagick.php 
  13.  
  14. */  
  15. function pdf2png($PDF,$Path){  
  16.    if(!extension_loaded('imagick')){  
  17.        return false;  
  18.    }  
  19.    if(!file_exists($PDF)){  
  20.        return false;  
  21.    }  
  22.    $IM = new imagick();  
  23.    $IM->setResolution(120,120);  
  24.    $IM->setCompressionQuality(100);  
  25.    $IM->readImage($PDF);  
  26.    foreach ($IM as $Key => $Var){  
  27.        $Var->setImageFormat('png');  
  28.        $Filename = $Path.'/'.md5($Key.time()).'.png';  
  29.        if($Var->writeImage($Filename) == true){  
  30.            $Return[] = $Filename;  
  31.        }  
  32.    }  
  33.    return $Return;  
  34. }  
主要是思路不错就转发了