用于生成具有给定名称和大小的随机数据的文件的PHP脚本?

时间:2010-04-12 16:23:19

标签: php file random

有人知道吗?我需要测试一些上传/下载脚本,并需要生成一些非常大的文件。我打算将测试实用程序与我的调试脚本集成。

8 个答案:

答案 0 :(得分:8)

首先,您可以尝试这样的事情:

function generate_file($file_name, $size_in_bytes)
{
   $data = str_repeat(rand(0,9), $size_in_bytes);
   file_put_contents($file_name, $data); //writes $data in a file   
}

这会创建一个填充了随机数字(0-9)的文件。

答案 1 :(得分:6)

你真的需要文件大小的变化,你需要PHP脚本吗?我只是通过命令行创建不同大小的测试文件,并在我的单元测试中使用它们。除非文件大小本身可能会导致错误,否则你似乎在这里过度工程......

在Windows中创建文件;

fsutil file createnew d:\filepath\filename.txt 1048576
在Linux中

;

dd if=/dev/zero of=filepath/filename.txt bs=10000000 count=1

如果是文件来源(在这种情况下没有), 是输出文件, bs 是最终的文件大小, count 定义要复制的块数。

答案 2 :(得分:4)

来自“Marco Demaio”的

generate_file()不符合记忆,所以我创建了file_rand()

function file_rand($filename, $filesize) {
    if ($h = fopen($filename, 'w')) {
        if ($filesize > 1024) {
            for ($i = 0; $i < floor($filesize / 1024); $i++) {
                fwrite($h, bin2hex(openssl_random_pseudo_bytes(511)) . PHP_EOL);
            }
            $filesize = $filesize - (1024 * $i);
        }
        $mod = $filesize % 2;
        fwrite($h, bin2hex(openssl_random_pseudo_bytes(($filesize - $mod) / 2)));
        if ($mod) {
            fwrite($h, substr(uniqid(), 0, 1));
        }
        fclose($h);
        umask(0000);
        chmod($filename, 0644);
    }
}

正如您所见,每1024字节添加一行换行符,以避免限制为1024-9999字节的函数出现问题。例如fgets()with&lt; = PHP 4.3。并且它使用文本编辑器打开文件更加容易,文本编辑器具有与超长行相同的问题。

答案 3 :(得分:2)

文件真的需要随机吗?如果是这样,只需从Linux系统上的/ dev / urandom中读取:

dd if=/dev/urandom of=yourfile bs=4096 count=1024#为4MB文件。

如果它确实不需要是随机的,只需找到一些你所在的文件是合适的大小,或者(或者)使用tar并制作一些不同大小的tarball。

没有理由需要在PHP脚本中完成:普通的shell工具足以生成所需的文件。

答案 4 :(得分:1)

为什么没有一个流出随机数据的脚本?该脚本可以获取文件大小,类型等参数。

这样您可以模拟许多场景,例如带宽限制,过早文件结束等等。

答案 5 :(得分:1)

如果你想要真正的随机数据,你可能想尝试这个:

$data = '';
for ($byteSize-- >= 0) {
    $data .= chr(rand(0,255));
}

但是,如果您想要大文件大小(与任何随机数据一样),可能需要一段时间。

答案 6 :(得分:1)

来自@Marco Demaio

generate_file()在生成4GB文件时导致此问题。

  

警告:str_repeat():结果太大,允许最大2147483647   在第38行的/home/xxx/test_suite/handler.php中

我从php.net找到了以下功能,它的功能就像魅力一样。 我已经测试过了

  

17.6 TB(见下文更新)

不到3秒钟。

function CreatFileDummy($file_name,$size = 90294967296 ) {   
// 32bits 4 294 967 296 bytes MAX Size
    $f = fopen('dummy/'.$file_name, 'wb');
    if($size >= 1000000000)  {
        $z = ($size / 1000000000);       
        if (is_float($z))  {
            $z = round($z,0);
            fseek($f, ( $size - ($z * 1000000000) -1 ), SEEK_END);
            fwrite($f, "\0");
        }       
        while(--$z > -1) {
            fseek($f, 999999999, SEEK_END);
            fwrite($f, "\0");
        }
    }
    else {
        fseek($f, $size - 1, SEEK_END);
        fwrite($f, "\0");
    }
    fclose($f);

return true;
}

更新

我试图达到120TB,1200 TB甚至更多,但文件大小限制为17.6 TB。经过一些谷歌搜索后,我发现我的服务器上的ReiserFS文件系统是max_volume_size。 可能是PHP也可以在几秒钟内处理1200TB。 :)

答案 7 :(得分:0)

我建议使用Faker之类的库来生成测试数据。