关于飞信,我上次写过学着写PHP飞信,然而今天晚上我把上文中测试的内容重现时却发现,现实有点残酷。我用curl的时候,速度居然没有fsocketopen快?我于是多次测试,然而,我却得到了一些令人沮丧的结果
【$postData,$postLength,都不提供。。。】
1、curl,利用curl来post
平均【大约 1.8~1.9秒】
- $ch = curl_init();
- $chOptions = array(
- CURLOPT_URL => "http://nav.fetion.com.cn/nav/getsystemconfig.aspx",
- CURLOPT_HTTP_VERSION => 'HTTP/1.0',
- CURLOPT_USERAGENT => sprintf('IIC2.0/pc %s' , self::FETION_CLIENT_VERSION),
- CURLOPT_ENCODING => 'gzip,deflate',
- CURLOPT_HTTPHEADER => array('Content-Type: text/xml; charset=utf-8'),
- CURLOPT_POST => 1,
- CURLOPT_POSTFIELDS => $postData ,
- CURLOPT_RETURNTRANSFER => 1,
- CURLOPT_HEADER => 0
- );
- curl_setopt_array($ch, $chOptions);
- $res = curl_exec($ch);
2、fsocketopen,同样POST数据
平均【大约 0.8~0.9秒】
- $headers=<<<eot
- POST /nav/getsystemconfig.aspx HTTP/1.0
- User-Agent: IIC2.0/pc 3.1.0480
- Accept-Encoding: deflate, gzip
- Host: nav.fetion.com.cn:80
- Content-Length: {$postLength}
-
- {$postData}
- eot;
- fwrite($fp,$headers);
- $received=fread($fp,1024);
- fclose($fp);
3、stream,利用文件流
平均【大约 1.3~1.4秒】
- $opts = array (
- 'http' => array (
- 'method' => 'POST',
- 'header'=> "Content-type: application/x-www-form-urlencoded" .
- "Content-Length: " . $postLength . "",
- 'content' => $postData
- ),
- );
- $context = stream_context_create($opts);
-
- $fp = fopen('http://nav.fetion.com.cn/nav/getsystemconfig.aspx','r',false,$context);
- if($fp){
- $received = fgets($fp, 512); //在这里我用了三种测试,fgets,fread,stream_get_contents
- fclose($fp);
- }
在这里我用了两种方式,一种是file_get_contents还有一种是fopen,file_get_contents的方法被我注释了。。。
在这三种中,我发现真的只有fsocketopen后然后fread是最快的。
真让我沮丧。。因为第三种方法中file_get_contens也可以指定读取的长度。但PHPRPC作者andot却认为,file_get_contents把头已经读回来了。我想,file_get_contents其实已经把数据读回来了,虽然是指定了长度,但其实只是读回来后再截取的。
唉。看来,不得不用fsocketopen了。。不知道除此之外有没有什么好办法。
飞信,对于我们搞开发的人来说,确实还是需要的。网上也有一些php飞信的类(看的也很累),不过,我看的是zendstudio.net,因为看起来好象方便。
自从上次飞信改过IP地址后,我才真正的仔细看过这方面的东西(其实也只是稍看看啦。。。哈哈)
其实,说真的,飞信这东西,PHP版的在我眼里感觉很深奥,因为要抓包,以前还从来没有这样抓过,总觉得是一件很复杂很难的事情。但自从不能给好友发短信后,我到Zendstudio.net上看过别人回复后,才发现他根本就没有提供。所以就萌发了要自己的写的念头。
于是找了smartsniff这个抓包工具,找来libfetion,关掉我所有的上网的程序。然后运行他开始抓包。
发现真的很方便。。。
于是就准备开始写了。不用fsockopen,而准备直接采用curl。。。目前刚刚写了一个getSIPC,发现速度好象是比fsockopen的速度快很多。【可能是因为,zendstudio.net他是按字节读取,然后用正则处理获得sipcproxy,而我是直接取回来用simplexml_loadstring,然后直接输出这个对象的值 ?也或许只是一个感觉而己,其实并没有变化?晚上回去输出执行时间看一下就知道了。HOHO】
慢慢写,因为注意过给好友发短信的功能,是利用SID的,但普通情况下,获取不到SID,必须得先把好友拉回来做一个缓存。这样就可以了。所以本版飞信应该不会公开,否则,谁也不敢使用。【随便说说,还没写完呢。。。。】
说是万能,意思是他支持多种程序语言。而且调用方式也非常简单,当然官方也有例子
Recaptcha,这是一个验证码程序,其实真的很方便,如果你一天到晚还在为着验证码被别人破解而不停的改进自己的验证码时,你可以用它;如果你不会写验证码程序,你可以用它;如果你想支持语音验证,你也可以用它;如果你想有更多的功能,当然你一样可以用它。
使用方法比较简单,大致如下:
- Download the reCAPTCHA Library, unzip it, and copy recaptchalib.php to the directory where your forms live.先到reCAPTCHA下载PHP类库,解压拷到你的线上目录中
- If you haven't done so, sign up for an API key. 准备完后,你可以注册并申请一下API
- Now we're ready to start modifying your code. First, we'll add code to display the CAPTCHA:然后,我们开始修改代码。首先,我们先添加显示CAPTCHA验证码的代码
PHP代码
- require_once('recaptchalib.php');
- $publickey = "..."; ,这里就是你刚才申请的API KEY
- echo recaptcha_get_html($publickey);
4.In the code that processes the form submission, you need to add code to validate the CAPTCHA. Otherwise, the CAPTCHA will appear, but the answers won't be checked. The validation code looks like:在提交处理页,你需要添加CAPTCHA验证代码。否则,CAPTCHA并不会验证他们。验证代码大致如下:
PHP代码
- require_once('recaptchalib.php');
- $privatekey = "..."; //申请的API KEY
- $resp = recaptcha_check_answer ($privatekey,
- $_SERVER["REMOTE_ADDR"],
- $_POST["recaptcha_challenge_field"],
- $_POST["recaptcha_response_field"]);
-
- if (!$resp->is_valid) {
- die ("The reCAPTCHA wasn't entered correctly. Go back and try it again." .
- "(reCAPTCHA said: " . $resp->error . ")");
- }
看起来是不是很简单?现在是不是不再犹豫了??
更多参考和参数可以查看这里:http://recaptcha.net/plugins/php/
本文来自lukin的博客。。。
Lukin,lazyCMS的作者,如果你用过,或许会知道。。。
以下是原文
我是从asp转向php的,asp里面提供了下面的方法
代码1:
ASP/Visual Basic代码
- on error remuse next
-
- on error goto 0
----------------------------------------------------华丽的分割线-------------------------------------------------
转向php之后,查了一些资料貌似php没有提供类似这样的语法
直接使用error_reporting(0);关闭所有错误是很不明智的。所以,考虑使用@来抑制错误的发生,但是往往不如意。
我使用的set_error_handler('myerror')监听了一个函数,直接写@抑制错误的发生那是办不到的,照样会跳到myerror函数里面进行处理,后来看WordPress的源码,发现她屏蔽错误的方法:
代码2:
PHP代码
- $error_reporting = error_reporting(0);
-
- error_reporting($error_reporting);
应用到我系统里面,发现此方法也不好用,照样会进入myerror函数进行错误处理。
继续狂翻php手册,仔细查看set_error_handler这个函数的说明,然后查看评论(一般看手册上的评论还是很有收获的),评论上的一段代码引起了我的注意:
代码3:
PHP代码
-
- if (error_reporting() == 0) {
- return;
- }
细想了一下,把这段代码加入到myerror里面,果然ok了!原来使用@的时候,error_reporting()会返回0
这样可以利用@屏蔽某个函数里面发生的错误了,也可以使用【代码2】的方法来进行分段屏蔽错误了。
--EOF--
我一般是用Set_error_handler的。。还有我记得Error_reporting是可以返回当前设置的等级的。先取回当前的等级,然后设置为0,解决完后再设置回去。其实也是就第二种了。。不过我觉得lukin应该是用这种的,即:
PHP代码
- <?php
- $old = error_reporting();
- error_reporting(0);
-
- error_reporting($old);
使用ThinkSNS进行管理里。发现后台可以对用户组进行权限设定。于是乎,设定了一些菜单的权限。而且设定功能感觉也很强劲,因为可以设定子菜单是否可以访问呢。然而让人郁闷的却是,系统根本没有调用过这些权限。也就是说,你全部白设定了。
靠。太让人郁闷了。没完成你别放出来嘛。。。心都凉了。
顺便再说一个小BUG,UserSearch里如果要加入新的元素,你必须是这个元素为4个值的数组,即下标从0~4,如果ONLY第2个元素,你根本插不进数据库。【不多解释,如果增加内容到UserSearch里的人一定会注意到这个小BUG。。。。】