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-FPM exec
onの問題のようですsvn
。しかし、どうすればこれをデバッグして、何が悪いのかを理解できますか?
ありがとう。
すべてをまとめるためのコメントからの更新: proc_open アプローチを試してみましたが、それを介して "svn cleanup $path" のみを実行すると失敗し、すべてのファイルがロックされました。ターミナルで同じユーザーの下で同じコマンドを実行すると、正常に機能し、すべてのファイルのロックが再び解除されました。
svn bin へのフル パスを試しましたが、違いはありません
"svn info $path" の実行は正常に機能しているようで、ファイルはロックされていませんでした。次のコマンドはすべて php exec/proc_open で失敗し (エラー メッセージや出力なしで)、アプリ ファイルをロックします。
- svn クリーンアップ $path
- svn revert $path -R
「svn update $path」は「Updating '$path'」を返しますが、そこで停止します。以前は現在のビルド番号が 2 行目に返されていました。
別のアプリと svn サーバーを使用した 2 番目のセットアップがありますが、同じバージョンの OS とすべてのソフトウェアを実行しています。これは正常に動作しています。それはソフトウェアを除外すると思います。
問題のサーバーを 2 か月前に動作していたバージョンにロールバックしようとしました。サーバーは起動時にソフトウェアとアプリを自動的に更新しますが、構成ファイルやキャッシュに触れてはいけません。利用可能になった後も、同じ問題が表示されていました。ソフトウェア構成ファイル/キャッシュを除外することはかなり確実です。
考えられる原因として、アプリのコードベースとsvnサーバーのみが残ります。次にsvnサーバーをリセットして、svnプロジェクトをやり直してみます。
更新 2: SVN サーバーでプロジェクトを再作成し、アプリ サーバーとすべての svn 構成ディレクトリからアプリケーションを削除し、SVN サーバーから新しいプロジェクトをチェックアウトしました (ビルド 1)。それでも同じエラーです。!_!
更新 3: 上記のすべてを行った後、問題を引き起こしている可能性のあるファイル ベースのみが残っていると結論付けました。そして、ファイル名に特殊文字を含むいくつかのファイルが原因で、「文字列をネイティブエンコーディングから 'UTF-8' に変換できません:」というエラーが SVN によってスローされました。興味深いことに、このエラーは、ターミナルではなく php-fpm から実行しているときにのみプロセスを停止しました。理由がわからない。export LC_CTYPE=en_US.UTF-8; を追加しました。exec コマンドに追加すると、正常に動作するようになりました。
exec("export LC_CTYPE=en_US.UTF-8; svn update $path",$output);