Press "Enter" to skip to content

使用SoapHeader实现Soap请求验证

在PHP的Soap Extension中, 对于SoapServer来说, 并没有方法可用得到/处理客户端发送的SoapHeader信息.
网上也有很多人认为, 只能通过读取POST过来的请求XML文件, 分析, 才能得到客户端发送过来的SoapHeader.
但, 其实在SoapServer端, 其实是有一种办法, 可用把SoapHeader当作一个请求来处理, 从而获取到客户端提交的SoapHeader信息.

Filed in PHP应用
with 16 Comments

注意PHP5.2.11之后的json_decode

在PHP5.2.6以前, json_decode一个字符串, 将会返回字符串本身.

php -r "var_dump(json_decode('laruence'));"
//输出
string(8)"laruence";

但是, 不知道是不是因为之前在php bug中, 有人提议对于这种情况, 因为字符串不是合法的json格式的串, 所以应该出错, 返回NULL(http://bugs.php.net/bug.php?id=45989). 所以在PHP5.2.11之后(具体是从哪个版本开始, 我回头再验证), 竟然返回NULL了.

php -r "var_dump(json_decode('laruence'));"
//输出
NULL

Filed in PHP应用
with 14 Comments

Nginx/PHP Fastcgi PATH_INFO的一个问题

通过在nginx.conf中模拟PATH_INFO的方法会有一个bug. 那就是PATH_INFO不会被urldecode.
对于Apache+PHP(php2handler)来说, PATH_INFO来自Apache, 不会有问题, 对于Apache fastcgi也应该没有问题, 因为PATH_INFO也是由Apache生成.
但是对于nginx+fastcgi, 因为对于cgi来说PATH_INFO来自于ENV(fastcgi_params), 而php-cgi中的import_environment_variables不会对ENV中的变量做urldecode.
这样, nginx看到的url是urlencode以后的, 从url中分离出来的PATH_INFO也是urlencode后的, forward给php proxy以后, PHP看到的PATH_INFO也是urlencode的了.
所以, 如果在PATH_INFO中包含一些宽字符, 或者是"+", 那就要注意了, 需要我们主动的urldecode一下再使用.

Filed in PHP应用
with 14 Comments

一个想当然造成的错误(赋值语句的返回值)

一个想当然造成的错误.
需求是这样的, 我需要给一个二进制流加入一个签名串. 那么首先, 理所当然我的写了一个签名函数, 考虑到要判断签名操作是否成功, 所以我采用了传引用:

function sign(&$carrier, $fingerprint) {
	if (NULL === $fingerprint) {
		return FALSE;
	}
	//加入签名
	$carrier = 签名逻辑.
	return TRUE;
}

接下来, 考虑到, 如果签名失败, 那还是使用原来的字符串做为结果, 所以, 我想当然的写下了如下的代码....

Filed in PHP应用, PHP源码分析
with 14 Comments

分割GBK中文遭遇乱码的解决

今天有朋友提到一个问题, 类似如下的字符串(GBK), explode不能得到正确结果:

$result = explode("|", "滕华弢|海青"); //(插一句, 蜗居最近很火啊)

究其原因, 对于"弢"字(读tao,不认识没关系,我也不认识), 因为他的GBK编码值为: 8f7c, 不巧的是, "|"的ASCII值也是7c.
这样的问题, 还有很多...

Filed in PHP应用, 随笔
with 10 Comments

Nginx(PHP/fastcgi)的PATH_INFO问题

PATH_INFO是一个CGI 1.1的标准,经常用来做为传参载体.
在Apache中, 当不加配置的时候, 对于PHP脚本, AcceptPathInfo是默认接受的, 也就是说:
如果在服务器在存在一个/laruence/info.php
那么, 对于如下请求, Apache都接受:

/laruence/info.php/dummy
/laruence/info.php/pathinfo

而对于Nginx下, 默认Nginx是不支持PATH INFO的, 也就是说, 对于上面的访问, 会是404, 提示找不到文件出错.

Filed in Linux/Unix, PHP应用
with 56 Comments

提升PHP性能之改变Zend引擎分发方式

从PHP5.1开始,PHP提供了用户对Zend VM执行分发方式的选择接口.
之前的文章中, 我也提过这方面的内容, Zend虚拟机在执行的时候, 对于编译生成的op_array中的每一条opline的opcode都会分发到相应的处理器(zend_vm_def.h定义)执行, 而按照分发的方式不同, 分发过程可以分为CALL, SWITCH, 和GOTO三种类型.
默认是CALL方式, 也就是所有的opcode处理器都定义为函数, 然后虚拟机调用. 这种方式是传统的方式, 也一般被认为是最稳定的方式.
SWITCH方式和GOTO方式则和其命名的意义相同, 分别通过switch和goto来分发.官方给出的描述说GOTO方式最快.
那么如果使用GOTO方式, 效率上到底能提高多少呢? 今天我就分别使用各种方式来测试一番:

Filed in PHP应用, PHP源码分析
with 13 Comments