Кто-нибудь знает об этом? Мне нужно протестировать некоторые сценарии загрузки/загрузки и вам нужны действительно большие файлы. Я собирался интегрировать утилиту тестирования с моей отладкой script.
PHP скрипт для генерации файла со случайными данными с заданным именем и размером?
Ответ 1
Чтобы начать, вы можете попробовать что-то вроде этого:
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).
Ответ 2
Вам действительно нужно столько изменений в размер файлах, что вам нужен PHP script? Я просто создаю тестовые файлы разного размера через командную строку и использую их в своих модульных тестах. Если сам файл не может вызвать ошибку, похоже, вы здесь слишком сложны...
Чтобы создать файл в Windows,
fsutil file createnew d:\filepath\filename.txt 1048576
в Linux;
dd if=/dev/zero of=filepath/filename.txt bs=10000000 count=1
, если - источник файла (в этом случае ничего), из - это выходной файл, bs - последний размер файла, count определяет, сколько блоков вы хотите скопировать.
Ответ 3
generate_file()
от "Marco Demaio" не дружит с памятью, поэтому я создал 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() с <= PHP 4.3. И это облегчает открытие файла с помощью текстового редактора с той же проблемой с супер длинными строками.
Ответ 4
Действительно ли файл должен быть случайным? Если это так, просто прочтите /dev/urandom в системе Linux:
dd if=/dev/urandom of=yourfile bs=4096 count=1024
# для файла размером 4 МБ.
Если вам действительно не нужно быть случайным, просто найдите некоторые файлы, которые у вас есть, соответствующие размеру, или (альтернативно) используйте tar
и создайте несколько архивов разных размеров.
В PHP script нет никаких оснований: обычные инструменты оболочки вполне достаточны для генерации необходимых вам файлов.
Ответ 5
Почему не существует script, который выдает случайные данные? script может принимать параметры для размера файла, типа и т.д.
Таким образом вы можете моделировать многие сценарии, например, дросселирование полосы пропускания, преждевременный конец файла и т.д. и т.д.
Ответ 6
Если вам нужны действительно случайные данные, вы можете попробовать:
$data = '';
for ($byteSize-- >= 0) {
$data .= chr(rand(0,255));
}
Может потребоваться некоторое время, если вам нужны большие размеры файлов (как и для любых случайных данных).
Ответ 7
generate_file() из @Marco Demaio вызвал это ниже при генерации файла 4 ГБ.
Предупреждение: str_repeat(): результат слишком большой, максимум 2147483647 разрешено в /home/xxx/test _suite/handler.php в строке 38
Я нашел ниже функцию php.net, и она работает как шарм. Я протестировал его до
17,6 ТБ (см. обновление ниже)
менее чем за 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;
}
Update:
Я пытался ударить 120 ТБ, 1200 ТБ и более, но размер файла был ограничен 17,6 ТБ. После некоторого googling я обнаружил, что max_volume_size
для ReiserFS файловой системы, которая была на моем сервере.
Может быть, PHP может обрабатывать 1200TB также всего за несколько секунд.:)
Ответ 8
Я бы предложил использовать такую библиотеку, как Faker, для генерации тестовых данных.