2012-08-02 42 views
1

誰能給我一些指點關於PHP命令的執行和最佳做法?PHP EXEC建議/替代

林目前正在嘗試分析一些的NetBackup數據,但我遇到了相關數據的系統調用返回的巨量的問題。爲了減少數據IM的retreiving我做這樣的事情量:使用awk來限制數據量

$awk_command = "awk -F, '{print $1\",\"$2\",\"$3\",\"$4\",\"$5\",\"$6\",\"$7\",\"$9\",\"$11\",\"$26\",\"$32\",\"$33\",\"$34\",\"$35\",\"$36\",\"$37\",\"$38\",\"$39\",\"$40}'"; 
exec("sudo /usr/openv/netbackup/bin/admincmd/bpdbjobs -report -M $master_name -all_columns | $awk_command", $get_backups, $null); 
foreach ($get_backups as $backup_detail) 
    { 
    process_the_data(); 
    write_data_to_db(); 
    } 

林接收。如果沒有它,我最終會收到大約150MB的數據,而且,我得到了一個更容易管理的〜800k數據。

你不需要告訴我,awk的狗屎是討厭的 - 我已經知道了......但在我砥礪(和我的代碼),任何人都可以提出一個替代的利益?

我想的有點像proc_open,但真的不知道這是怎麼回事提供任何好處。

+0

存在着相當大的好處是用'proc_open()'因爲你可以在PHP中的時間處理數據一行,並就不需要加載整個800K立刻進入記憶。你可能會更好地使用簡單的['popen()'](http://php.net/popen),因爲你不需要雙向通信。我個人並不認爲在這裏使用'awk'是錯誤的,如果它正在做你想做的事 - 在PHP中做同樣的工作會更有效率。使用流(來自'proc_open()'/'popen()')還可以使用'fgetcsv()'來檢索數組,而不必親自去做。 – DaveRandom 2012-08-02 09:07:26

回答

1

使用exec來寫,而不是讀它整成腳本的數據文件。

exec("sudo /usr/openv/netbackup/bin/admincmd/bpdbjobs -report -M $master_name -all_columns | $awk_command > /tmp/output.data"); 

然後使用任何有效的內存方法來讀取文件的部分內容。

看一看這裏: Least memory intensive way to read a file in PHP

+0

我沒有看到轉儲到磁盤的理由,它只是增加了開銷。如果'proc_open()'/'popen()'可用,爲什麼不直接刪除磁盤寫入/讀取並直接讀取'awk's標準輸出? – DaveRandom 2012-08-02 09:09:31

+0

@DaveRandom這將有助於減少腳本完成的峯值內存使用量。在內存中沒有完整的800 K,在循環中每行8 KB似乎更好,儘管增加了文件搜索開銷。 – DhruvPathak 2012-08-02 09:10:41

+0

我不得不對它進行基準測試,但我相當有信心將它保留在內存中的速度會明顯更快,足以讓它值得去做。如果我們在談論更多的數據,那麼我會100%同意你的觀點,但現在這些日子裏沒有800k。畢竟,服務器在完成這些操作時必須有相當大的備用內存 - awk只能使用150MB!我寧願儘快完成這項工作,以便操作系統可以恢復所有內存,但有很多因素需要考慮 - 總線速度,服務器負載等等。 – DaveRandom 2012-08-02 09:16:47