blog

program

Smartyの不具合

2016/03/25:smarty公式フォーラムの返信がふえていたので記述を修正(汗

PowerCMS案件がありまして、専用サーバを利用することになりました。
PHPのバージョンが5.3になっています。たしかサポートが終了するはずです。
作業を行う前に最新安定版である5.5系に更新しておきました。

するとこんなエラーが。
> preg_replace(): The /e modifier is deprecated, use preg_replace_callback
PowerCMS、というかMTが内部でsmartyテンプレートを利用しているのですが、その中で発生しているようです。


preg_replaceのchangelog
pcreオプション

e (PREG_REPLACE_EVAL)
警告
この機能は PHP 5.5.0 で 非推奨になります。この機能に頼らないことを強く推奨します。
この非推奨の修飾子を設定すると、preg_replace() は、置換文字列において後方参照に関する通常の置換を行った後、 PHP コードとして評価し、検索文字列を置換するためにその結果を 使用します。 置換された後方参照においては、 単引用符や二重引用符、バックスラッシュ (\)および NULL 文字は バックスラッシュでエスケープされます。

なにやら小難しい専門用語が並んでいますが、要は『置換した文字列をPHPとして実行する』と思ってください。
悪名高きevalです。
非推奨になるのが遅すぎたくらいです。

smartyの新しいバージョンは対応していそうなのですが、MT全体への影響を確認する時間はありません。
警告レベルですが、こちらでもPHPを開発する可能性はあるのでエラーレベルを下げるのも避けたいところ。
もちろん最悪の場合はサポート切れを承知でバージョンを元に戻すという決断もあります。
しかし、相手は関数一つです。取り急ぎこちらでpreg_replace_callback()に置き換えれるか確認してみました。

該当部分がこちら。

一見シンプルですが、ほとんどクラスのプロパティと関数の引数、ソースファイルで見ると遠いところで設定されている値です。
これを追っていくのは……ちょっと難しいですね。

と思ったらsmarty公式サイトのフォーラムにそのままの回答がありました。
英語ですが、下から2番目Tue Jul 16, 2013 7:49 pmに白背景で書かれているコードです。

これで一安心です。
と思っていたら……

RedHat系についてはRedHat社のチームがサポートを継続するようですね。
情報を追いきれていませんでした。申し訳ありません。

とはいえ、何が起こるかわからないのがソフトウェア業界。
この案件もサーバ移行がないとはいえませんし、移行先がRedHat系である保障はありません。
また、この修正自体は5.3系に戻しても動きます。
本家の最新安定版を追っていくほうが比較的安全かも知れないとも思います。

2014.07.03追記
@junnamaさんこと野田社長も同じ問題に触れています。
未サポート……ですよね。
パッチなりが出たらちゃんと入れ替えます。

2015.02.05追記
MT Ver.6.0.4以降で対応されています。
こちらでは報告していませんでしたが上記サイトも既に入れ替えています。