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

UCHOME开发中遇到的问题

最近在做uchome二次开发的时候遇到一个小问题:强制登录。
什么是强制登录,即,我们在任何 时候,只要点击登录,就显示登录框,同时清除原来所有的登录状态信息。为什么呢,是因为担心在同步登录的时候,如果有某个频道没有同步成功,在点击登录的时候,会显示当前用户已登录,而不会触发登录了。所以必须强制清除登录状态。

于是根据这个需求,简单的在do_login里进行了cleancookie处理。然后而是加了一句:unset($_SGLOBAL['supe_uid']);

结果,几个FORM框里生成的formhash()值都不一样了。导致直接在提交的时候说来路不正常。

检查了很久(不过这次不是我解决的),发现居然是那个unset($_SGLOBAL['supe_uid']);导致的,但是看了formhash这个函数,里面是针对$_SGLOBAL['formhash']变量,没有和supe_uid有关。。。

所以感觉有点妖异。包括把$_SGLOBAL['supe_uid']设为0,设为null都没有关系,只是unset后就出错了。。。

又是一个没有时间解决的问题,先知道解决方法就成了。。。。记录一下。

Tags: uchome, unset, sglobal

HTTP 204和205的应用

上次看的那篇博客里介绍说到一点关于HTTP的code的问题,在jquery里面已经在1.5里被改进了。上次的问题:

XML/HTML代码
  1. 原本对于“请求成功”的浏览器状态码,除200-299以及304外,还有一个1223,来自于IE的一个BUG,会将204的状态码变成 1223。现在因为有了jXHR对象,相当于中间多了一层,因此从jXHR对象获取statusCode不会出现1223的情况,已经被变回204了。  

说实话,我对于204代码真的不知道有具体的作用,因为事实上,我们很少会用到,往往 返回的时候,要么返回1、0之类的,就要么是JSON之类的数据。

然而这篇文章,就说明了一些简单的理由:

内容由此开始:。。。。。。

之前和人讨论过这个问题,,, 今天感冒在家休息, 就回忆了一下, 整理如下.

我们很多的应用在使用Ajax的时候, 大多数情况都是询问型操作, 比如提交数据, 则Ajax只是期待服务器返回:

