1

我在 PHP 中更新 SVN 时遇到问题。它工作正常,然后几天前突然停止工作。

我正在通过 Nginx 运行 PHP-FPM 5.5。SVN 版本是 1.8.8。

编码:

exec("svn cleanup $path");
exec("svn revert $path -R");
exec("svn update $path --accept theirs-full --non-interactive", $output, $return);
echo "Return: $return\nOutput: ".print_r($output, true)

输出:

Return: 1
Output: Array
(
)

当我在终端中运行它时(在与 PHP-FPM 和 Nginx 相同的用户下),我得到了预期的输出:

Updating '/path/to/app':
At revision 100

PHP CLI 也适用于正确的输出(在与 PHP-FPM 和 Nginx 相同的用户下):

php5 /path/to/app/svnupdate.php

基于此,它似乎是 PHP5-FPMexecsvn. 但是我怎样才能调试它并找出问题所在呢?

谢谢。

更新评论以使所有内容保持在一起: 尝试了 proc_open 方法,通过该方法仅运行“svn cleanup $path”失败并导致所有文件锁定。在终端的同一用户下运行相同的命令工作正常并再次解锁所有文件。

尝试了svn bin的完整路径,没有区别

运行“svn info $path”似乎工作正常,没有文件被锁定。以下命令在 php exec/proc_open 中都失败(没有任何错误消息或输出)并锁定应用程序文件:

  • svn清理$路径
  • svn 恢复 $path -R

"svn update $path" 返回 "Updating '$path'" 但停在那里,之前当前的内部版本号将在第二行返回。

我有第二个设置,使用不同的应用程序和 svn 服务器,但运行相同版本的操作系统和所有软件,这个运行正常。我认为这排除了软件。

我尝试将问题服务器回滚到 2 个月前运行时的版本,服务器在启动时会自动更新软件和应用程序,但不应该触及配置文件或缓存。在它可用后,它仍然显示相同的问题。相当肯定排除软件配置文件/缓存。

这仅留下了应用程序代码库和 svn 服务器作为可能的原因。接下来我将尝试重置 svn 服务器并重做 svn 项目。

更新 2: 在 SVN 服务器上重新创建项目,从应用服务器和所有 svn 配置目录中删除应用程序,从 SVN 服务器签出新项目(构建 1)。还是同样的错误。!_!

更新 3: 在完成上述所有操作后,我得出的结论是只留下了可能导致问题的文件库。事实上,由于文件名中有一些带有特殊字符的文件,SVN 会抛出“无法将字符串从本机编码转换为 'UTF-8':”错误。有趣的是,该错误仅在从 php-fpm 而不是在终端中运行时停止了进程。不知道为什么。我添加了 export LC_CTYPE=en_US.UTF-8; 到 exec 命令,现在它工作正常。

exec("export LC_CTYPE=en_US.UTF-8; svn update $path",$output);
4

3 回答 3

1

退出状态(1) 表示该命令由于某种原因而失败。要找出原因,您需要借助此答案proc_open中所示的函数来捕获标准错误。该函数仅捕获标准输出。exec

于 2016-12-06T02:25:07.153 回答
1

由于文件名中有一些带有特殊字符的文件,SVN 抛出“无法将字符串从本机编码转换为 'UTF-8':”错误。有趣的是,该错误仅在从 php-fpm 而不是在终端中运行时停止了进程。不知道为什么。我添加了 export LC_CTYPE=en_US.UTF-8; 到 exec 命令,现在它工作正常。

exec("export LC_CTYPE=en_US.UTF-8; svn update $path",$output);

我使用这段代码实际发现了 php 中的错误:

$proc = proc_open('svn update', $desc, $pipes);
echo 'PIPE 1: '.stream_get_contents($pipes[1]); fclose($pipes[1]);
echo 'PIPE 2: '.stream_get_contents($pipes[2]); fclose($pipes[1]);
echo 'STATUS: '.proc_close($proc);
于 2016-12-07T02:47:25.003 回答
0

在我的情况下,我通过以下步骤解决了这个问题:

  1. 检查哪个用户 php-fpm 运行,在我的例子中,它是 nginx

  2. cat /etc/passwd检查'nginx'用户,它的主目录是'/var/cache/nginx'

  3. cp /root/.subversion 到 /var/cache/nginx

  4. 如果需要,重新配置 /var/cache/nginx/.subversion/servers

  5. 然后效果很好

也许调试过程会有所帮助:

  1. 我猜是因为权限问题

  2. nginx/sbin/nologin_/bin/bash

  3. 我跑runuser -l nginx -c 'php myphpscript_which_exec_svn_command.php'

  4. 它会输出一些你需要的信息

  5. 所以我得到了解决方案,出于安全原因,将 nginx 用户属性改回(/bin/bash/sbin/nologin

于 2017-01-31T15:43:44.497 回答