PHP脚本生成一个文件,其中包含给定名称和大小的随机数据?

PHP脚本生成一个文件,其中包含给定名称和大小的随机数据?,php,file,random,Php,File,Random,有人知道吗?我需要测试一些上传/下载脚本,需要生成一些非常大的文件。我打算将测试实用程序与调试脚本集成。首先,您可以尝试以下方法: 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 } 这将创建一个填充了

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

首先,您可以尝试以下方法:

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)的文件。

您真的需要在文件大小上有如此多的变化,以至于需要一个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定义要复制的块数。

为什么不使用一个输出随机数据的脚本?脚本可以获取文件大小、类型等参数


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

文件真的需要随机吗?如果是这样,请在Linux系统上读取/dev/uradom:

dd if=/dev/uradom of=yourfile bs=4096 count=1024
#对于4MB的文件

如果它真的不需要随机,只需找到一些大小合适的文件,或者(或者)使用
tar
制作一些大小不同的tarball


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

如果您想要真正的随机数据,您可能需要尝试以下方法:

$data = '';
for ($byteSize-- >= 0) {
    $data .= chr(rand(0,255));
}
但是,如果您想要大文件大小(与任何随机数据一样),可能需要一段时间。

从“Marco Demaio”生成文件()
对内存不友好,因此我创建了

函数文件\u rand($filename,$filesize){
如果($h=fopen($filename,'w')){
如果($filesize>1024){
对于($i=0;$i
如您所见,换行符每1024字节添加一次,以避免限制在1024-9999字节的函数出现问题。e、 g.fgets()和generate_file()在生成4GB文件时会导致以下情况

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

我从中找到了下面的函数,它工作得很好。 我已经测试过了

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。通过谷歌搜索,我发现我服务器上的文件系统是
max\u volume\u size

可能PHP也可以在几秒钟内处理1200 TB的数据:

我建议使用类库来生成测试数据

如果没有现成的脚本,那么自己编写一个脚本似乎也不太简单。但是大小与给定的文件大小无关,不是吗?$size保存给定的文件大小。没有意识到PHP将一位数整数存储为1字节。泰铢:)@马特:没有。但是它在一个字节中存储一个字符(由
str_repeat()
)。@NeverEndingQueue:对于大文件,服务器的内存将被命中。在这种情况下,您必须使用经典的
fopen
,执行
fwrite
循环加上最后的
fclose
fsutil file createnew
创建一个空文件,问题是要创建一个包含随机数据的文件。这似乎不可能在3秒钟内写入那么多数据。这个托管在哪种硬件上?@pcnate它是私有服务器,托管在wiredtree上。这会创建一个填充空值的文件,这是一个特例-它是一个“稀疏文件”。有些文件系统专门处理这些问题,可以极快地操作它们,并且可以避免为它们分配任何存储。使用Gnu
dd
,您基本上可以使用
dd of=filename bs=1k seek=17600000000 count=0
立即创建一个17.6TB的稀疏文件-如果您正在生成一个随机文件,为什么要用文本编辑器打开它?@Phil不仅仅是文本编辑器。如果您通过
fgets()
或类似函数逐行读取文件,以避免占用大量内存,则此功能可能非常有用。当然,如果您愿意,您可以删除此部分。我通过文本编辑器打开它,检查输出是否符合我的需要;)
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;
}