有人知道吗?我需要测试一些上传/下载脚本,并需要生成一些非常大的文件。我打算将测试实用程序与我的调试脚本集成。
答案 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)
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)
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之类的库来生成测试数据。