このブログ、ずっと PHP バージョン 5.2 のままだったのですが、いい加減に時代に置いて行かれそうなので、ブログの PHP 環境を PHP 5.2 から PHP 7.2 に移行しました。どなたかの役に立つかもしれないので、移行時のメモを残しておきます。
SQLite2 から SQLite3 への移行
まずは SQLite2 が使えなくっているので、SQLite2 を SQLite3 へ移行するところから。SQLite3 からオブジェクト指向になっています。PHP 5.2 でも SQLite3 は使えるので、スムーズに移行できるよう以下のようなラッパークラスを作りました。
class DataBaseAccessor extends SQLite3
{
private $db = null;
private $resource = null;
public $isSqlite3 = TRUE;
public function __construct($filepath)
{
$this->openWrap($filepath);
}
public function openWrap($filepath)
{
$this->isSqlite3 = strrpos($filepath, ".sqlite3") != FALSE;
if ($this->isSqlite3)
{
parent::open($filepath);
}
else
{
$db = sqlite_open($filepath, 0666, $sqlite_err);
if (!$db)
{
die('connecting DB failed '.$sqlite_err);
}
$this->db = $db;
}
}
public function queryWrap($query)
{
if ($this->isSqlite3)
{
$this->resource = parent::query($query);
return $this->resource;
}
else
{
$this->resource = sqlite_query($this->db, $query, SQLITE_BOTH, $sqlite_err);
if (!$this->resource)
{
die('query failed: '.$sqlite_err);
}
return $this->resource;
}
}
public function execWrap($query)
{
if ($this->isSqlite3)
{
parent::exec($query);
}
else
{
$result_flag = sqlite_exec($link, $query, $sqlite_err);
if (!$result_flag)
{
print("SQL: ".$query."<br/>");
die('query failed: '.$sqlite_err);
}
}
}
public function fetchArrayWrap()
{
if ($this->isSqlite3)
{
return $this->resource->fetchArray();
}
else
{
return sqlite_fetch_array($this->resource);
}
}
public function fetchAll()
{
if ($this->isSqlite3)
{
$multiArray = array();
$i = 0;
while($row = $this->resource->fetchArray(SQLITE3_ASSOC))
{
foreach($row as $key=>$value)
{
$multiArray[$i][$key] = $value;
}
++$i;
}
return $multiArray;
}
else
{
return sqlite_fetch_all($this->resource, SQLITE_ASSOC);
}
}
public function closeWrap()
{
if ($this->isSqlite3)
{
parent::close();
}
else
{
sqlite_close($this->db);
}
}
}
このクラスで既存の実装をすべて置き換えて SQLite2 ベースで正しく動くことを確認しました。sqlite_fetch_all() に対応する API は SQLite3 でなくなっていたようなので、自前で実装しました。
その後、SQLite2 から SQLite3 に変換したデータベースファイルの拡張子を .sqlite3 にすることで、自動的にこのクラスの内部で SQLite3 の実装に切り替わります。
SQLite2 のデータベースファイルから SQLite3 のデータベースファイルへの変換は以下のサイトのバッチファイルを使わせていただき、簡単に変換できました。
しかし、ここで問題が。
実際に SQLite3 に切り替えてみると、ページの構築速度が 2 から 3 倍ほど遅くなりました。sqlite_fetch_all() を置き換えた実装がまずかったのかと思い、fetchArray() を直接使って余計なことしない実装に変えてみてもそんなに変化はなく。
最終的には PHP のバージョンを 7.2 に上げたら改善しました。一部のページは改善しませんでしたが、そちらはそんなに頻繁に表示するページではないのであきらめました。
PHP バージョン 5.2 から 7.2 への移行
SQLite の移行は終わったので、いよいよ PHP バージョンの更新です。
まずはローカルに更新予定の PHP 7.2 をインストールして、既存の PHP でページを表示してみます。
Fatal error: Uncaught Error: Call to undefined function split()
split() が廃止されたようです。preg_split() が新しく用意されていたので、こちらに置き換えました。
置き換え前のコード
list($year_month_day, $time) = split('[ .-]', $date_source);
置き換え後のコード
list($year_month_day, $time) = preg_split('/[ .-]/', $date_source);
split() の置き換え後に再度 PHP でページを表示してみたところ、これだけでエラーなく正常に表示されました。
私の実装には API の互換崩れはそんなに影響しなくてよかったです。思ったより簡単に PHP 7.2 に移行することができました。
移行したはいいものの、まだ PHP 7.2 で新しくできるようになったことの恩恵を受けていないので、後々その辺もこのブログに取り入れていこうと思います。