我在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 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);
答案 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)
在我的情况下,我通过以下步骤解决了问题:
检查哪个用户运行php-fpm,在我的情况下,它是nginx
cat /etc/passwd
检查'nginx'用户,它的主页是'/ var / cache / nginx'
cp /root/.subversion to / var / cache / nginx
如果需要,请重新配置/var/cache/nginx/.subversion/servers
然后运作良好
也许调试过程很有帮助:
我想这是因为权限问题
我将nginx
从/sbin/nologin
更改为/bin/bash
我运行runuser -l nginx -c 'php myphpscript_which_exec_svn_command.php'
它会输出您需要的一些信息
所以我得到解决方案,出于安全原因,将nginx用户属性改回(/bin/bash
到/sbin/nologin
)