【发布时间】:2013-10-31 01:52:55
【问题描述】:
我的目标是从“p4 更改”中提取 POST 响应中给定更改编号的更改编号/日期/时间/描述。我制作了一个简单的 PHP 脚本,它可以解析必要的 shell 命令(虽然很麻烦,但它可以工作)并填充一个 JSON 数组。
在我开始查看“p4 describe -s”并在其中解析出一个特殊字段之前,一切正常,我们在其中列出了与 changenum 相关的错误,如下所示:
bug2342 状态已修复;
bug2343 状态已修复;
脚本必须对每个 changenum 执行单独的“p4 describe”,这当然需要一段时间。对于约 1000 个更改编号的范围,我看到 30 多秒的响应时间:(
我能做些什么来加快速度? 我什至在考虑在前端做两遍:首先获取所有的changenums,显示它们(将错误ID留空)然后异步获取大约10个左右的批次的错误编号并迭代填充丢失的数据。
$cmd = 'p4 changes -t -s submitted -l //depot/...@' . $changenum1 . ',' . $changenum2 . ' 2>&1 |
awk \'BEGIN { RS = "^Change |\n^Change "; FS = "^Change |\n^Change " } {print $1 "::::"}\'';
$output = shell_exec($cmd);
$changes = split("::::", trim($output));
$cc = array();
$i = 0;
foreach ($changes as $change) {
if (empty($change)) {
continue;
}
//example here: '3193358 on 2012/10/08 11:05:42 by user@client\n "some lengthy multiline description"'
$change = trim($change);
$c = array();
$basics = preg_split( "/( |\n)/", $change);
$c["cnum"] = $basics[0];
$c["date"] = $basics[2];
$c["time"] = $basics[3];
$user = $basics[5];
$c["user"] = preg_replace('/@.*/', "", $user);
//echo "cnum: $c["cnum"], date: $c["date"]], time: $c["time"], user: $c["user"]";
//THIS IS VERY SLOW
$cmd2 = 'p4 describe -s ' . $c["cnum"] . ' 2>&1 | egrep "^bug[0-9]+" | sed -re "s/bug([0-9]+).*/\1/"';
$output2 = shell_exec($cmd2);
$bugs = split("\n", trim($output2));
$c["bugs"] = $bugs;
$pos = strpos($change, "\n"); //remove first line
if ($pos !== false) {
$description = substr($change, $pos +1);
} else {
$description = $change;
}
//remove multiple whitespace
$description2 = preg_replace('/\s+/', ' ', $description);
//remove blank new lines etc
$description3 = preg_replace('/^\n+|^[\t\s]*\n+/m', "", $description2);
$c["desc"] = trim($description3);
$cc[$i++] = $c;
}
$output = __json_encode($cc);
【问题讨论】:
-
为什么你必须运行一个单独的'p4 describe'? 'p4 changes -l' 不是已经在输出中有完整的描述了吗?
-
是的,这就是问题所在。 “bug
”部分没有出现在描述中,它是一些内部添加的功能,我只能通过“p4 describe”获得。 -
为什么每次更改号码都必须拨打
p4 describe?p4 describe接受多个更改编号作为参数。您应该只能调用它一次。 -
也许整个过程中“非常慢”的部分是在描述过程中附加错误ID的“内部添加的功能”?您能否向您的管理员询问有关如何配置 Perforce 系统的该部分的更多信息?也许是特殊的表单触发?
-
@jamesdlin 哦,天哪,我不敢相信我忽略了这一点。我切换代码以将所有 cnums 发送到“p4 describe”,然后将结果解析到我的数组中。 10K 条目 = 2 秒,这绝对是可以管理的。谢谢你的提示!如果您将此添加为答案,我会接受。
标签: php regex sed awk perforce