スタッフブログ
なおとです。
古い話になるのですが、今年の4月にあった第32回PHP勉強会で知ったことを、最近になって活用しました。ためになったのでそれを紹介したいと思います。 ベイエリア情報局「ライブラリが直接実行された場合はプログラムとして実行する」(btoさん)です。
前回私が書いたブログ記事の続きでもあるのですが、作りたい機能がXOOPSの中での処理だけでなく、CRON経由でCLI(コマンドラインインターフェイス)のphpを併用することがあります。
例えばなにかメールを送る機能があったとして、その場で送るのと、あとから非同期に(CRONから叩いて)送る場合と、2パターンがあるとします。 具体的な処理としては「送るメールの文面をつくる」「メールを送る」など、共通しています。XOOPSではPHPMailerというライブラリを使って送信する機能が盛り込まれているので、できるだけそれを使います。 ただし直接利用するだけでなく、ビジネスロジック側にすり寄せた、使いやすいようなインターフェイス(独自のクラス)を通して使ったりします。 これには、送信の記録を含むアプリケーション・ログを記録する部分を実装したります。
ここからはやり方次第なのですが、クラスを書いた部分以外に、同じファイルを読み込んで処理するような作りになる場合もあります。 例を具体的に挙げると、あるモジュールのアクションとして使われているスクリプトを、CLIからも呼び出すようなやり方です。
その中身は例えばなのですが、簡略化するとだいたいこんな感じになります。<?php global $xoopsOption, $xoopsConfig, $xoopsDB, $xoopsUser, $xoopsModule; if (check_exec($argv)) { $xoopsOption['nocommon'] = 1; require_once dirname(dirname(__FILE__)) . '/public_html/mainfile.php'; $mydirname = basename(dirname(dirname(__FILE__))); $mydirpath = XOOPS_ROOT_PATH . '/modules/' . $mydirname; $mydirurl = XOOPS_URL . '/modules/' . $mydirname; require_once $mydirpath . '/mytrustdirname.php'; // set $mytrustdirname $mytrustdirpath = XOOPS_TRUST_PATH . '/modules/' . $mytrustdirname; $root =& XCube_Root::getSingleton(); $root->mController->executeCommonSubset(); } if (!defined('XOOPS_TRUST_PATH')) die('set XOOPS_TRUST_PATH in mainfile.php'); // mail送信など実際の処理(省略) $mail = new MyMail($mydirname); (snip) function check_exec($argv) { // コマンドラインか判別する // HTTPD経由だと$argvは未定義 if (isset($argv[0]) and (__FILE__ === realpath($argv[0]))) { return TRUE; } return FALSE; } ?>
私の中ではこの辺の「これ」というノウハウはまだ持てていなくて、試行錯誤をしながら(つまったりして)開発しています。 面白味がある部分です。
ちょっとしたことなのですが、さっと検索してパッと見つかって、それが使えると分かればどんどん使うのが、できるエンジニアだと思います。
まとまりのない感じですが、そんなことがありました。