ITブログ

PHP8 + baserCMS + SQLite環境構築時のエラー

PHP8 + baserCMS + SQLite環境構築時に、baserCMSインストーラで発生するエラーの原因を調査しました。

TL;DR

PHP8からエラー制御演算子の動作が変わったことが原因でした。
 

エラー内容

PHP8では以下のエラー(Warning)が発生します。
※baserCMSの推奨バージョンPHP7.4では発生しません。
01.png
 
1行目のエラー(Warning)
Warning (2): unlink(D:\server\html\basercms-4.7\app\db\sqlite\basercms.db): Resource temporarily unavailable [CORE\Baser\Controller\Component\BcManagerComponent.php, line 1008]
 
以下のエラー制御演算子の個所で発生しているエラーが表示されています。
@unlink($dbConfig['database']);
 
初期インストールとしてテーブルをドロップする箇所ですが、「SQLiteの場合はファイル削除してしまえば良いか。」という処理になっています。
DB接続したままの為か、ファイル削除できずにエラーが発生していました。
出力は1行だけなので初期インストールとしての影響はありません。
 
2行目以降のエラー
Warning (2): Undefined array key 1 [CORE\Baser\Model\Datasource\Database\BcSqlite.php, line 415]
 
以下のエラー制御演算子の個所で発生しているエラーです。
@list($col, $limit) = explode('(', $col);
 
カラムの型を判定する処理のようです。
このエラーが1300行表示されたとろこで画面表示が止まってしまいました。
 
直前で$colの値を出力してみると以下のようになります。
integer
Warning (2): Undefined array key 1 [CORE\Baser\Model\Datasource\Database\BcSqlite.php, line 416]

varchar(255
varchar(255
datetime
Warning (2): Undefined array key 1 [CORE\Baser\Model\Datasource\Database\BcSqlite.php, line 416]

datetime
Warning (2): Undefined array key 1 [CORE\Baser\Model\Datasource\Database\BcSqlite.php, line 416]
 
カラムの「型」と「サイズ」を分割しようとして、サイズがない定義("interger"や"datetime"等)の場合に配列インデックス=1がUndefinedでエラーとなります。
 
修正方法:
「サイズ」を格納する $limit はそもそも使用していないため「型」だけを取得するように修正します。
 

//@list($col, $limit) = explode('(', $col);
$col = explode('(', $col)[0];
 
SQLiteはサイズ指定に意味がないので、最初から切り捨ててしまって大丈夫です。
 
What is the maximum size of a VARCHAR in SQLite?
 
PHP8 エラー制御演算子の仕様はこちらです。
 
エラー制御演算子を多用している場合、PHP7以下からPHP8への移行は大変そうですね。