JavaScript代码
  1. {status: 0, message:""//status 0代表成功, 非零的时候, message中包含出错信息.  

我们知道HTTP的状态码, 2xx都是表示成功, 而HTTP的204(No Content)响应, 就表示执行成功, 但是没有数据, 浏览器不用刷新页面.也不用导向新的页面.

在HTTP RFC 2616中关于204的描述如下:

XML/HTML代码
  1. If the client is a user agent, it SHOULD NOT change its document view from that which caused the request to be sent. This response is primarily intended to allow input for actions to take place without causing a change to the user agent’s active document view, although any new or updated metainformation SHOULD be applied to the document currently in the user agent’s active view.  

类似的还有205 Reset Content, 表示执行成功, 重置页面(Form表单).

XML/HTML代码
  1. The server has fulfilled the request and the user agent SHOULD reset the document view which caused the request to be sent. This response is primarily intended to allow input for actions to take place via user input, followed by a clearing of the form in which the input is given so that the user can easily initiate another input action.  

于是, 当有一些服务, 只是返回成功与否的时候, 可以尝试使用HTTP的状态码来作为返回信息, 而省掉多余的数据传输, 比如REST中的DELETE和如上所述的查询式Ajax请求.

最后说说205, 205的意思是在接受了浏览器POST请求以后处理成功以后, 告诉浏览器, 执行成功了, 请清空用户填写的Form表单, 方便用户再次填写,

总的来说, 204适合多次对一个Item进行更新, 而205则适合多次提交一个系列的Item.

但, 请注意, 目前还没有一个浏览器支持205, 大部分的浏览器, 都会把205当做204或者200同样对待.

------------

 

 

事实上,大多数时候,我们都是只利用200状态,然后返回一些数据来决定到底返回怎么样的数据喽。。。

上面的文章来自于:http://www.laruence.com/2011/01/20/1844.html,主要在于有次讨论204的时候涉及到的事情,然后遇到了就记下来了

 

 

 

 

 

Tags: http, jquery, 204

开发笔记记录

在开发的时候会遇到很多问题,比如就象今天,某个项目中用了swfupload,是集成的uploadify(可能打错了)?其他时候都正常,就突然今天出了点问题,因为昨天改版上线,今天被人发现了大的BUG,那就是商品不能上传图片了。这个问题非常严重,因为影响了用户的正常使用,但是我在测试的时候却没有发现任何 问题,照样正常上传,一下子就感觉特郁闷。
最后,客户截图出来,显示security error,然后问了一下,用的是IE。哦。。。我用的是firefox。于是換成IE测试,果然出现这种情况。
找了很多原因,都没有发现问题在哪里,JS啥的都没有出错,原来是正常的,现在是只有FIREFOX正常,这究竟是什么 原因 呢?
排查了很久,而且到最后就差要单独拎出来重写了,意外之中突然发现,URL里有两个斜杠,比如当前的页面可能就是类似 这样:http://www.neatstudio.com//upload/image/?act=upload,在host后面有两个斜杠。难道是这个原因 ?于是把那个斜杠去掉,再测试,结果真的成功了。现在想想,好象很多人都会忽略这个问题,但我就真的发现了,分析了一下源码,发现还真有这可能,因为它源码里是的路径是类似:../js/upload/swfobject.js。在URL里有//的时候,它解析的时候,可能会有偏差(没有仔细看,昨天一夜没睡,发现问题后立马解决了它了),对于路径就进行了处理,比如rtrim()之类的,搞定,开心的回家了。。

然后说一点yii中遇到的问题,比如获取当前controller的ID,就是Yii::app()->controller->id,如果获取当前的action的ID,那就是Yii::app()->controller->action->id。也有人说是$this->actionId,我是没有成功过。。
当然,要记得,在init()方法时在,这些都是获取不到的,毕竟,人家还没有初始化,怎么可能有呢,于是我用的是Yii::app()->getRequest()->getPathInfo(),然后explode一下"/",弹出的最后一个就是action,前面的是controller,看了一下源码,官方获取,好象也是这样获取的。黑黑。。。。

好了,做完记录,睡觉了。。

Tags: swfupload, yii, controller, action

关于SOAP的几篇文章

PHP操作soap我总觉得是一件非常痛苦的事情,但没有办法,现在很多功能都是基于WebService的,比如那个amazon的,但其实很多公司都也还是提供了restful之类的接口,使得PHP与其他系统的数据交换比较方便。但让人痛苦的,有时候,你PHP不得不充当soapServer,这时候,怎么做呢?zendstudio可以根据你的函数和类,帮你生成wsdl,但大多数情况下,你没有直接生成的手段,怎么办?官方的soapServer功能也太少了一点。你是否还准备用nuSoap来充当server呢?

搜集了一些资料,用来方便的协助你生成soap接口。如果只是自己的内部调用,可以尝试用phprpc或者它的升级版hprose进行尝试。

1、利用NuSOAP发布wsdl。这是PHP5之前的做法了,因为在PHP5之后,直接有soap库支持,如何发布wsdl,请看:http://hi.baidu.com/arlon/blog/item/d8267d1e6ca4adf01ad576cc.html,然而这个网址打开是白屏的,内容可以稍看这里:

PHP代码
  1. 2.4.1 创建支持 WSDL 的 WEB 服务  
  2. 为了实现 WEB 服务程序对 WSDL 的支持,需要使用 soap_server 的 configureWSDL 方法,并且在调用 soap_server 的 register 方法注册 WEB 服务程序时,需要提供更详细的参数。看下面的代码,代码的文件名是 “/nusoap/nusoap_server3.php”。  
  3.   
  4. <?php  
  5. require_once("lib/nusoap.php");  
  6.   
  7. function concatenate($str1,$str2) {  
  8.       if (is_string($str1) && is_string($str2))  
  9.           return $str1 . $str2;  
  10.       else  
  11.           return new soap_fault(' 客户端 ','','concatenate 函数的参数应该是两个字符串 ');  
  12. }  
  13.   
  14. $soap = new soap_server;  
  15. $soap->configureWSDL('concatenate'); // 初始化对 WSDL 的支持  
  16.   
  17. // 注册服务  
  18. $soap->register('concatenate',  
  19. array("str1"=>"xsd:string","str2"=>"xsd:string"), // 输入参数的定义  
  20. array("return"=>"xsd:string"// 返回参数的定义  
  21. );  
  22.   
  23. $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';  
  24. $soap->service($HTTP_RAW_POST_DATA);  
  25. ?>  
  26. 现在打开浏览器,访问刚才建立的文件,http://127.0.0.1/nusoap/nusoap_server3.php,结果如下:   
  27.   
  28. concatenate  
  29. View the WSDL for the service. Click on an operation name to view it's details.  
  30.   
  31. concatenate   
  32. 点击函数名称concatenate,可以看到对函数的描述。点击"WSDL",或者访问WEB服务文件,并在后面加上查询字符串"?wsdl"(http://127.0.0.1/nusoap/nusoap_server3.php?wsdl),可以得到WEB服务的WSDL内容。  
  33.   
  34. 2.4.2 通过 WSDL 调用 WEB 服务  
  35. 通过 WSDL 调用 WEB 服务,与不通过 WSDL 调用 WEB 服务,程序的结构大体相同。区别在于,通过 WSDL 调用 WEB 服务,初始化 soapclient 类时,传入两个参数到 soapclient 的构造函数,第一个参数是 WSDL 文件的地址,第二个参数指定是否使用 WSDL ,指定为 true 即可。看下面的代码,代码的文件名是 “ /nusoap/nusoap_client3.php ”  
  36.   
  37. <?php  
  38. require_once("lib/nusoap.php");  
  39.   
  40. $client = new soapclient('http://127.0.0.1/nusoap/nusoap_server3.php?wsdl',true);  
  41. $parameters=array(' 字符串 1',' 字符串 2');  
  42.   
  43. $str=$client->call('concatenate',$parameters);  
  44. if (!$err=$client->getError()) {  
  45.       echo " 程序返回 :",$str;  
  46. else {  
  47.       echo " 错误 :",$err;  
  48. }  
  49. ?>  
  50. 2.4.3 代理的使用  
  51. NuSOAP 提供代理的方法调用远程 WEB 服务。这种方法,在客户端程序里面创建一个远程服务的代理对象,通过代理直接调用远程的 WEB 服务,而不需要通过 soalclient 类的 call 方法。看下面的代码。  
  52.   
  53. <?php  
  54. require_once("lib/nusoap.php");  
  55.   
  56. $client = new soapclient('http://127.0.0.1/nusoap/nusoap_server3.php?wsdl',true);  
  57. $proxy=$client -> getProxy(); // 创建代理对象 (soap_proxy 类 )  
  58.   
  59. $str=$proxy->concatenate(" 参数 1"," 参数 2"); // 直接调用 WEB 服务  
  60. if (!$err=$proxy->getError()) {   
  61.       echo " 程序返回 :",$str;  
  62. else {  
  63.       echo " 错误 :",$err;  
  64. }  
  65. ?>  

 

2、利用PHP5自带的soapServer,在手册上,关于如何创建,写了很多例子,就象:

PHP代码
  1. <?php  
  2. $server = new SoapServer("some.wsdl");  
  3. $server = new SoapServer("some.wsdl"array('soap_version' => SOAP_1_2));  
  4. $server = new SoapServer("some.wsdl"array('actor' => "http://example.org/ts-tests/C"));  
  5. $server = new SoapServer("some.wsdl"array('encoding'=>'ISO-8859-1'));  
  6. $server = new SoapServer(null, array('uri' => "http://test-uri/"));  
  7.   
  8. class MyBook {  
  9.     public $title;  
  10.     public $author;  
  11. }  
  12.   
  13. $server = new SoapServer("books.wsdl"array('classmap' => array('book' => "MyBook")));  
  14. ?>   

 

反正,我是觉得很痛苦,不过所幸现在的IDE都支持了直接发布wsdl文件,netbeans可以,zendstudio也可以。所以,也就方便了开发

3、利用开源组件,比如:webservice helper,http://www.jool.nl/new/1,webservice_helper.html,虽然它也是其于soapServer,但是集成的一些代码可以让你少走很多弯路。

比如,它默认就自带了一个contactManager的发布,具体的一些配置,可以看config.php,当然你也可以参考它的一些类,也充实你自己的类库(本来官网有教程的,可能是因为时间太久远了,该教程已经跳到ipublisher的教程上去了)

4、利用框架实现webService。在这里,估计又有很多分支了,比如zend framework,比如xxx和xxxx等,我由于最近在用yii,所以就看了yii的一个小小的实现

介绍页在这里:http://www.yiiframework.com/doc/guide/1.0/zh_cn/topics.webservice

看它的实现是非常简单,在Controller里增加一个转换wsdl的Action,然后,在要提供的方法上面用phpdoc来进行注释。定义传入参数的数据类型等

  • str/string: 对应 xsd:string;
  • int/integer: 对应 xsd:int;
  • float/double: 对应 xsd:float;
  • bool/boolean: 对应 xsd:boolean;
  • date: 对应 xsd:date;
  • time: 对应 xsd:time;
  • datetime: 对应 xsd:dateTime;
  • array: 对应 xsd:string;
  • object: 对应 xsd:struct;
  • mixed: 对应 xsd:anyType.

不过我也确实没有过多的细看,没仔细看它对于AUTH验证支持怎么样(第三点里介绍的工具是有验证的,而且就设在config.php里,非常方便)

好了,我就针对现在的soap server的建立,介绍了四种方法,事实上,我到现在为止是一种都没有用过,nusoap也就用过客户端,那也是几年前的事情了,soapClient也是,在构建soapHeader的时候也走过很多弯路。第三步介绍的工具,我也只是下载了看看源码,第四步我是看了看手册。只是先集中一下,以后总会用到而已。
虽然说,PHPRPC和hprose 在andot他们介绍来说,开发速度和处理上,都有较为明显的提高,但如果想做一个公用的web service,那还是用大家都能接受的方法吧。
如果是自己的项目,那可能就会用phprpc或者hprose来了。hprose测试版用过,感觉还是不错的。phprpc,我也做了一个sae平台的移植版,目前也能够正常的使用。。在这里也有个简单的测试:http://nsblog.sinaapp.com/。有兴趣的朋友也可以去看看的。

Tags: soap, webservice, phprpc, hprose, restful

关于oauth的几篇文章

本文只是一个收集的链接,关于oauth,可以去看一下wiki百科,对于PHP的oauth支持,可以看一下手册
国内很早就有不少网站支持oauth,只是更多的网站都没有做出此类开放的功能。不过,疯狂的时候来的总是那么突然(这让我想起在单位的年夜饭上,刚吃了一小时,突然副总说了一句,快乐的时光总是短暂的)。国内对Oauth的支持也就突然间的多了起来,可能,最让人记的清楚的还是新浪。但当时关于oauth的文章还不是特别多,只是在QQ开放oauth后,突然间文章就多了很多,理由是,QQ所支持的oauth协议居然是非标的。。。。

好吧,让我们看看其他人是怎么说的:

1、使用QOAuth来进行新浪/腾讯微博验证(一)

2、老王的:基于PECL OAuth打造微博应用

3、android下的:android开发我的新浪微博客户端-OAuth篇(2.1)

4、腾讯微博开放平台的PECL的OAuth封装

5、腾讯微博开放平台练手:微博擂台

6、使用 PECL 的 OAuth 库访问 QQ 微博 API

其中4、5、6都是mikespook写的,他说,QQ 微博的API里有点重要的事情,并列出来了。看例子:

PHP代码
  1. <?php  
  2. include('define.php');  
  3. try {  
  4.     $oauth = new OAuth(OAUTH_KEY, OAUTH_SECRET, OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI);  
  5.     $oauth->enableDebug();  
  6.     // 很重要!!!在 OAuth 标准里是没有规定 nonce 的长度的,但是 QQ 对 nonce 的长度做了要求——32 字节长。如果不设置一下,会返回 400 错误。我为此纠结了一天。  
  7.     $oauth->setNonce(md5(rand()));  
  8.     // CALLBACK 一定要设置,OAuth 扩展的文档上是没设置的,但是 QQ 这里不设会报错  
  9.     $requestTokenInfo = $oauth->getRequestToken(REQUEST_TOKEN, CALLBACK);  
  10.     $_SESSION['oauth_token_secret'] = $requestTokenInfo['oauth_token_secret'];  
  11.     // header("Location: ……") 亦可  
  12.     echo "<p><a href='" . AUTHORIZE . "?oauth_token=" . $requestTokenInfo['oauth_token'] . "'>authorize</a></p>";  
  13. } catch (OAuthException $e) {  
  14.     var_dump($e);  
  15. }  
  16.   
  17. callback.php  
  18.   
  19. <?php  
  20. include('define.php');  
  21. try {  
  22.     $oauth = new OAuth(OAUTH_KEY, OAUTH_SECRET, OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI);  
  23.     $oauth->enableDebug();  
  24.     // 很重要!!!如果不设置一下,会返回 401 错误。  
  25.     $oauth->setNonce(md5(rand()));  
  26.     $oauth->setToken($_GET['oauth_token'], $_SESSION['oauth_token_secret']);  
  27.     $accessTokenInfo = $oauth->getAccessToken(ACCESS_TOKEN, null, $_GET['oauth_verifier']);  
  28.     $_SESSION['access_token'] = $accessTokenInfo['oauth_token'];  
  29.     $_SESSION['access_secret'] = $accessTokenInfo['oauth_token_secret'];  
  30.     header('Location: room.php');  
  31. } catch (OAuthException $e) {  
  32.     var_dump($e);  
  33. }  
7、这是针对新浪微博的OAuth协议分析一

 

8、对新浪微博的OAUTH开发,居然还有一个总结:新浪微博OAuth认证总结

9、又是老王发的牢骚:OAuth那些事儿

好吧,就先列出这么多,真要查出oauth之类的东西,google随便一下就有很多,我贴出来的地址,都是我订阅的一些RSS的地址,也算是做一个集中罢了。

 

Tags: php, qq, sina, oauth, pecl