Tag Archives: php

nginx 下QUERY_STRING 的一个bug

配置选项:
location / {
root “D:/xampp/htdocs/teeume.com”;
try_files $uri /t.php;
}

实现重写后,我们用 /search/?q=test 请求,会发现$_GET[‘q’] 无值,$_SERVER[‘QUERY_STRING’]无值。

这就影响了正常的取值方式。
我们做如下修正:
$uri = $_SERVER[‘REQUEST_URI’];
$uri = strtok($uri, ‘?’);
$qs = $_SERVER[‘QUERY_STRING’] = strtok(‘?’);
parse_str($qs, $qs_arr);
$_REQUEST = array_merge($_REQUEST, $qs_arr);

即时到账–银行网关提前功能

在商家的收银台页面选择银行,提交到支付宝页面后就默认为买家选择的银行。
目的:操作更顺,流程更简单! 例如:该图是商家自己网站设计的页面。

Alipay form Example

测试页面:http://alipaysales.cn:8082/cpys/jsdz/

如何集成 ?

即时到账技术文档中有这两个参数:
paymethod :(bankPay(网银);cartoon(卡通); directPay(余额))
defaultbank:默认网银 String (见常见银行表)
银行列表:

银行简码 银行名称
ICBCB2C 中国工商银行
CMB 招商银行
CCB 中国建设银行
ABC 中国农业银行
SPDBB2B 上海浦东发展银行(B2B)
CIB 兴业银行
GDB 广东发展银行
SDB 深圳发展银行
CMBC 中国民生银行
COMM 交通银行
POSTGC 邮政储蓄银行
CITIC 中信银行
BOCB2C 中国银行

只需要 在接口中新增加 paymethod,defaultbank 这两个参数,这两个参数也需要经过签名,否则会报错。

比如:买家选择 工行,那这两个参数的值就应该为 paymethod=bankPay; defaultbank=ICBCB2C;

以php即时到账代码为例就是:

require_once(“alipay_service.php”);
require_once(“alipay_config.php”);
$parameter = array(
“service” => “create_direct_pay_by_user”, //交易类型
“partner” => $partner, //合作商户号
“return_url” => $return_url, //同步返回
“notify_url” => $notify_url, //异步返回
“_input_charset” => $_input_charset, //字符集,默认为GBK
“subject” => “商品名称”, //商品名称,必填
“body” => “商品描述”, //商品描述,必填
“out_trade_no” => date(Ymdhms), //商品外部交易号,必填(保证唯一性)
“total_fee” => “0.01”, //商品总价,必填(价格不能为0)
“payment_type” => “1”, //默认为1,不需要修改

“paymethod” => “bankPay”, //bankPay(网银);cartoon(卡通); directPay(余额)
“defaultbank” => “ICBCB2C”, //见银行简码表
“show_url” => $show_url, //商品相关网站
“seller_email” => $seller_email //卖家邮箱,必填
);
$alipay = new alipay_service($parameter,$security_code,$sign_type);
$link=$alipay->create_url();

apache mod_negotiation与MultiViews的奥妙

今天遇到一个奇怪的问题,取URL请求字符串时,明明访问的是/index/welcome/,取回来的却是/welcome/。
框架在处理这个问题时的处理流程是:

$php_self = $_SERVER[‘PHP_SELF’];
$uri = $_SERVER[‘REQUEST_URI’];

if (isset($_SERVER[‘PATH_INFO’])) {
$uri = $_SERVER[‘PATH_INFO’];
} else {
$uri = substr($uri, strlen(dirname($php_self)) );
}
$uri[0]!=’?’ || $uri = “/$uri”;
$uri = strtok($uri, ‘?’);

先判断PATH_INFO,然后再处理其他情况。
但我这里直接是http://xxx.com/index/welcome/ 怎么会存在PATH_INFO变量呢?
后来打印$_SERVER变量时发现,apache认为我访问的这个链接是/index.php/welcome/ !
原来apache可以在访问/path/foo时,如果找不到/path/foo,就会去找/path/foo.*,并且选一个合适的返回来,为你服务。
我这里存在着/index.php,所以访问/index/welcome/时,它就自动去找/index.php了!
而这些功能是一个模块提供的,它的名字叫mod_negotiation。相关说明:http://httpd.apache.org/docs/2.2/content-negotiation.html
同时,这个模块还提供了一个目录级别的控制开关,也就是

UCenter Home2.0的无法同步登录的修正

今天在弄UCenter Home和其他自定义应用同步登录,发现一个UCH 2.0中的一个问题。

打开source/do_login.php,你会发现这样的一个代码片段:

    if($_SCONFIG[‘uc_status’]) {

        include_once S_ROOT.’./uc_client/client.php’;

        $ucsynlogin = uc_user_synlogin($setarr[‘uid’]);

    } else {

        $ucsynlogin = ”;

    }

这个$_SCONFIG[‘uc_status’]并没有出现中出现在任何配置文件中,所以它始终是未被定义的。也就一直无法同步登录其他应用了。

在前边加上一句

    $_SCONFIG[‘uc_status’] = 1;

可以临时解决这个问题。

另外,自己写应用时,例子是最好的老师。ucenter的包中,有examples目录,就包括了两灰常经典的例子,绝对值得参考。

