Submitted by gouki on 2011, January 21, 10:17 PM
在开发的时候会遇到很多问题,比如就象今天,某个项目中用了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
PHP | 评论:0
| 阅读:20907
Submitted by gouki on 2011, January 21, 2:36 AM
加班,中途休息一下,接着发克代码中。。。
一天就这样开始,一天又会 这样结束
Misc | 评论:0
| 阅读:14860
Submitted by gouki on 2011, January 19, 11:45 PM
啥也不说,就上一张图。。。。
心都碎了
Tags: 长宽
Misc | 评论:1
| 阅读:16151
Submitted by gouki on 2011, January 20, 12:41 PM
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代码
- 2.4.1 创建支持 WSDL 的 WEB 服务
- 为了实现 WEB 服务程序对 WSDL 的支持,需要使用 soap_server 的 configureWSDL 方法,并且在调用 soap_server 的 register 方法注册 WEB 服务程序时,需要提供更详细的参数。看下面的代码,代码的文件名是 “/nusoap/nusoap_server3.php”。
-
- <?php
- require_once("lib/nusoap.php");
-
- function concatenate($str1,$str2) {
- if (is_string($str1) && is_string($str2))
- return $str1 . $str2;
- else
- return new soap_fault(' 客户端 ','','concatenate 函数的参数应该是两个字符串 ');
- }
-
- $soap = new soap_server;
- $soap->configureWSDL('concatenate');
-
-
- $soap->register('concatenate',
- array("str1"=>"xsd:string","str2"=>"xsd:string"),
- array("return"=>"xsd:string")
- );
-
- $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
- $soap->service($HTTP_RAW_POST_DATA);
- ?>
- 现在打开浏览器,访问刚才建立的文件,http:
-
- concatenate
- View the WSDL for the service. Click on an operation name to view it's details.
-
- concatenate
- 点击函数名称concatenate,可以看到对函数的描述。点击"WSDL",或者访问WEB服务文件,并在后面加上查询字符串"?wsdl"(http:
-
- 2.4.2 通过 WSDL 调用 WEB 服务
- 通过 WSDL 调用 WEB 服务,与不通过 WSDL 调用 WEB 服务,程序的结构大体相同。区别在于,通过 WSDL 调用 WEB 服务,初始化 soapclient 类时,传入两个参数到 soapclient 的构造函数,第一个参数是 WSDL 文件的地址,第二个参数指定是否使用 WSDL ,指定为 true 即可。看下面的代码,代码的文件名是 “ /nusoap/nusoap_client3.php ”
-
- <?php
- require_once("lib/nusoap.php");
-
- $client = new soapclient('http://127.0.0.1/nusoap/nusoap_server3.php?wsdl',true);
- $parameters=array(' 字符串 1',' 字符串 2');
-
- $str=$client->call('concatenate',$parameters);
- if (!$err=$client->getError()) {
- echo " 程序返回 :",$str;
- } else {
- echo " 错误 :",$err;
- }
- ?>
- 2.4.3 代理的使用
- NuSOAP 提供代理的方法调用远程 WEB 服务。这种方法,在客户端程序里面创建一个远程服务的代理对象,通过代理直接调用远程的 WEB 服务,而不需要通过 soalclient 类的 call 方法。看下面的代码。
-
- <?php
- require_once("lib/nusoap.php");
-
- $client = new soapclient('http://127.0.0.1/nusoap/nusoap_server3.php?wsdl',true);
- $proxy=$client -> getProxy();
-
- $str=$proxy->concatenate(" 参数 1"," 参数 2");
- if (!$err=$proxy->getError()) {
- echo " 程序返回 :",$str;
- } else {
- echo " 错误 :",$err;
- }
- ?>
2、利用PHP5自带的soapServer,在手册上,关于如何创建,写了很多例子,就象:
PHP代码
- <?php
- $server = new SoapServer("some.wsdl");
- $server = new SoapServer("some.wsdl", array('soap_version' => SOAP_1_2));
- $server = new SoapServer("some.wsdl", array('actor' => "http://example.org/ts-tests/C"));
- $server = new SoapServer("some.wsdl", array('encoding'=>'ISO-8859-1'));
- $server = new SoapServer(null, array('uri' => "http://test-uri/"));
-
- class MyBook {
- public $title;
- public $author;
- }
-
- $server = new SoapServer("books.wsdl", array('classmap' => array('book' => "MyBook")));
- ?>
反正,我是觉得很痛苦,不过所幸现在的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
PHP | 评论:1
| 阅读:25797
Submitted by gouki on 2011, January 19, 10:09 AM
本文只是一个收集的链接,关于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代码
- <?php
- include('define.php');
- try {
- $oauth = new OAuth(OAUTH_KEY, OAUTH_SECRET, OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI);
- $oauth->enableDebug();
-
- $oauth->setNonce(md5(rand()));
-
- $requestTokenInfo = $oauth->getRequestToken(REQUEST_TOKEN, CALLBACK);
- $_SESSION['oauth_token_secret'] = $requestTokenInfo['oauth_token_secret'];
-
- echo "<p><a href='" . AUTHORIZE . "?oauth_token=" . $requestTokenInfo['oauth_token'] . "'>authorize</a></p>";
- } catch (OAuthException $e) {
- var_dump($e);
- }
-
- callback.php
-
- <?php
- include('define.php');
- try {
- $oauth = new OAuth(OAUTH_KEY, OAUTH_SECRET, OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI);
- $oauth->enableDebug();
-
- $oauth->setNonce(md5(rand()));
- $oauth->setToken($_GET['oauth_token'], $_SESSION['oauth_token_secret']);
- $accessTokenInfo = $oauth->getAccessToken(ACCESS_TOKEN, null, $_GET['oauth_verifier']);
- $_SESSION['access_token'] = $accessTokenInfo['oauth_token'];
- $_SESSION['access_secret'] = $accessTokenInfo['oauth_token_secret'];
- header('Location: room.php');
- } catch (OAuthException $e) {
- var_dump($e);
- }
7、这是针对新浪微博的
OAuth协议分析一
8、对新浪微博的OAUTH开发,居然还有一个总结:新浪微博OAuth认证总结
9、又是老王发的牢骚:OAuth那些事儿
好吧,就先列出这么多,真要查出oauth之类的东西,google随便一下就有很多,我贴出来的地址,都是我订阅的一些RSS的地址,也算是做一个集中罢了。
Tags: php, qq, sina, oauth, pecl
PHP | 评论:0
| 阅读:20627