PHP скрипт для генерации файла со случайными данными заданного имени и размера? - PullRequest
10 голосов
/ 12 апреля 2010

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

Ответы [ 8 ]

8 голосов
/ 12 апреля 2010

Для начала вы можете попробовать что-то вроде этого:

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).

6 голосов
/ 12 апреля 2010

Вам действительно нужно так много изменений в размерах файлов, что вам нужен скрипт 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 определяет, сколько блоков вы хотите скопировать.

4 голосов
/ 07 сентября 2014

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. И это облегчает открытие файла в текстовом редакторе, имеющем ту же проблему с супер длинными строками. </p>

2 голосов
/ 13 апреля 2010

Действительно ли файл должен быть случайным?Если это так, просто прочитайте из / dev / urandom в системе Linux:

dd if=/dev/urandom of=yourfile bs=4096 count=1024 # для файла размером 4 МБ.

Если это не обязательно должно быть случайно, просто найдите несколькофайлы, которые лежат вокруг вас, имеют подходящий размер или (альтернативно) используют tar и создают несколько тарболлов разных размеров.

Нет причин, по которым это нужно делать в скрипте PHP: обычные инструменты оболочкивполне достаточно для создания необходимых вам файлов.

1 голос
/ 14 июля 2015

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;
}

Обновление:

Я пытался набрать 120 ТБ, 1200 ТБ и более, но размер файла был ограничен 17,6 ТБ. После некоторого поиска я обнаружил, что это max_volume_size для ReiserFS файловой системы, которая была на моем сервере. Может быть, PHP может обрабатывать 1200 ТБ также всего за несколько секунд. :)

1 голос
/ 13 апреля 2010

Если вам нужны действительно случайные данные, вы можете попробовать это:

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

Однако может потребоваться некоторое время, если вам нужны файлы большого размера (как и для любых случайных данных).

1 голос
/ 12 апреля 2010

Почему бы не иметь скрипт, который выводит случайные данные? Скрипт может принимать параметры для размера файла, типа и т. Д.

Таким образом, вы можете смоделировать множество сценариев, например, ограничение полосы пропускания, преждевременное завершение файла и т. Д.

0 голосов
/ 25 мая 2019

Я бы предложил использовать библиотеку типа Faker для генерации тестовых данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...