オープンソースのWebアンケートサーバ「LimeSurvey」のインストール時のポイント。
MySQLのバージョンを8系にしてInnodbを利用しようとすると、インストールスクリプトの要件チェックではじかれる。これらのチェックを無効化してやり過ごす。
application/models/InstallerConfigForm.php
public function validateDBEngine($attribute) { if ($this->isMysql && ($this->dbengine === null or !in_array($this->dbengine, array_keys($this->dbEngines)))) { $this->addError($attribute, gT('The database engine type must be set for MySQL')); } #if ($this->isMysql && $this->dbengine === self::ENGINE_TYPE_INNODB) { # if (!$this->isInnoDbLargeFilePrefixEnabled()) { # $this->addError($attribute, gT('You need to enable large_file_prefix setting in your database configuration in o\rder to use InnoDB engine for LimeSurvey!')); # } # if (!$this->isInnoDbBarracudaFileFormat()) { # $this->addError($attribute, gT('Your database configuration needs to have innodb_file_format and innodb_file_for\mat_max set to use the Barracuda format in order to use InnoDB engine for LimeSurvey!')); # } #} }
以前のバージョンで設定しなければならないオプションはMySQL8では廃止されているため、値がセットされていないような状況になってインストールが進められない。チェックしているロジックをすべてコメントアウトして対応。
もう一つの躓きポイントは単なるバグ。ネットワーク経由でDBに接続するのではなく、ソケットを利用する場合DSNの構築にミスがありうまく接続できない。
private function getMysqlDsn() { $port = $this->getDbPort(); // MySQL allow unix_socket for database location, then test if $sDatabaseLocation start with "/" if (substr($this->dblocation, 0, 1) == "/") { $sDSN = "mysql:unix_socket={$this->dblocation};"; } else { $sDSN = "mysql:host={$this->dblocation};port={$port};"; } if ($this->useDbName) { $sDSN .= "dbname={$this->dbname};"; } return $sDSN; }
上記の関数の「$sDSN = “mysql:unix_socket={$this→dblocation}”;」を「$sDSN = “mysql:unix_socket={$this→dblocation};”;」にする。「;」が1つ抜けているため、そのままDSNを構築するとソケットファイル名に続くパラメータが区切り文字なしに結合されてしまい、DBに接続できなくなる。バグ報告は暇を見つけてやっておきたい。