2010-04-12 8 views

Odpowiedz

7

Na początek można spróbować czegoś takiego:

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 
} 

Tworzy plik wypełniony losowo cyfry (0-9).

+0

, ale rozmiar nie będzie odnosił się do danego pliku, prawda? – Mathew

+0

$ rozmiar zawiera podany rozmiar pliku. – webbiedave

+0

Nie zdawałem sobie sprawy, że PHP zapisuje jednocyfrowe ints jako 1 bajt. Dzięki. :) – Mathew

6

Czy naprawdę potrzebujesz tak dużego zróżnicowania plików, że potrzebujesz skryptu PHP? Po prostu tworzyłem pliki testowe o różnych rozmiarach za pomocą wiersza poleceń i używam ich w testach jednostkowych. Chyba, że ​​sam plik prawdopodobnie spowoduje błąd, wydaje się, że masz do czynienia z nadmierną inżynierią ...

Aby utworzyć plik w systemie Windows;

fsutil file createnew d:\filepath\filename.txt 1048576 

w systemie Linux;

dd if=/dev/zero of=filepath/filename.txt bs=10000000 count=1 

jeśli jest źródłem pliku (w tym przypadku nic), od jest plik wyjściowy, bs jest ostateczny rozmiar pliku, Ilość określa ile bloków chcesz skopiować.

+1

'fsutil file createnew' tworzy PUSTY PLIK, pytanie dotyczy utworzenia pliku z losowymi danymi. –

1

Dlaczego nie ma skryptu, który strumieniowo losuje dane? Skrypt może przyjmować parametry dla rozmiaru pliku, typ itp

ten sposób można symulować wiele scenariuszy, na przykład ograniczenie szerokości pasma przedwczesny koniec pliku itd. Itp

2

Czy plik naprawdę trzeba być przypadkowe? Jeśli tak, po prostu przeczytaj z/dev/urandom w systemie Linux:

dd if=/dev/urandom of=yourfile bs=4096 count=1024 # dla pliku 4MB.

Jeśli to naprawdę nie musi być losowe, po prostu znajdź jakieś pliki, które leżą w pobliżu, które są odpowiedniej wielkości, lub (alternatywnie) użyj tar i zrób kilka paczek o różnych rozmiarach.

Nie ma powodu, aby to zrobić w skrypcie PHP: zwykłe narzędzia powłoki są całkowicie wystarczające do wygenerowania potrzebnych plików.

1

Jeśli chcesz naprawdę losowe dane może chcesz spróbować to:

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

może zająć trochę czasu, chociaż, jeśli chcesz duże rozmiary plików (jak w przypadku jakichkolwiek danych losowych).

3

generate_file() z "Marco Demaio" nie jest przyjazny pamięci, więc stworzyłem 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); 
    } 
} 

Jak widać linebreaks są dodawane każdego 1024 bajtów, aby uniknąć problemów z funkcji, które są ograniczone do 1024-9999 bajtów. na przykład fgets() z < = PHP 4.3. I ułatwia otwieranie pliku za pomocą edytora tekstowego, który ma ten sam problem z super długimi liniami.

1

generate_file() from @Marco Demaio spowodował to poniżej podczas generowania pliku 4GB.

Ostrzeżenie: str_repeat(): Wynik jest zbyt duży, maksymalny dozwolony 2147483647 w /home/xxx/test_suite/handler.php na linii 38

znalazłem poniżej funkcji z php.net i to działa jak urok. I przetestowane września

17,6 TB (patrz aktualizacji poniżej)

w ciągu mniej niż 3 sekundy.

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

Aktualizacja:

starałem się trafić 120TB, 1200 TB i więcej, ale rozmiar pliku został ograniczony do 17,6 TB. Po pewnym przeszukaniu go znalazłem, że jest to max_volume_size dla systemu plików, który był na moim serwerze. Być może PHP może obsłużyć 1200 TB również w kilka sekund. :)

+0

To wydaje się bardzo niemożliwe, aby zapisać tak dużo danych w 3 sekundy. Jakiego rodzaju sprzęt jest hostowany? – pcnate

+0

@pcnate to był prywatny serwer, hostowany na Wiredtree. –

+0

Spowoduje to utworzenie pliku wypełnionego zerami, co jest szczególnym przypadkiem - jest to plik "rzadki". Niektóre systemy plików traktują je specjalnie, mogą nimi manipulować niezwykle szybko i mogą unikać przydzielania im pamięci. Z Gnu 'dd' możesz w zasadzie natychmiast utworzyć plik rozrzutu o szerokości 17,6 TB z' dd of = filename bs = 1k seek = 17600000000 count = 0' - przez https://pl.wikipedia.org/wiki/Sparse_file –

Powiązane problemy