PHP скрипт для генерации файла со случайными данными с заданным именем и размером?

Кто-нибудь знает об этом? Мне нужно протестировать некоторые сценарии загрузки/загрузки и вам нужны действительно большие файлы. Я собирался интегрировать утилиту тестирования с моей отладкой script.

Ответ 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, для генерации тестовых данных.