2012-08-02 43 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