php exec SVN空输出,在同一用户下终端工作正常

时间:2016-12-06 02:08:11

标签: php shell debugging svn fpm

我在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

基于此,似乎特别是exec上PHP5-FPM svn的问题。但是我该怎么调试这个并找出问题所在呢?

感谢。

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

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

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

  • svn cleanup $ path
  • svn revert $ path -R

“svn update $ path”返回“正在更新'$ path'”但停在那里,以前当前的内部版本号将在第二行返回。

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

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

这只留下app codebase和svn服务器作为可能的原因。我将尝试重新启动svn服务器并重做svn项目。

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

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

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

3 个答案:

答案 0 :(得分:1)

exit status(1)表示命令由于某种原因失败。要找出原因,您需要在proc_open函数的帮助下捕获标准错误,如this answer所示。 exec函数仅捕获标准输出。

答案 1 :(得分:1)

有一个“无法将字符串从本机编码转换为'UTF-8':”由于文件名中包含一些特殊字符的文件,SVN会抛出错误。有趣的是,当从php-fpm运行而不是在终端中时,错误只停止了进程。没有想法为什么。我添加了导出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);

答案 2 :(得分:0)

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

  1. 检查哪个用户运行php-fpm,在我的情况下,它是nginx

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

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

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

  5. 然后运作良好

  6. 也许调试过程很有帮助:

    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