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

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

7 ответов


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

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

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


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

Как вы можете видеть, linebreaks добавляются каждые 1024 байта, чтобы избежать проблем с функциями, которые ограничены 1024-9999 байтами. например, fgets () с


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

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

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

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


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

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


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

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

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


generate_file () from @Marco Demaio вызвало это ниже при создании файла 4GB.

предупреждение: str_repeat(): результат слишком большой, максимум 2147483647 допускается in / home/xxx/test_suite / обработчик.php on line 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, "");
        }       
        while(--$z > -1) {
            fseek($f, 999999999, SEEK_END);
            fwrite($f, "");
        }
    }
    else {
        fseek($f, $size - 1, SEEK_END);
        fwrite($f, "");
    }
    fclose($f);

return true;
}

обновление:

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