2014-11-04 98 views
0

我有一個長期運行的(複雜)PHP是在命令行運行腳本:重定向PHP輸出(CLI)打開多個文件句柄

php myscript.php 2> myscript.err.out > myscript.out &

對於一些reasone本打開多個(系統級)文件句柄 - 即lsof | grep myscript.out | wc -l正在增加,直到達到極限。

當然可以增加限制(通過ulimit),但我真的需要找到原因,因爲實際上應該只有一個文件句柄對該文件開放。 (即提高只能推遲問題)

,因爲我無法修剪下來的小例子 - 這裏的一些特點:

  • 的打開文件的數量有以下兩個動作強烈相關:
    • 公開賽(和關閉!)臨時文件(通過tempnam
    • 商店在MongoDB中
  • Sys系統這些臨時文件tem:SMP Debian 3.14.15-2

有沒有人有想法? (或者有些事情我能試試嗎?)

+0

很難說,沒有看到你的代碼中的所有東西可能會打開文件,套接字,命名管道等,或訪問設備將列入'lsof' – 2014-11-04 19:41:56

+0

但是,因爲我不要在我的腳本中打開一個名爲myscript.out的文件,它不應該影響lsof上的grep。我錯了嗎? – 2014-11-04 19:48:16

回答

0

更多改掉後,我可以在問題深入到:

curl_setopt($ch, CURLOPT_FILE, fopen('php://stdout', 'w')); 

這是在一個循環中完成(如捲曲實例被重用 - 見here)。

因此,解決辦法是:句柄存儲到標準輸出和關閉:

if (isset($stdout) && is_resource($stdout)) { 
    fclose($stdout); 
} 
$stdout = fopen('php://stdout', 'w'); 
curl_setopt($ch, CURLOPT_FILE, $stdout) 

注:你應該重用$stdout直接但始終關閉並重新打開它! (你會得到混亂的輸出!)