服务端接收不到Post请求的参数

今天用Fiddler模拟Post请求测试接口,发现服务端接收到的Post参数为空。
通过Fiddler记录了下真实Post请求的Header头,发现问题的原因在于Content-Type这个参数。

POST请求的Content-Type支持application/x-www-form-urlencoded 或 multipart/form-data 两种。

json_encode处理二进制的问题

$a = gzcompress('test'); 
 
echo 'before json : '; 
print_r($a); 
echo "\n"; 
echo 'after json : '; 
print_r(json_encode($a));

输出的结果为:

before json : x+I-.]
after json : null

json_encode后的结果为null,PHP手册上给了说明。

待编码的 value ,除了resource类型之外,可以为任何数据类型
该函数只能接受 UTF-8 编码的数据

如何解决呢?

$a = gzcompress('test'); 
 
echo 'before json : '; 
print_r($a); 
echo "\n"; 
echo 'after json : '; 
print_r(json_encode(base64_encode($a)));

输出结果为:

before json : x+I-.]
after json && base64 : "eJwrSS0uAQAEXQHB"

PHP关于64位整型的二进制实现

项目中用到一个C的二进制接口,需要通过php拼包请求接口同时解析返回的二进制包。
比较特殊的一点是,接口里有用到64位整型,但是php的pack/unpack原生并不支持64位整型,为了解决这个着实费了一番功夫。

实现原理

将一个64位整型转换成高位和低位的两个32位整型,通过两个32位整型的结构来表示一个64位整型。

实现代码

<?php
define("BIGINT_DIVIDER", 0x7fffffff + 1);

function split2Int(&$upper, &$lower, $value) {
    $lower = intval($value % BIGINT_DIVIDER);
    $upper = intval(($value - $lower) / BIGINT_DIVIDER);
}

function bigInt2float($upper, $lower) {
    return $upper * BIGINT_DIVIDER + $lower;
}

$num = 5000000000;
split2Int($upper, $lower, $num);

$buffer = pack('NN', $upper, $lower); // 大端序
$result = unpack('Nupper/Nlower', $buffer);

echo bigInt2float($upper, $lower); // 5000000000

参考资料:
PHP: pack/unpack补遗
PHP pack() format for signed 32 int - big endian
A 64 bit integer for PHP

PHP打包二进制的问题也搞定了~

从5.1开始搞,中间陆陆续续一直有其他事情插进来,上周五才终于有时间专心验证这个问题。

经过周五的重新开发打包,在今天终于调通接口了。

哈哈~~~

好吧,又啃掉了一个“硬骨头”

这周身上堆了两件棘手的事情。

维护的项目底层存储异常,整个服务受到影响。

领导放话这周必须解决,压力好大的说...(第一次被领导训话的说...)

暂时将服务恢复到正常可用状态了,准备回家陪媳妇吃饭,这周老是让她等我了。