4832

php的pack函数应用

乐果   发表于   2015 年 01 月 22 日 标签:PHP

如题,最近在用PHP写socket的客户端,用到了pack函数。因此记录下:

    /**
     * 测试链路是否能正常通信
     * @author      liuxiang <unphp@qq.com>
     * @date        2015-01-22
     * @return boolean
     */
    public function ping()
    {
        $pool = $this->_pool;
        $sendData = pack('A60', 'ping');
        $sendCount = $this->fiexLenInfo($sendData);
        $command = pack('a10', $sendCount) . $sendData;
        socket_write($pool, $command, strlen($command));
        $len_buff = @socket_read($pool, 10, PHP_NORMAL_READ);
        $len = (int) trim($len_buff);
        if ($len >= 5 && '200' === trim(@socket_read($pool, 5, PHP_NORMAL_READ)))
        {
            return true;
        }
        return false;
    }

    /**
     * 请求socket服务接口
     * @author      liuxiang <unphp@qq.com>
     * @date        2014-12-26
     * @param type $address   调用的接口名(内部路由地址)
     * @param type $data      发送的数据
     * @return type
     */
    public function send($address, $data = '')
    {
        $pool = $this->connect();
        $sendData = pack('A60', $address) . $data;
        $sendCount = $this->fiexLenInfo($sendData);
        $command = pack('a10', $sendCount) . $sendData;
        socket_write($pool, $command, strlen($command));
        $len_buff = @socket_read($pool, 10, PHP_NORMAL_READ);
        $len = (int) trim($len_buff);
        if ($len >= 5)
        {
            $code = @socket_read($pool, 5, PHP_NORMAL_READ);
            $rp = 5 === $len ? '' : @socket_read($pool, $len - 5, PHP_NORMAL_READ);
            $rs = new coreServerResult($code, $rp);
            return $rs;
        }
        else
        {
            App::error('服务返回数据异常!', 50003);
        }
        return null;
    }

乐果   发表于   2015 年 01 月 22 日 标签:PHP

3

文章评论

回复

猜猜我是谁

01 月 23 日 15 时 00 分

威武。。。
回复

Ralph

09 月 25 日 16 时 59 分

请问楼主:
$sendData = pack('A60', $address) . $data;
这里的参数'A60'是什么意思?
回复

乐果  (admin)

09 月 29 日 16 时 12 分

A:代表将字符串空白以 SPACE 字符 (空格) 填满。
60:代表长度为60个字节长度。
因此,pack('A60', $var) 的意思是将变量$var的值转变成一个固定长度为60个字节长度的二进制字符串,$var的值字节长度不够60以SPACE 字符 (空格) 填满。
> @Ralph > 请问楼主:
$sendData = pack('A60', $address) . $data;
这里的参数'A60'是什么意思?