3

我对这个简单的脚本有问题......

<?php
$file = "C:\\Users\\Alejandro\\Desktop\\integers\\integers";

$file = file_get_contents($file, NULL, NULL, 0, 34359738352);

echo $file;
?>

它总是给我这个错误:

file_get_contents():长度必须大于等于零

我真的很累,有人能帮帮我吗?

编辑:将文件分成 32 部分后......

错误是

PHP Fatal error:  Allowed memory size of 1585446912 bytes exhausted (tried to al
locate 2147483648 bytes)

Fatal error: Allowed memory size of 1585446912 bytes exhausted (tried to allocat
e 2147483648 bytes)

编辑(2):

现在的处理是将这个二进制文件转换为从 0 到 (2^31)-1 的数字列表,这就是我需要读取文件的原因,因此我可以将二进制数字转换为十进制数字。

4

2 回答 2

3

最后一个参数是int,显然在您的 PHP 实现中int只有 31 位的量级。您提供的数字比那个大,所以这个调用永远不会在那个系统上工作。

还有其他特点:

  • 为什么你传递NULL第二个参数而不是false
  • 你是说你想从那个文件中读取超过 2GB 的内容——系统和 PHP 配置是否可以做到这一点?
于 2013-05-04T19:25:07.163 回答
3

看起来您的文件路径缺少反斜杠,这可能导致file_load_contents()加载文件失败。

试试这个:

$file = "C:\\\\Users\\Alejandro\\Desktop\\integers\\integers";

编辑:现在您可以读取您的文件,我们发现由于您的文件太大,它超出了您的内存限制并导致您的脚本崩溃。

尝试一次缓冲一件,以免超出内存限制。这是一个脚本,它将读取二进制数据,一次一个 4 字节的数字,然后您可以根据需要对其进行处理。

通过一次只缓冲一个片段,您允许 PHP 一次只使用 4 个字节来存储文件的内容(在处理每个片段时),而不是将整个内容存储在一个巨大的缓冲区中并导致溢出错误。

干得好:

$file = "C:\\\\Users\\Alejandro\\Desktop\\integers\\integers";

// Open the file to read binary data
$handle = @fopen($file, "rb"); 
if ($handle) { 
   while (!feof($handle)) { 
       // Read a 4-byte number
       $bin = fgets($handle, 4);
       // Process it
       processNumber($bin); 
   } 
   fclose($handle); 
}

function processNumber($bin) {
    // Print the decimal equivalent of the number
    print(bindec($bin)); 
}
于 2013-05-04T19:51:50.083 回答