2012-01-02 48 views
4

出於測試目的,我需要這樣的功能:有效的方法來產生隨機字符串高達100MB的PHP測試?

/** 
* @param int $sizeInBytes 
* 
* @returns string with random data 
*/ 
function randomData($sizeInBytes) 
{ 
... 
} 

一個有效實施的任何想法?速度需要但不是真正的隨機性(更多的是「lorem ipsum」)。我最簡單的想法是在文件系統中使用真正的大文件並通過流獲取所需的大小。但是這至少需要一個100MB的文件。有沒有更好的辦法?

+1

一個「char」是1個字節; 100 MB = 104,857,600字節。這就是你需要的所有角色數量! :) – check123 2012-01-02 14:45:41

+0

如果您知道如何生成一個隨機字符*和*,您知道如何在PHP中編寫循環,那麼您已經知道如何執行此操作。這意味着我不瞭解你的問題。 – 2012-01-02 15:08:00

回答

9

如何只創建一個很長的字符串,如果您有可用內存反正?

這不應該把所有的長:)

$x = str_repeat(
    'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque sollicitudin turpis ut augue lacinia at ullamcorper dolor condimentum. Nunc elementum suscipit laoreet. Phasellus vel sem justo, a vulputate arcu. Sed rutrum elit nec elit lobortis ultrices. Quisque elit nulla, rutrum et varius sit amet, pulvinar eget purus. Aliquam erat volutpat. Fusce turpis lectus, vestibulum sed ornare sed, facilisis sit amet lacus. Nunc lobortis posuere ultricies. Phasellus aliquet cursus gravida. Curabitur eu erat ac augue rutrum mattis. Suspendisse sit amet urna nec velit commodo feugiat. Maecenas vulputate dictum diam, eu tempor erat volutpat in. Donec id nulla tortor, nec iaculis nibh. Pellentesque scelerisque nisl sit amet ligula dictum commodo. Donec porta mi in lorem porttitor id suscipit lacus auctor.', 
    125000 
); 

你當然可以只寫一個文件之一,但在內存中創建它並沒有真正採取一切那麼久。

上面的代碼產生98MB字符串約100ms和創建一個200MB字符串需要我的箱子上170ms。在大多數情況下,這應該足夠好。


如在下面的評論指出:您可能需要改變你的php.ini的設置,如果你限制你的腳本允許消耗的內存量(或通過memory_limit('...');改變它)。還有字符串> 1.5GB可能會導致問題,但這不是我要說的關注。

+0

PHP字符串長度限制任何人? - [一些PHP內存伸展樂趣的協議](http://hakre.wordpress.com/2011/06/09/protocol-of-some-php-memory-stretching-fun/) – hakre 2012-01-02 14:46:59

+0

感謝所有的想法。在使用stream'/ dev/random'塊進行一些測試之後,使用'/ dev/urandom'工作,但速度很慢。適合我的解決方案是: 函數createBytes($ sizeOfFilesInBytes) $ kbString =「」; ($ i = 0; $ i <1024; $ i ++){ $ kbString。= chr(mt_rand(32,126)); } return str_repeat( $ kbString, ($ sizeOfFilesInBytes/1024) ); } 這是相當快的,每次都會產生不同的字符串。 – Marko 2012-01-02 15:35:52

2

如果你是在Unix環境下,你可以使用文件/dev/random當你從它想拉儘可能多兆。

+0

儘管'/ dev/random'可能會爲您提供不止一個「字符串」。 – Philip 2012-01-02 14:47:31

1

好吧,如果你想隨機文本,那麼你可以使用的話,並與標點符號另一個字典的字典,然後生成返回的字符串與從單詞詞典隨機元素,從隨機元素有一定機率標點字典。

這樣你只需要字典的內存,但它會在服務器的CPU上更重。

您還可以使用結合這種方法與你旨意是什麼,具有小字典,句子,並隨機選擇句子或段落甚至。

1

爲什麼不使用一個實際的lipsum生成腳本,如this one