NextCloudに潜むサイズの大きな動画ファイルの再生問題

※本件、Nextcloud 27.1.1 時点で本家修正のため改善しています。

NextCloudでサイズの大きな動画ファイルを連続で複数再生したり動画をシークするとPHPプロセスが大量に動き続ける事象の解決方法を発見しましたので残しておきます。

この事象はファイルサイズが1GBytesを超えるような大きな動画ファイルをブラウザ上で再生した際に発生します。アプリでの再生でも同様です。
なお、ブラウザ上で動画の再生を停止しても、NextCloud(PHP)内部でファイルの処理が終わるまでこの事象は収まりません。

動画のシークを行うとプロセスがいっぱいです

ブラウザからNextCloud(WEBサーバ)側へ動画のファイル情報の取得要求があるたびに動画の処理プロセスが走り、ブラウザの接続が閉じてもなお処理し続けていることが問題のような気がしたのでその辺を探ってみました。

すると、NextCloud内部では動画のファイル情報の要求があった際に
nextcloud_root/3rdparty/sabre/http/lib/Sapi.php
にて動画ファイルを処理していることがわかりました。

この中の処理でブラウザからの接続が切れているにもかかわらず処理を抜けない事象を確認しましたので、上記ファイルの115行目

if ($copied <= 0) {

の部分を

if ($copied <= 0 || connection_aborted()) {

に変えることで、ブラウザからの接続が切れた段階でファイルの処理を中止させることができるようになり、無駄なプロセスが動き続けることもなくなりました。
また、ブラウザでの動画の再生開始やシーク動作も非常に速くなります。

修正箇所周辺のキャプチャも残しておきます。

この修正は現時点で最新の Nextcloud 27.0.0 にて確認しております。

なお、上記ファイルはNextCloudのアップグレード等で元の状態に戻ってしまうことがありますので、この修正以外に良い方法をご存じの方はコメントにて教えていただけますと幸いです。


以上となります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です