coreserverにおいてcronでwp.xmlrpcクラスを使おうとしたら苦労した話


以前、 CORESERVERでCRONを使う方法と言うことで、起動の仕方は把握していたのですが、
今回、ワードプレスへ投稿するwp.xmlrpcクラスを使用しようとしたところ、
盛大に苦労してしまったので、その記録です。


【とっても便利】WordPressの記事投稿できるクラス『wp.xmlrpc.php』【自動投稿】

ブラウザでphpのアドレスにを開いて起動するのと、cronで起動するのとでは、カレントディレクトリが異なる

まず認識が甘かったのが、他のファイルを読み込む際のパスの書き方。
相対パスで書いてしまっており、読み込みがうまくいかないケースがありました。
基本は絶対パスで書くことですので、下記のphpでまずはパスを知ることが重要です。

<?php
//絶対パス
echo __FILE__ . '<br />';
//ディレクトリパス
echo dirname(__FILE__) . '<br />';
//スクリプト名
echo basename(__FILE__) . '<br />';
//指定した拡張子を取り除いたスクリプト名
echo basename(__FILE__, '.php');
?>

参考リンク
PHPプログラムにブラウザでアクセスすると実行されるが、cronで実行できない
PHP の include, require で相対パスを指定して読み込む場合のメモ
http://shoyu-ramen23.jugem.jp/?eid=103

coreserverのphpバージョンとwp.xmlrpcのphpバージョン

次につまずいたのが、phpのバージョンです。
wp.xmlrpcはphp5.3から出ないと動かないことを失念しており、
coreserverのデフォルトはphp5.2だったために、クラスが無いと怒られてしまいました。
Class ‘FInfo’ not found
phpinfoでバージョンの確認はしっかりしないといけません。

<?php
phpinfo();
?> 
そのうえで、coreserverでは.htaccessにphpバージョンを記述する必要があります。
AddHandler application/x-httpd-php53cgi .php
⇒「.php」をCGI版PHP5.3として動かす

cronで起動する場合のphpバージョン

上記を修正して動くか思いきや、動かず。
原因は、
cronのシェルスクリプトで起動させると、.htaccessで記述したphpバージョンで動いてくれないと言う点です。

ブラウザから起動する場合は、.htaccessの記述に従ったphpバージョンで起動するのですが、cronで動かすために用意するシェルスクリプトは、
.htaccessの記述にはしたがわず、シェルスクリプトに記述されたバージョンで起動する点です。
コアサーバーのシェルスクリプトの記述例は以下のようになっています。

#PHP
/usr/local/bin/php /virtual/resv/cron_exe.php
exit

ですが、このままで記述するとphp5.2で動いてしまいます。
5.3で動かす場合は、書きようにする必要があります。

#PHP
/usr/local/bin/php53 /virtual/resv/cron_exe.php
exit

こんな記述がまったく見つからず、数日を無駄にしてしまいました。


まとめ

includeを行う場合は、絶対パスで記述する。
phpのバージョンを調べておく。
シェルスクリプトの記述は気を付ける。


参考リンク

cronでPHPを叩くときにハマったことをまとめておきます
エックスサーバーのcronでPHPを動かす方法&間違いやすい部分まとめ
PHPプログラムにブラウザでアクセスすると実行されるが、cronで実行できない
xreaでcronを使ってバッチ処理(定時処理)する方法のまとめ エックスサーバーのcronでPHPを動かす方法&間違いやすい部分まとめ
cronからPHPを実行する