–EOF–

Windows下源码编译PHP

开始前准备

开始之前,你需要准备如下东西:

  1. Microsoft Visual C++, 建议Visual C++ 2008, 速成版或专业版都可以。
  2. Windows SDK,下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyId=F26B1AA4-741A-433A-9BE5-FA919850BDBF&displaylang=en 不建议用那个网络安装,慢死,还不知道什么时候能完。还有就是建议全部安装。
  3. 其他工具,下载地址:http://pecl2.php.net/downloads/php-windows-builds/php-libs/binary-tools.zip

编译步骤

  1. 下载并安装VC++ 2008,并安装。
  2. 安装windows sdk 6.1
  3. 下载php5.3,下载地址:http://cn.php.net/get/php-5.3.0.tar.bz2/from/this/mirror
  4. 创建文件夹,比如C:\php-sdk
  5. 把上面第三步下载的包解压到这里,解压完时C:\php-sdk里应该有两个子目录bin, script
  6. 在开始菜单处打开Microsoft Windows SDK v6.1/CMD Shell,输入命令:
    setenv /x86 /xp /release
    cd c:\php-sdk
    bin\phpsdk_setvars.bat
    bin\phpsdk_buildtree.bat php53dev
  7. 上一步会创建一些目录。进入vc9\x86,把php5.3.0解压在这里,解压后目录结构:vc9\x86\php5.3.0
  8. 在WIN-SDK的命令行下输入:
    cd C:\php-sdk\php53dev\vc9\x86\php5.3.0
    buildconf
  9. 到了这一步,就和linux下差不多了,你可以看一下编译的选项帮助:
    configure –help
  10. 好,我们来一个最小化的编译:
    configure –disable-all –enable-cli
    nmake
  11. 这一步在php wiki上是没有问题,但由于我们是中文环境,会报下面的错误:
  12. 用Editplus打开ext\standard\browscap.c这个文件,

    选是,并选择Western European (Windows)
    然后另存为UTF-8编码。
  13. 重新nmake编译,然后用nmake snap编译成最终二进制包。二进制包在php-5.3.0\Release_TS下。可能的名字是php-5.3.0-Win32-VC9-x86.zip
  14. 测试一下:

下一篇文章再写怎么编译pecl扩展。

小心对待rewrite中邪恶的百分号(%)

今天遇到一个非常诡异的问题。

我目前是采用 /key1/value1/key2/value2 方式传递参数,非常干净明了。但是今天我试图传递一个urlencode过的字符串时发现,只要URI里带有百分号%,就会导致Apache服务器400错误,警告说“错误的请求”。

/key1/value1/key2/value_with_%_symbol    400 error

/key1/value1/key2/value_without_symbol    200 OK

查阅手册后,发现%是rewrite语法中的特殊字符,会认为是一个变量的开始,就像PHP中的美元符号$。

经测试,很多知名站点也没有解决这个问题,如WP,discuz,osnews等等。

目前找到一个解决方案,但情况有点不太一样,所以也没有测试成功。链接地址:http://stackoverflow.com/questions/734654/modrewrite-doesnt-work-for-a-url-beginning-in-percent-sign

临时解决方案:/key1/value2/?key2=evil_value2 即换回传统的方式来解决问题。

特留此文,以后找到方案时更新。

用PHP通过邮箱获取QQ好友列表

今天研究了一下QQ邮箱的登录过程,企图从这个位置突破,获取好友列表。

结果网上有一个Python的版本,还发现在php.cn上有人用PHP模拟了一个,不管3721,拿回来,测试,乖乖!不禁感慨牛人的强悍。

验证码已经自动提取。

输出密码,验证码,成功登录并提取好友列表!酷!

演示页面:http://blog.eaxi.com/wp-content/demo/qq/

QQ密码已经在客户端用JS加密,本程序无法获取用户密码。所以请大家放心使用!

另,程序请大家自己放狗去找,此处不提供下载了,怕太多人用腾讯改协议大家都不能用!呵呵。如果确实有需要,但放狗找不到的,再私下找我要吧。

Updated:

2009-7-29 因为太多人找我要程序,想想还是共享给大家的好,下载地址:qq


php中的memcached扩展使用

本文提供php_memcache.dll 扩展下载,本版本适用于绝大多数PHP 5版本,已经测试5.2.6, 5.2.9-2,欢迎您把测试结果分享出来。

另外,提一下用memcache做session.save_handler的方法。

            ini_set(‘session.save_handler’, ‘memcache’);
            ini_set(‘session.save_path’, ‘tcp://192.168.0.240:11211’);

以下用正常的方式使用session,呵呵,简单吧!如果有更多的服务器,用逗号分隔即可。

            ini_set(‘session.save_path’, ‘tcp://192.168.0.240:11211,tcp://192.168.0.241:11211’);

还可以带上参数,这些参数和Memcache::addServer()保持一致:

            ini_set(‘session.save_path’, ‘tcp://192.168.0.240:11211?persistent=1&weight=1&timeout=1&retry_interval=15’);

更新:

还可以把tcp换成udp,以得到更好的效率,更低的资源消耗:

            ini_set(‘session.save_path’, ‘udp://192.168.0.240:11211,tcp://192.168.0.241:11211’);