NextcloudのExternal StorageサービスでのArray to string conversionエラーに対処
エラー概要
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サイトに管理者権限でログインします。
- 管理メニュー→ログへと進み、適用時刻以降に冒頭のログが出力されていないことを確認します。