pict-drupal.png Drupalで外部PHPプログラム(CGI)を使う場合に知っておくと便利なtipsを紹介します。

CGIのような外部プログラムをDrupalと一緒に使用する場合で、かつそのプログラムからDrupalのデータベースや関数にアクセスしたいような場合に今から紹介する方法を使うことができます。

まず、外部PHPプログラムはそのままではdb_query()などのDrupalのAPIを使ってデータベースにアクセスすることはできません。その為には以下のようなコードを外部PHPプログラムの先頭に追加する必要があります。

  1. $current_dir = getcwd(); // 現在のディレクトリを記憶
  2. chdir('drupalのディレクトリへのパス');
  3. include_once './includes/bootstrap.inc';
  4. drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE);
  5. chdir($current_dir); // 元のディレクトリに戻る
この中で2行目のchdir()のパラメータには自分のサーバのDrupalのインストールされているディレクトリの絶対パスもしくは実行する外部PHPプログラムから見たDrupalディレクトリへの相対パスを指定します。

また、外部プログラムの場合、Drupalが設定するグローバルに動作を依存する一部の関数はコールすることはできても正常に動作しない場合があります。この例としてvariable_get()があります。

variable_get()はデータベースにアクセスせずにすでにグローバル変数にコピーしてある変数の値を返しますので、外部PHPプログラムからコールした場合には当然そのグローバルにはアクセスできませんのでそのままでは正しく動作しません。variable_get()を使ってDrupalモジュールの設定などを取得したい場合には以下のようにします。

本当はこうしたい
  1. $setting = variable_get('mymodule_setting', 0);
こうすれば大丈夫
  1. $result = db_query("SELECT value FROM {variable} WHERE name='mymodule_setting'");
  2. $setting = unserialize(db_result($result));

上記のサンプルコードのうち、bootstrap.incをインクルードし、drupal_bootstrap()をコールする部分ですが(下記参照)、これでデータベース関係の関数(Drupal Database API)や基本関数(Core API)等の主なAPIは使えるようになりますが、使えないAPIもありますので、必要に応じて、この部分に他のCOREモジュールファイルやインクルードファイルを追加する必要があるかもしれません。実行してみてundefined function callというエラーになった時にはその関数がどこに存在するかを調べて適当なファイルをインクルードするしましょう。
  1. include_once './includes/bootstrap.inc';
  2. drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE);

 

あなたの評価: なし 平均: 5 (1 vote)