プラグインrunPHPの不具合と対処法

投稿日: 2009年3月2日 | カテゴリ:『ワードプレス』>トラブルシュート

WordPressのプラグインであるrunPHPに重大なバグを発見しましたので、その原因と対処法について紹介いたします。

問題の発覚と原因の追求

本サイトでは、サーバーにFedoraを使用していますが、サーバーの状態を確かめるために、1日に1回システムログ(logwatch)を点検しています。最近このログのhttpdセクションに次のようなエラーが記述されるようになりました。

    500 Internal Server Error
       /weblog/?page_id=2597: 24 Time(s)

この様なエラーが出るのは、HTTPDの設定が悪いか、プログラム自体にバグがある場合に生じます。そこでエラーログの発生した前日(2月20日)のログを調べてみるとこのエラーは記述されていません。つまり、2月21日以降にこのエラーが発生していることになります。
この日付前後にシステムを変更したのは、アクセス・ランキングを表示してくれるWordpressのプラグイン=PostViewsをインストールしたことです。----(1)
また、httpdのエラー・ログ(/var/log/httpd/error_log)を調べてみると次のような記載がたくさんありました。---(2)

[Sun Feb 22 05:16:55 2009] [error] [client xxx.xx.xx.xxx] PHP Parse error:  syntax error, unexpected T_ENDIF in /var/www/wordpress/wp-content/plugins/runPHP/runPHP.php(410) : eval()'d code on line 1, referer: http://hsuzuki.ddo.jp/weblog/

(1)と(2)から判断するとrunPHPとPostViewsとの相性が悪いことが推測されます。しかし、どのような点で相性が悪いのか解かりません。
そこで、Wordpressページ2597の内容を調べてみました。以下のような記述です。

<?php if (function_exists('get_most_viewed')): ?>
   <ul>
      <?php get_most_viewed(post,100); ?>
   </ul>
<?php endif; ?> 

これは、PostViewsの表示用のコマンドです。1行目と5行目はプラグインを使用する場合の安全処理で、何らかの不具合でプラグインが停止してしまった場合にその関数の実行を無効にするものです。
しかし、このプラグインは、sidebarにも使用されていて、同じ記述でエラーは発生していません。
ということは、PostViewsプラグインやそのシンタックスに問題があるのではなく、runPHPに固有な問題があってこのエラーが発生していることになります。
そこで安全用のスクリプト2行を削除して、この記事にアクセスしてみたところエラーは発生しません。つまり、runPHPがこの2行の安全スクリプトを受け入れていなかった、という結論になります。

対策

以上の不具合に関するrunPHPのスクリプト自体のバグを発見するのは困難なので、エラーを発生させずに、安全装置がうまく働くスクリプトを考えてみました。
色々と調べてみた所、どうも2行の分離タグで挟み込むスクリプトが問題なようでしたので、次のような記述に書き換えてみました。関数が存在しない場合にプラグインを無効化する記述をプラグインの関数のPHPデリミッターの中に封じ込めてしまう対処法です。

<ol>
<?php 
if (function_exists('get_most_viewed')){
get_most_viewed(post,100); 
} 
?> 
</ol>

この設定を行えば、Internal errorも発生しませんし、プラグインを停止した場合でも安全装置が働いてプラグインの関数は無視され、他の表示に影響を与えることはありません(安全処置を施していない場合には、本体の表示が乱れたり、サイドバーが表示されないなどの不具合が発生します)。

本サイトでは、runPHPを使用しているプラグインは、Customizable Post Listings(CPL)とPostViewsだけです。これらプラグインがページやポストにおいてrunPHPとの組合せで使用されているものについては次のようにスクリプトを変更しました。

PostViewsの場合:上記を参照。

CPLの場合

<?php 
if (function_exists('c2c_get_recent_posts')){
c2c_get_recent_posts( $num_posts = '',
  $format = "%post_URL%<BR>%post_date%<BR>%post_categories_URL%",
  $categories = '30',
  $orderby= 'date',
  $order = 'DESC',
  $offset = 0,
  $date_format = 'Y年m月d日',
  $authors = '',
  $post_type = 'post',
  $post_status = 'publish',
  $include_passworded_posts = false ); 
}
?>

CPLをrunPHPと頻繁に使用するサイトでは以上のような安全装置を組み込んだスクリプトを規定テンプレートとして使用することをお勧めいたします。もちろん安全スクリプトがなくても通常の運営(プラグインを停止させない限り)には支障はありません。

既存の安全スクリプト(分離タグの形態)でも、テンプレート・ファイル(index.phpなど)内で使用する場合にはなんの不具合も発生しません。

[追記](2009年9月30日)
runPHPに代わるPHP Executionというプラグインを見つけました。このプラグインは、分離タグを使用してもrunPHPのような”Parse Error”を出すこともありませんし、使い勝手の面でも優れています。Linux系のサーバーでWordpressを稼動している方はこのプラグインへの移行をお勧めいたします。詳しくは次の記事を参照してください。
ページでPHPの実行を可能にするプラグイン-PHP execution


関連記事



コメントを残す