【问题标题】:Decoding gzip (using PHP sockets)解码 gzip(使用 PHP 套接字)
【发布时间】:2011-03-28 23:55:12
【问题描述】:

好的,有人编写了 Last.FM API 的 PHP 实现,我正在将它用于我的一个小项目。他的实现不从 Last.FM 服务器请求 gzip 压缩数据,因此我决定修改他的实现以使用 gzip 以减少带宽。我在请求压缩数据方面没有问题,它工作得很好,所有数据都被压缩(检查)。问题是解码它。我对 PHP 很陌生,过去两天我一直在尝试对其进行解码,但我没有尝试过任何工作。 :D

这是请求和接收数据的函数。如果有人能帮我让这个函数解码数据,我将不胜感激。

function send ($msg) {
    // Send message over connection
    fwrite($this->handle, $msg);

    $response = array();
    $line_num = 0;
    while ( !feof($this->handle) ) {
        $response[$line_num] =  fgets($this->handle, 4096);
        $line_num++;
    }

    // Return response as array
    return $response;
}

$this->句柄在哪里

    $this->handle = fsockopen($this->host, $this->port, $this->error_number, $this->error_string);

谢谢你=)

【问题讨论】:

    标签: php sockets gzip last.fm


    【解决方案1】:

    你有没有尝试过类似...

    
    $response='';
    while(!feof($this->handle)) {
      $response.=fgets($this->handle, 4096);
    }
    $response=gzdecode($response);
    return explode("\n",$response);
    

    假设整个响应是压缩的,而不是单独的每一行。如果是每一行,您只需将 fgets() 更改为 gzdecode(fgets())..

    【讨论】:

    • 这是有效的,但有两个警告——gzdecode 只是主干,它在解码之前不必要地将整个响应放入内存中。第二个问题还不错,但是第一个……
    • 您可以使用gzinflate(substr($data,10,-8)) 代替gzdecode($data),但索引可能会关闭,因为数据标题的大小是可变的。
    • 我之前曾尝试使用 gzdecode(),但得到“致命错误:调用未定义函数 gzdecode()”。 google-ing 后我发现 gzdecode() 将在 php6 中实现? (在本地主机上我安装了 5.3.0)。我也尝试使用我在这里找到的这个简单功能 - php.net/manual/en/function.gzdecode.php 但它也没有完成工作......
    • gzinflate(以及 gzuncompress)函数给了我“警告:gzinflate() [function.gzinflate]:数据错误”
    • Artefacto 的第二次跟进是原因 - gz 函数不适用于数据块 - 仅适用于整个数据流。如果这是一个文件,您可以使用 gzopen(...); while(!gzeof()) { gzread(...); } gzclose();但来自php.net/manual/en/filters.compression.php:“它们没有提供对网络流进行广义压缩的方法”。建议您将其写入本地文件并使用 gzopen (虽然本地文件可能是文件系统套接字)
    猜你喜欢
    • 1970-01-01
    • 2019-01-11
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 2011-06-14
    • 2019-05-25
    • 2013-04-30
    相关资源
    最近更新 更多