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 также всего за несколько секунд. :)