田舎の風見鶏

PHP5.2でsoy cms 1.8.6以降のエラー回避について

soycms

なるべく新しいsoy cmsを利用したくて、結構頻繁にバージョンアップしていましたが、soy cms 1.8.6以降では管理画面には入れるけど公開ページが真っ白なので、soy cms 1.8.5を使い続けていました。

このサイトで使っているラクサバもPHP5.2.17です。
公式サイトではPHP5.2以降、推奨環境が5.2.20以降となっていますのでラクサバは非推奨環境ですね。

しかし仕事でPHP5.2.17でsoy cmsをインストールすることになり、最新の1.8.12をインストールしましたが、やはり公開ページは真っ白。

仕方ないのでエラーログを見て原因を調べてみました。

エラーログの場所はsoy cmsインストールディレクトリの/common/log/error-******.log

(******は西暦と月、2015年11月分のログはerror-201511.log)

これをダウンロードして開いてエラーを確認。

>PHP Parse error:  syntax error, unexpected T_FUNCTION in /soyをインストールしたディレクトリ/common/site_include/CMSBlogPage.class.php on line 280
>PHP Parse error:  syntax error, unexpected T_FUNCTION in /soyをインストールしたディレクトリ/common/site_include/DateLabel.class.php on line 39

CMSBlogPage.class.phpとDateLabel.class.phpの2つのファイルがエラーを吐いています。

エラー箇所近辺のコードを見ると共通してPHP5.3.0.0以降かどうかのif文での条件分岐でエラーを吐いています。

        >//条件付きフォーマット
        >if(version_compare(PHP_VERSION, '5.3.0', '>=0')){
        >   //preg_replaceのeオプションは5.5.0で非推奨になった
        >  //preg_replace_callbackは4.0.5から使えるが無名関数は5.3.0以降
       >     $time = $this->time; $year = $this->year; $month = $this->month; $day = $this->day;
       >    $format = preg_replace_callback("/%DATE:([^%]*)%/u",function($m) use ($time) {return date($m[1],$time);},$format);
       >     $format = preg_replace_callback('/%Y:([^%]*)%/u',function($m) use ($time, $year)  {return strlen($year)  ? date($m[1],$time) : '';},$format);
       >     $format = preg_replace_callback('/%M:([^%]*)%/u',function($m) use ($time, $month) {return strlen($month) ? date($m[1],$time) : '';},$format);
       >     $format = preg_replace_callback('/%D:([^%]*)%/u',function($m) use ($time, $day)   {return strlen($day)   ? date($m[1],$time) : '';},$format);
       > }else{
       >    $format = preg_replace("/%DATE:([^%]*)%/e","date('\\1',\$this->time)",$format);
       >     $format = preg_replace('/%Y:([^%]*)%/e',"strlen(\$this->year)  ? date('\\1',\$this->time) : ''",$format);
       >     $format = preg_replace('/%M:([^%]*)%/e',"strlen(\$this->month) ? date('\\1',\$this->time) : ''",$format);
       >    $format = preg_replace('/%D:([^%]*)%/e',"strlen(\$this->day)    ? date('\\1',\$this->time) : ''",$format);
       > }

PHPはほとんど触ったことがないし面倒くさかったので、PHP5.3.0かどうかのif分をまるごと削除しました。

強引ですがこれでPHP5.2環境でも動作しました。



タイトル :
名前 :
URL :
コメント:

お手数ですが、下記入力項目に「確認」と入力して下さい。

トラックバックURL