「PHPの構文エラーです」で保存できないときのチェックポイント
2015年9月25日にバージョン3.0.8がリリースされ、さっそくこのサイトもアップデートしました。
アップデートは無事終わったので、以前公開した記事「Google『ユニバーサル アナリティクス』への対応法(暫定版)」を3.0.8に沿った内容に編集しようとしたところ……
「PHPの構文エラーです」という警告が出て保存できない
という事態に遭遇してしまいました。
記事内にはコード例を示しているのでそのせいかと考えたのですが、新たに記事を作ってみても同じ警告が出て保存ができません。ページ名・タイトルだけで本文なしの記事だと保存できるので、本文に加工をかける拙作プラグイン
を無効化するものの解決せず。そこで警告メッセージをgrep検索したところ、 /lib/Baser/Model/Page.php で処理を行っていることがわかりました。
PHP関数 exec() で構文チェック
baserCMSには記事編集モードを「ソース」に切り替えると、本文内に素のPHPコードを記述できる特徴があります。動的に出力結果をコントロールしたいときなどに便利な仕様ですが、以前は、コード内に文法エラーがあると編集画面が開けなくなるという不具合がありました。
不具合を解決するために2015年3月17日・5月31日、/lib/Baser/Model/Page.php にPHPコードの構文チェック機能が追加され(GitHubの変更履歴〔3月17日〕〔5月31日〕)、エラーがあるときには警告メッセージが出て保存できない仕様となりました。
この処理ではPHPの exec() 関数が使われ、構文チェックのコマンド
php -l
が返すエラーコードをもとに警告メッセージの出力有無を切り分けています。
exec() 関数は便利な反面、セキュリティポリシーの関係で使用不可のレンタルサーバもあり、当サイトを収容しているVPSもその制限に引っかかってしまったのでした。
Page.php を一部コメントアウトして構文チェックを回避
exec() が制限されている以上、このまま3.0.8を使っていても記事の保存がまったくできません。そこで、コアファイルの一部を変更してひとまず構文チェックを回避することにしました。/lib 内のコアファイルをいじるのは御法度なので、baserCMS(というかCakePHP)の流儀から /lib/Baser/Model/Page.php を /app/Model 内にコピーしてカスタマイズします。
変更するのは129~131行あたり。構文チェックの関数呼び出しをコメントアウトしました。
- 'contents' => array( + // 'contents' => array( - array('rule' => array('phpValidSyntax')) + // array('rule' => array('phpValidSyntax')) - ) + // )
当然、「記事本文中に構文エラーのあるPHPコードが存在すれば、編集画面が開けなくなる」という問題が再燃するので、記事内にコードを記述する際は十分な注意が必要です。
exec() 不可のサーバでの構文チェック対応について開発プロジェクトでチケットを切ったところ、3.0.9で対応するとのことでしたので、次のバグフィックス版で何らかの機能が追加されることでしょう。
[追記]開発版の Page.php に修正が加わりました
[2015.11.3追記]
2015年10月28日に、開発版の /lib/Baser/Model/Page.php に修正が加わりました(リポジトリの修正履歴〔GitHub〕)。
コードを見たところ Page クラスの phpValidSyntax メソッド内で exec() 関数の有無をチェックして、関数が存在しない場合 return true で処理を戻しているようです。3.0.9 で正式に実装されるものとおもわれます。
[2015.12.2追記]
2015年12月1日にリリースされたバージョン3.0.9で、正式に上記の不具合が修正されました。
baserCMS 3.0.9 リリースノート
http://basercms.net/release/3_0_9