来自 PHP 脚本的 CMD - 获取反馈
CMD from PHP script - get feedback
我有很多(将近 300 个)旧 SVN 存储库要使用 git2svn 迁移到 git。
经过考虑GOLANG和PYTHON,我最终决定使用PHP是最简单的方法。可能是一个 糟糕的 有问题的决定,但这似乎很容易。
因此,15 分钟后,我 did have a script 或多或少 运行 测试正常。丑陋的脚本,但它是一次性的。
问题是这个过程需要很多时间,即使是简单的几乎是空的回购也可能需要 30 秒。甚至一分钟。在大问题上——甚至 10 分钟——所以在将其投入生产之前,我希望有一些反馈机制——这样我就能真正看到发生了什么。
..截至目前,脚本确实输出命令反馈,如下所示:
$cmd = "cd ".$GITrepoPath." && svn2git svn://127.0.0.1/". $repoName . " --username " .$SVNusername ." --authors authors.txt --notags --nobranches --notrunk";
$output = shell_exec($cmd);
echo "<pre>$output</pre>";
..但这只是在每个 repo 完成处理之后..不像真正的 cmd
执行,我可以看到这些步骤。
我发现可能接近我需要的唯一问题是 here - 但老实说 - 我对答案的了解不多...
我知道这只是一个一次性脚本 - 但用例让我对如何实际实现它很感兴趣(如果可能的话)。
我在 win7 本地机器上,但如果可能的话也想知道 *nix。
我建议 运行 在后台运行命令然后更新数据库中的记录的脚本或程序,然后您可以使用 AJAX 或其他任何方式轮询服务器以获取记录变化。这为用户提供了一个良好的环境。
数据库中的列 table 可以命名为类似 "finished" 的名称,一旦该布尔值为真,您就知道它已完成,输出可以存储在数据库中。
shell_exec
等待进程关闭。你必须创建进程并监听它,就像 CMD 一样。以这种方式使用 exec
函数:
$cmd = ''; // your command here
$output_storage = [];
$output_showed = [];
$result = null;
exec($cmd, $output_storage, $result);
while( $result === null ){
$diff = array_diff($output_storage, $output_showed);
if( $diff ){
// all new outputs here as $diff
$output_showed = $diff;
}
}
我有很多(将近 300 个)旧 SVN 存储库要使用 git2svn 迁移到 git。
经过考虑GOLANG和PYTHON,我最终决定使用PHP是最简单的方法。可能是一个 糟糕的 有问题的决定,但这似乎很容易。
因此,15 分钟后,我 did have a script 或多或少 运行 测试正常。丑陋的脚本,但它是一次性的。
问题是这个过程需要很多时间,即使是简单的几乎是空的回购也可能需要 30 秒。甚至一分钟。在大问题上——甚至 10 分钟——所以在将其投入生产之前,我希望有一些反馈机制——这样我就能真正看到发生了什么。
..截至目前,脚本确实输出命令反馈,如下所示:
$cmd = "cd ".$GITrepoPath." && svn2git svn://127.0.0.1/". $repoName . " --username " .$SVNusername ." --authors authors.txt --notags --nobranches --notrunk";
$output = shell_exec($cmd);
echo "<pre>$output</pre>";
..但这只是在每个 repo 完成处理之后..不像真正的 cmd
执行,我可以看到这些步骤。
我发现可能接近我需要的唯一问题是 here - 但老实说 - 我对答案的了解不多...
我知道这只是一个一次性脚本 - 但用例让我对如何实际实现它很感兴趣(如果可能的话)。
我在 win7 本地机器上,但如果可能的话也想知道 *nix。
我建议 运行 在后台运行命令然后更新数据库中的记录的脚本或程序,然后您可以使用 AJAX 或其他任何方式轮询服务器以获取记录变化。这为用户提供了一个良好的环境。
数据库中的列 table 可以命名为类似 "finished" 的名称,一旦该布尔值为真,您就知道它已完成,输出可以存储在数据库中。
shell_exec
等待进程关闭。你必须创建进程并监听它,就像 CMD 一样。以这种方式使用 exec
函数:
$cmd = ''; // your command here
$output_storage = [];
$output_showed = [];
$result = null;
exec($cmd, $output_storage, $result);
while( $result === null ){
$diff = array_diff($output_storage, $output_showed);
if( $diff ){
// all new outputs here as $diff
$output_showed = $diff;
}
}