2012-12-12 60 views
1

我有一個需要將文本寫入文件的控制檯PHP應用程序。如果此大小的文本高於130999個字節,則數據將不會被寫入:exec'echo'失敗,如何查看原因?

$line = ''; 
for ($i=0 ; $i<130991 ; $i++) { 
    $line .= 'i'; 
} 

$size = mb_strlen($line, 'utf-8'); 
$line = "\n" . $size . " " . $line; // Adds another 8 bytes 
$logLine = escapeshellarg($line); 
echo shell_exec("echo {$logLine} >> data.log}"); 

懷疑內存限制,我增加了PHP內存限制從128 MB到512 MB,隨着形勢的變化。 什麼可能會導致此限制?

編輯:
一些詳細信息:除了

$ xargs --show-limits 
Your environment variables take up 3126 bytes 
POSIX upper limit on argument length (this system): 2091978 
POSIX smallest allowable upper limit on argument length (all systems): 4096 
Maximum length of command we could actually use: 2088852 
Size of command buffer we are actually using: 131072 
+0

您是否記得在更改php.ini後重新啓動Web服務? –

+2

這裏有十幾種用PHP編寫文件的原生方法。這是一個概念證明嗎? –

+0

@Matthew:是的,我確實重啓了Apache! – dotancohen

回答

2

PHP,你基本上做的是創建和運行在系統的命令行處理器龐大的命令。

我懷疑所有的命令行shell都有最大的命令大小。該限制在Windows 2000上是2047,在Windows XP上是8191 [ref]。 Linux可能會有更大的限制,但我認爲它不會是無限的。我敢肯定,你剛剛達到了系統的極限。

P.S.當PHP達到其內存限制時,您會收到適當的錯誤消息。

+0

謝謝你阿爾瓦羅。果然,'xargs --show-limits'有這樣的說法:'你的環境變量佔用3147字節'。這比我能夠回顯的130000字節小得多,所以問題可能在其他地方? – dotancohen

+0

我不是在談論環境變量,我是在談論命令本身。 '$ logLine'是一個PHP變量,而不是一個shell變量。您的命令在'echo'和'>>'之間至少包含130991個字符。 –

+0

當然!這就是爲什麼我表示驚訝的是,假設的限制遠低於實際使用的限制。雖然在重讀'xargs --show-limits'輸出(編輯成問題)時,我發現命令緩衝區的大小與我所看到的大小相當。謝謝! – dotancohen