エラー概要
Nextcloud 28.x以降にバージョンアップしてから、ログで以下が大量に出力され続けていました。
Array to string conversion at /var/www/html/nextcloud/lib/private/Files/Cache/Scanner.php#224
こちらの対処を行います。
エラーが出る要件
- Nextcloud 28.x以降を利用している。
 - External Storageプラグインを利用している。
 - このプラグインで、S3(乃至はS3互換のオンラインストレージ)をマウントしている。
 - マウントしたストレージにファイルやフォルダを保存した。
 
詳細:Nextcloud Hub 8, copying files to an External Storage configured as primary storage isn't reliable
環境
- Ubuntu 20.04
 - Nextcloud 29.0.0
 - PHP 8.1
 - Apache 2.4
 - オンラインストレージサービスとしてwasabiを利用
 
解決策
上記issueに
Pretty sure this would be fixed by #43794. At least in my limited testing using the merge request as a patch: https://patch-diff.githubusercontent.com/raw/nextcloud/server/pull/43794.diff
とあったので、この通りに実施します。
さっくりとした手順
- rootに昇格します。
 - パッチファイルを入手します。
 - ファイルを適用します。
 - Apacheを再起動します。
 
root昇格
sudo su -
Nextcloudはwww-dataユーザーのみアクセス可能と、厳しめのアクセス権が設定されているので、ここで昇格させます。
ディレクトリ移動
- Nextcloudのルートディレクトリに移動
 
cd /var/www/html/nextcloud && pwd
自分の環境に合わせます。
cd lib/private/Files/Cache
ファイルバックアップ
- Scanner.phpファイルのバックアップ
 
cp -pi Scanner.php /path/to/backup/directory/Scanner.php.$(date +%Y%m%d)
任意のバックアップディレクトリを指定します。
- バックアップ確認
 
diff -u Scanner.php /path/to/backup/directory/Scanner.php.$(date +%Y%m%d)
差分がなければバックアップは成功です。
パッチ適用
- wgetでパッチ入手
 
sudo -u www-data https://patch-diff.githubusercontent.com/raw/nextcloud/server/pull/43794.diff
- パッチ適用
 
sudo -u www-data patch < 43794.diff 
patching file Scanner.phpと返ってくればOKです。
パッチ適用確認
- 差分確認
 
diff -u /path/to/backup/directory/Scanner.php.$(date +%Y%m%d) Scanner.php
- 差分結果
 
                                                }
                                                // Only update metadata that has changed
-                                               $newData = array_diff_assoc($data, $cacheData->getData());
-
+                                               // i.e. get all the values in $data that are not present in the cache already
+                                               // NOTE: we serialize then unserialize here because array_diff_assoc() doesn't 
+                                               // support multidimensional arrays on its own (and otherwise internally casts any 
+                                               // embedded array elements to attempt to compare them - not only generating warnings 
+                                               // like "Array to string conversion" but also, as a resut, overlooking real differences)
+                                               $newData = array_diff_assoc(
+                                                       array_map('serialize', $data), 
+                                                       array_map('serialize', $cacheData->getData())
+                                                       );
+                                               $newData = array_map('unserialize', $newData);
+                                        
                                                // make it known to the caller that etag has been changed and needs propagation
                                                if (isset($newData['etag'])) {
                                                        $data['etag_changed'] = true;
- Apache再起動
 
systemctl restart apache2.service
既にrootに昇格しているので、sudoは不要のはずです。
- パッチファイルを削除
 
rm 43794.diff 
エラー解消確認
- ブラウザでNextcloudサイトに管理者権限でログインします。
 - 管理メニュー→ログへと進み、適用時刻以降に冒頭のログが出力されていないことを確認します。
 
			
コメントを残す