在PHP中使用来自固定长度缓冲区的可变长度的数据

时间:2015-11-16 18:27:50

标签: php buffering file-read

我有一个文件非常大,我无法一次性将其读入字符串,但必须使用缓冲:

$fp = @fopen("bigfile", 'rb');
while (!feof($fp)) {
    //process buffer
}

为简单起见,假设该文件包含一系列整数字符串对,其中整数包含字符串的长度。然后我想在process buffer中实现的代码是unpack一个int,从缓冲区读取很多字符,然后重复。

我很感激处理字符串跨越一个缓冲区到下一个场景的任何建议。我确定这个问题一定已经解决了,并且有一个设计模式,我只是不知道从哪里开始寻找。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

不确定您是否正在寻找一个非常聪明的解决方案,但直接就是:

while (!feof($fp)) {
    $len = fread($fp, 2); // integer-2 bytes ...?
    // <--- add checks here  len($len)==2 and so on...
    $len = unpack('S', $len); // pick the correct format character from http://docs.php.net/function.pack

    while(!feof($fp) && $len) {
        $cbRead = $len < MAX_CHUNK_LEN ? $len : MAX_CHUNK_LEN;
        $buf = fread($fp, $cbRead);
        // <--- add checks here  len($buf)==$cbRead and so on...
        $len -= $cbRead;
        // ... process buf 
    }
    if ( $len!=0 ) {
        errorHandler();
    }
    else {
        processEndOfString();
    }
}