wiki:pne-book-9-1
 ここの情報は古いです。ご理解頂いた上でお取り扱いください。

Version 12 (modified by imoto, 13 years ago) (diff)

--

ディレクトリツアー

解説:海老原
文:井本

概要

ディレクトリツアーではOpenPNEのディレクトリ構造を見ていきます。
現在のOpenPNE2.0系は独自のフレームワークを採用しています。
よってディレクトリ構造も独自の構成をしています。
今回は、trac.openpne.jpのtrunkを参照しながら解説を行っていきますのでディレクトリはアルファベット順になっているので、解説も上からアルファベット順に解説していきます。

それでは、主要なディレクトリを網羅しながら、OpenPNEのディレクトリを見ていきましょう。

OpenPNE trunk
http://trac.openpne.jp/browser/OpenPNE/trunk

root

root/

bin/
lib/
public_html/
setup/
var/
webapp/
webapp_biz/
webapp_ext/
config.php.sample
LICENSE

まずはじめに、rootディレクトリです。
このrootディレクトリはOpenPNEのディレクトリの中で一番上の階層です。
OpenPNEをダウンロードして解凍したり、trac.openpne.jpのtrunkをみるとこのような構造になっていると思います。
ここには、いろいろなディレクトリがあります。それぞれディレクトリについて後ほど詳しく解説するのでここでは割愛します。

このrootディレクトリにはその他に、二つのファイルがあります。一つがconfig.php.sampleという設定ファイルです。もう一つはLICENSEファイルです。

簡単に2つのファイルについて説明すると、config.php.sampleは通常config.phpとリネームしてOpenPNEの設定ファイルとして使用します。この設定ファイルには、データベースの設定から、OpenPNEのAPI設定までさまざまな設定項目があります。詳しくは、実際にconfig.php.sampleを確認してみてください。各項目にはコメントがあるのでコメントを読めば分かると思います。

config.php.sample


<?php
//// サーバー管理設定 ////

//--- 必須設定

// Web上の絶対パス(URL)(最後にスラッシュを付けてください)
define('OPENPNE_URL', 'http://sns.example.com/');

// DBサーバ設定
$GLOBALS['_OPENPNE_DSN_LIST']['main'] = array(
'dsn'  => array(
    'phptype'  => 'mysql',
    'username' => '',
    'password' => '',
    'hostspec' => 'localhost',
    'database' => '',
    'new_link' => false,
    ),
);

// DB暗号化キー(56バイト以内のASCII文字列)
define('ENCRYPT_KEY', '');

// メールサーバードメイン
// 携帯メール投稿の宛先などのドメイン名に使われる
define('MAIL_SERVER_DOMAIN', 'mail.example.com');


//--- オプション設定

// デバッグモード
// 0: off ... エラー非表示、エラーログを記録する
// 1: on  ... エラー表示、エラーログを記録しない
// 2: on  ... 1 + Smartyデバッグコンソール 
define('OPENPNE_DEBUGGING', 1);

// 無効にするモジュール
//$GLOBALS['_OPENPNE_DISABLE_MODULES'] = array('admin', 'setup');

// メンテナンスモード
// メンテナンスモードではデイリーメール配信やメール投稿機能も無効になります
// true: ユーザーにメンテナンス画面を表示
define('OPENPNE_UNDER_MAINTENANCE', false);

// メンテナンス画面に表示させるテキスト
// HTMLが使用できます
// 未入力の場合は、標準のテキストが表示されます
define('OPENPNE_MAINTENANCE_TEXT', '');

// メンテナンス中でも表示するモジュール名
$GLOBALS['_OPENPNE_MAINTENANCE_MODULES'] = array('admin');

// Crypt_Blowfish ライブラリの旧バージョン使用設定
// 2.2以前からのアップグレードでログインできないなどの
//暗号化まわりの不具合が起こった場合はtrueに設定してください
define('OPENPNE_USE_OLD_CRYPT_BLOWFISH', false);

// ファンクションキャッシュ使用設定
//有効にした場合は、最新情報の表示に遅延が起こることがあります
define('OPENPNE_USE_FUNCTION_CACHE', false);

// このオプションを有効にするためにはOPENPNE_USE_FUNCTION_CACHEをtrueにする必要があります。
// ファンクションキャッシュのキャッシュを保存するストレージにmemcacheを使用
define('OPENPNE_USE_FUNCTION_CACHE_MEMCACHE', false);

// OPENPNE_USE_FUNCTION_CACHE_MEMCACHEがtrueの場合の
// ファンクションキャッシュ用memcacheサーバ設定
$GLOBALS['_OPENPNE_MEMCACHE_LIST']['func_cache'] = array(
'dsn' => array(
    'hostspec' => '127.0.0.1',
    ),
);

// MySQL ヒント使用設定
define('OPENPNE_USE_MYSQL_HINT', true);

// セッション情報を保存するストレージ
// 0:ファイル
// 1:データベース
// 2:memcache(要PECL::memcache)
define('SESSION_STORAGE', 0);

// 確認画面用の一時画像をDBに保存するかどうか
define('OPENPNE_TMP_IMAGE_DB', false);

// 確認画面用の一時ファイルをDBに保存するかどうか
define('OPENPNE_TMP_FILE_DB', false);

///
// DBサーバ設定
///

// メインデータ読み込み用DB(オプション)
//$GLOBALS['_OPENPNE_DSN_LIST']['main_reader'][] = array(
//'priority' => 1,
//'dsn' => array(
//    'phptype'  => 'mysql',
//    'username' => '',
//    'password' => '',
//    'hostspec' => 'localhost',
//    'database' => '',
//    'new_link' => false,
//    ),
//);
//$GLOBALS['_OPENPNE_DSN_LIST']['main_reader'][] = array(
//'priority' => 1,
//'dsn' => array(
//    'phptype'  => 'mysql',
//    'username' => '',
//    'password' => '',
//    'hostspec' => 'localhost',
//    'database' => '',
//    'new_link' => false,
//    ),
//);

// セッションデータ保存用DB(オプション)
//$GLOBALS['_OPENPNE_DSN_LIST']['session'] = array(
//'dsn' => array(
//    'phptype'  => 'mysql',
//    'username' => '',
//    'password' => '',
//    'hostspec' => 'localhost',
//    'database' => '',
//    'new_link' => false,
//    ),
//);

// セッションデータ保存用Memcache(オプション)
$GLOBALS['_OPENPNE_MEMCACHE_LIST']['session'] = array(
'dsn' => array(
    'hostspec' => '127.0.0.1',
    ),
);

// 画像データ保存用DB(オプション)
//$GLOBALS['_OPENPNE_DSN_LIST']['image'] = array(
//'dsn' => array(
//    'phptype'  => 'mysql',
//    'username' => '',
//    'password' => '',
//    'hostspec' => 'localhost',
//    'database' => '',
//    ),
//);

///
// SSL設定
///

// 特定ページだけのSSLを使用するかどうか
define('OPENPNE_USE_PARTIAL_SSL', false);

// SSL使用状況をリクエストパラメータから取得するかどうか
define('OPENPNE_USE_SSL_PARAM', false);

// SSL用URL (Cookieの値を引き継ぐため、OPENPNE_URL と同一ドメイン・パスである必要があります)
define('OPENPNE_SSL_URL', 'https://sns.example.com/');

// SSLを使用することが必須であるモジュールリスト
$GLOBALS['_OPENPNE_SSL_REQUIRED_MODULES'] = array('admin');

// SSLを使用することが必須であるアクションリスト
$GLOBALS['_OPENPNE_SSL_REQUIRED'] = array(
'pc' => array(
    'page_o_regist_prof',  'page_o_regist_prof_confirm', 'do_o_regist_prof',
    'page_o_regist_intro', 'page_o_ri', 'page_o_regist_end',
    'page_h_config_prof', 'page_h_config_prof_confirm', 'do_h_config_prof',
    'page_h_config_ktai', 'do_h_config_ktai_send',
    'page_h_config', 'do_h_config_1', 'do_h_config_2', 'do_h_config_3',
    'page_o_login', 'page_o_tologin', 'do_o_login',
    'page_o_public_invite','do_o_public_invite',
    'page_h_invite','page_h_invite_confirm','do_h_invite_insert_c_invite',
    'page_o_password_query','do_o_password_query',
),
'ktai' => array(
    'page_o_login', 'do_o_login', 'do_o_easy_login',
    'page_o_login2', 'do_o_update_ktai_address',
    'page_o_regist_pre', 'page_o_regist_input', 'do_o_insert_c_member',
    'page_o_regist_end',
    'page_o_password_query', 'do_o_password_query',
    'page_h_config_prof', 'do_h_config_prof_update_c_member',
    'page_h_config_easy_login', 'do_h_config_easy_login',
    'page_h_config_mail', 'do_h_config_mail_insert_c_ktai_address_pre',
    'page_h_pc_send', 'page_h_pc_send_confirm', 'do_h_pc_send_insert_c_pc_address_pre',
    'page_h_config_password_query', 'do_h_config_password_query_update_password_query',
    'page_h_config_password', 'do_h_config_password_update_password',
    'page_h_config', 'page_h_invite', 'do_h_invite_insert_c_invite',
));

// SSLを使用するかどうかをユーザーが選択できるアクションリスト
$GLOBALS['_OPENPNE_SSL_SELECTABLE'] = array(
'pc' => array(
),
'ktai' => array(
));

///
// パス設定
///

define('OPENPNE_LIB_DIR'    , OPENPNE_DIR . '/lib');
define('OPENPNE_VAR_DIR'    , OPENPNE_DIR . '/var');
define('OPENPNE_WEBAPP_DIR' , OPENPNE_DIR . '/webapp');
define('OPENPNE_MODULES_DIR', OPENPNE_WEBAPP_DIR . '/modules');
define('OPENPNE_RSS_CACHE_DIR', OPENPNE_VAR_DIR . '/rss_cache');
define('OPENPNE_PUBLIC_HTML_DIR', OPENPNE_DIR . '/public_html');

///
// webapp_ext ディレクトリ使用設定
///

define('USE_EXT_DIR', false);
define('OPENPNE_WEBAPP_EXT_DIR' , OPENPNE_DIR . '/webapp_ext');
define('OPENPNE_MODULES_EXT_DIR', OPENPNE_WEBAPP_EXT_DIR . '/modules');

///
// webapp_biz ディレクトリ使用設定
//
// BIZ使用設定は管理画面に移動しました
// define('USE_EXT_DIR', false);
define('OPENPNE_WEBAPP_BIZ_DIR' , OPENPNE_DIR . '/webapp_biz');
define('OPENPNE_MODULES_BIZ_DIR', OPENPNE_WEBAPP_BIZ_DIR . '/modules');

///
// デバッグ、エラーハンドリング、ログ設定
///

error_reporting(E_ALL ^ E_NOTICE);

switch(OPENPNE_DEBUGGING) {
// テスト開発環境
case 2:
    $GLOBALS['SMARTY']['debugging'] = true;
case 1:
    ini_set('display_errors', true);
    ini_set('log_errors', false);
    break;
// 本番運用環境
case 0:
default:
    ini_set('display_errors', false);
    ini_set('log_errors', true);
    ini_set('error_log', OPENPNE_VAR_DIR . '/log/php_errors.log');
    break;
}

// アクセスログを取得するかどうか(c_access_log)
define('LOG_C_ACCESS_LOG', true);

// カスタムログ用の関数名を指定します
define('OPENPNE_LOG_FUNCTION', '');

///
// セッション・クッキー設定
///

ini_set('session.gc_probability',1);
ini_set('session.gc_divisor',10000);

ini_set('session.gc_maxlifetime', 432000); // 5 days
//session_save_path('/tmp');

// PC版
// セッション生成時からの有効期限(秒) (0 の場合は無期限)
$GLOBALS['OpenPNE']['common']['session_lifetime'] = 0;
// セッションの有効期限(秒)
$GLOBALS['OpenPNE']['common']['session_idletime'] = 432000; // 5 days

// 携帯版
// セッション生成時からの有効期限(秒) (0 の場合は無限)
$GLOBALS['OpenPNE']['ktai']['session_lifetime'] = 0;
// セッションの有効期限(秒)
$GLOBALS['OpenPNE']['ktai']['session_idletime'] = 3600; // 1 hour

// 管理画面版
// セッション生成時からの有効期限(秒) (0 の場合は無限)
$GLOBALS['OpenPNE']['admin']['session_lifetime'] = 0;
// セッションの有効期限(秒)
$GLOBALS['OpenPNE']['admin']['session_idletime'] = 86400; // 1 day

// セッションにOPENPNE_URLを保存しておく
// 同一サーバ上で複数のSNSを運用する場合のセッションの混同を防ぐ
// falseからtrueにした場合、または2.4RC1以前のバージョンからアップデートした場合
// それまでのセッションが無効になりログアウトされます
define('OPENPNE_SESSION_CHECK_URL', true);

///
// 画像
///

// 画像を別サーバに設定する場合に指定する
//define('OPENPNE_IMG_URL', 'http://img.example.com/');

//// 画像サーバ用設定 ////
//define('OPENPNE_IS_IMG_SERVER', false);

// 画像キャッシュをpublic_html以下に置くかどうか(要mod_rewrite)
define('OPENPNE_IMG_CACHE_PUBLIC', false);

// 画像キャッシュディレクトリ(要書き込み権限)
if (OPENPNE_IMG_CACHE_PUBLIC) {
    define('OPENPNE_IMG_CACHE_DIR', OPENPNE_PUBLIC_HTML_DIR . '/img');
} else {
    define('OPENPNE_IMG_CACHE_DIR', OPENPNE_VAR_DIR . '/img_cache');
}

// 画像変換時に許可する解像度のリスト (幅x高さ)
// (空の配列を指定すると無制限になります)
$GLOBALS['_OPENPNE_IMG_ALLOWED_SIZE'] = array('76x76', '120x120', '180x180', '240x320');

// 画像キャッシュのファイル名のprefix
define('OPENPNE_IMG_CACHE_PREFIX', 'img_cache_');

// 画像変換後のJPEGのQUALITY値
define('OPENPNE_IMG_JPEG_QUALITY', 75);

// ImageMagick使用設定
// 0: off ... ImageMagickを使わない
// 1: on  ... GIFのみImageMagickを使う
// 2: on  ... JEPG,PNG,GIFにImageMagickを使う(ただし、GDも必要)
define('USE_IMAGEMAGICK', 0);

// ImageMagick の convertコマンドのパス
define('IMGMAGICK_APP', '/usr/bin/convert');
//define('IMGMAGICK_APP', '"C:\Program Files\ImageMagick-6.2.5-Q16\convert"');

// ImageMagick のオプション(デフォルトは -resize)
//define('IMGMAGICK_OPT', '-thumbnail');

// アップロード画像のファイルサイズ制限(KB)
define('IMAGE_MAX_FILESIZE', 300);

// アップロード画像の大きさ制限(ピクセル)
// 0 を指定した場合は無制限
define('IMAGE_MAX_WIDTH', 0);
define('IMAGE_MAX_HEIGHT', 0);

// 携帯版「大」サイズ画像表示時の解像度制限
// ($GLOBALS['_OPENPNE_IMG_ALLOWED_SIZE'] で許可された解像度を指定してください)
define('OPENPNE_IMG_KTAI_MAX_WIDTH', 240);
define('OPENPNE_IMG_KTAI_MAX_HEIGHT', 320);

///
// ファイルアップロード機能
///

// ファイルアップロード機能を使用するかどうか
define('OPENPNE_USE_FILEUPLOAD', false);

// アップロードファイルのファイルサイズ制限(KB)
define('FILE_MAX_FILESIZE', 300);

// 許可する拡張子のリスト(カンマ(,)区切り)
// 未指定の場合は全て許可
//define('FILE_ALLOWED_EXTENTIONS', 'pdf,xls,ppt,zip');
define('FILE_ALLOWED_EXTENTIONS', '');

///
// 外部RSS取得
///

// 一度に取得するRSSの件数
define('RSS_CACHE_LIMIT', 100);

///
// 携帯メール投稿
///

// 宛先メールアドレスのprefix
//define('MAIL_ADDRESS_PREFIX', 'sns_');

// 宛先メールアドレスをハッシュにするか
define('MAIL_ADDRESS_HASHED', true);

// 受信メールの文字コード(Content-Typeから取得できない場合に使う)
//define('MAIL_FROM_ENCODING', 'JIS');
define('MAIL_FROM_ENCODING', 'auto');

// メールログを取るかどうか(var/log/mail.log)
define('MAIL_DEBUG_LOG', false);

///
// メール送信設定
///

// 半角カタカナを全角カタカナに変換して送信する
define('MAIL_HAN2ZEN', true);

// MTAに渡すヘッダの改行コード(LF->CRLF の自動変換が行われることへの対策)
//define('MAIL_HEADER_SEP', 'CRLF');
define('MAIL_HEADER_SEP', 'LF');

// Envelope-From ヘッダを設定するかどうか(safe_mode の場合は false に設定してください)
define('MAIL_SET_ENVFROM', true);

// Envelope-From で設定するメールアドレス
//(指定しない場合は、管理者メールアドレス(Fromと同じ))
//define('MAIL_ENVFROM', 'system@example.com');

///
// mbstring設定
///

mb_language('Japanese');
ini_set('mbstring.detect_order', 'auto');
ini_set('mbstring.http_input'  , 'auto');
ini_set('mbstring.http_output' , 'pass');
ini_set('mbstring.internal_encoding', 'UTF-8');
ini_set('mbstring.script_encoding'  , 'UTF-8');
ini_set('mbstring.substitute_character', 'none');
mb_regex_encoding('UTF-8');
mb_substitute_character("long");
mb_substitute_character(0x3013);

// Validatorで全角スペースを削除するかどうか
// mb_ereg_replace でエラーが出る場合は false にしてください
define('OPENPNE_TRIM_DOUBLEBYTE_SPACE', true);

///
// API通信設定
///

// API通信使用設定
define('OPENPNE_USE_API', false);

// セッション鍵生成用文字列(適当な文字列に変更してください)
define('OPENPNE_API_TOKEN', 'OpenPNE');

// クライアントのIPアドレスのあるサーバ変数名($_SERVER['REMOTE_ADDR'])
//define('SERVER_IP_KEY', 'HTTP_X_FORWARDED_FOR');
define('SERVER_IP_KEY', 'REMOTE_ADDR');

///
// HTTPプロキシ設定
///

// HTTPプロキシ使用設定
define('OPENPNE_USE_HTTP_PROXY', false);

// プロキシのホスト名
define('OPENPNE_HTTP_PROXY_HOST', 'proxy.example.com');

// プロキシのポート番号
define('OPENPNE_HTTP_PROXY_PORT', 8080);

///
// memory_limit設定
///
// ini_set('memory_limit','32M');

///
// umask設定
///

umask(0);

///
// Google Maps API key
// http://www.google.com/apis/maps/ から取得
///
define('GOOGLE_MAPS_API_KEY', '');

///
// Google AJAX Search API key
// http://code.google.com/apis/ajaxsearch/signup.html  から取得
///
define('GOOGLE_AJAX_SEARCH_API_KEY', '');

//// SNSアプリケーション設定 ////

// 管理画面のURL設定
//(OPENPNE_URL)?m=ADMIN_MODULE_NAME (例. http://sns.example.com/?m=admin)
define('ADMIN_MODULE_NAME', 'admin');

// 管理画面にバージョン情報を表示するかどうか
define('DISPLAY_VERSION', true);

// ダッシュボードで表示するOpenPNE情報のURL設定
// URLを空にするとダッシュボードが非表示になります
define('OPENPNE_DASHBOARD_URL', 'http://ad.pne.jp/dashboard/');

// 天気予報ページのURL設定
define('OPENPNE_WEATHER_URL', 'http://weather.yahoo.co.jp/weather/');

// 携帯版でUser-Agentのチェックをするかどうか
define('CHECK_KTAI_UA', true);

// 携帯版でIP制限機能を使用するかどうか
// IPリストは webapp/lib/ktaiIP.php
define('CHECK_KTAI_IP', false);

// メール一斉送信のメールキューの使用
define('OPENPNE_MAIL_QUEUE', false);
// メールキューで一度に送信するメールの数
define('SEND_MAIL_QUEUE_NUM', 10);

// メッセージ一斉送信のメッセージキューの使用
define('OPENPNE_MESSAGE_QUEUE', false);
// メッセージキューで一度に送信するメッセージの数
define('SEND_MESSAGE_QUEUE_NUM', 10);

// CAPTCHA(画像のなかの文字列をメンバーに入力させる認証方式)を使用するかどうか
define('OPENPNE_USE_CAPTCHA', true);

// 認証モード設定
//  email    : メールアドレスとパスワードによるログイン
//  pneid    : IDとパスワードによるログイン
//  slavepne : 外部認証(SlavePNE機能)を使ったログイン
define('OPENPNE_AUTH_MODE', 'email');

// 外部認証時にメールアドレス登録を必須にするかどうか
define('IS_SLAVEPNE_EMAIL_REGIST', true);

// 招待メールに記載するURL
define('SLAVEPNE_SYOUTAI_URL_PC', '');
define('SLAVEPNE_SYOUTAI_URL_KTAI', '');

// OPENPNE_AUTH_MODE がslavepneの場合のauthオプション
$GLOBALS['_OPENPNE_AUTH_CONFIG'] = 
array(
'storage'=>"DB",
'options'=>array(
    'dsn'         => array(
        'phptype'  => 'mysql',
        'username' => 'root',
        'password' => '',
        'hostspec' => 'localhost',
        'database' => '',
        'new_link' => true,
        ),
    'table'       => '',
    'usernamecol' => 'username',
    'passwordcol' => 'password',
    'cryptType'   => 'none',
    ),
);

//画像へのアクセスをSNS認証する
//※画像静的化機能を用いている場合は利用できません
define('CHECK_IMG_AUTH', false);

// PC表示時にau/SoftBankの絵文字をDoCoMo絵文字に変換するかどうか
// au/SoftBankの絵文字を使用するには、 public_html/skin/default/img/emoji/{e|s} に画像を用意する必要があります
define('OPENPNE_EMOJI_DOCOMO_FOR_PC', true);

// ページのキャッシュをさせないヘッダを送信するかどうか
// ただしau端末の場合はこの設定にかかわらず、常に「ページのキャッシュをさせないヘッダ」が送信されます
define('OPENPNE_SEND_NO_CACHE_HEADER', false);

// 管理画面でURL・小窓変換機能を使用するかどうか
define('OPENPNE_ADMIN_CONVERT_URL', true);

//OpenIDのプロバイダとなるかどうか 
define('IS_OPENID_PROVIDER', false); 

//OpenIDの乱数用定義 
define('Auth_OpenID_RAND_SOURCE', NULL); 

?>

このrootディレクトリの特徴としては、WordPressやXOOPSのように、rootディレクトリにあるphpファイルが多くないことが特徴です。また、index.phpがこのディレクトリにないのも特徴です。これは、公開ディレクトリを、後ほど説明するpubic_htmlだけに限定しているため、このrootディレクトリはWebサーバの公開範囲外なので、index.phpがないという特徴を持っています。 それではまず、binディレクトリから詳しく見ていこうと思います。

WordPress Japan
http://wordpress.xwd.jp/

XOOPS Cube日本サイト
http://xoopscube.jp/

bin

root/bin/

config.inc.php
mail.php
tool_ashiato_update_log.cron
tool_ashiato_update_log.php
tool_rss_cache.cron
tool_rss_cache.php
tool_send_birthday_mail.cron
tool_send_birthday_mail.php
tool_send_daily_news.cron
tool_send_daily_news.php
tool_send_dairy_news.cron
tool_send_mail_in_queue.cron
tool_send_mail_in_queue.php
tool_send_message_in_queue.cron
tool_send_message_in_queue.php
tool_send_schedule_mail.cron
tool_send_schedule_mail.php
tool_vacuum_exec.cron
tool_vacuum_exec.php

このbinディレクトリはアプリケーションの動作には依存していない、単体で動作するスクリプトが入っています。 binの中には2種類のファイルタイプがあります。一つ目はcronで、もう一つはPHPです。 基本的にこのcronファイルは同名のPHPファイルと対になって存在しています。 もう一つは、実際に携帯の写メール投稿や、RSSの取得などの処理を行うPHPファイルです。

このbinディレクトの中に、cronとPHPファイルが対でないファイルが2つあります。その2つのファイルととはconfig.inc.phpとmail.phpです。簡単にこの2つのファイルについて解説します。

まず、config.inc.phpは中を見ると分かりますが、root以下にあるconfig.phpを読み込む処理が書いています。 このconfig.inc.phpはそれぞれ単体で動くスクリプトにOpenPNEの設定やパスを教えるためのものです。

config.inc.php

<?php
/**
* @copyright 2005-2008 OpenPNE Project
* @license   http://www.php.net/license/3_01.txt PHP License 3.01
*/

define('OPENPNE_DIR', realpath('../'));
require_once OPENPNE_DIR . '/config.php';

?>

次に、mail.phpですが、これはcatch allというメールサーバの機能を利用してこのmail.phpにメールの本文を渡すことで動作しています。 mail.phpがメールの本文などを受け取ったら、このmail.phpでメール本文を読み込み、それぞれの処理を判断しています。 このmail.phpはメールを受信したときに動作するので、対のcronファイルがないということになります。

lib

root/lib/

include/
smarty_plugins/
README.txt

それでは次に、rootディレクトリ直下にあるlibディレクトリを見ていきましょう。
このlibディレクトリの中には、includeディレクトリとsmarty_pluginsディレクトリがあります。このlibディレクトリには外部のライブラリが入っています。具体的にはPEARのライブラリなどが入っています。

このlib直下のREADME.txtにも書いていますが、このライブラリを使用する際に注意が必要なことがあります。
それは、OpenPNEはPHPライセンスですが、このlib直下のライブラリは必ずしもPHPライセンスではないということです。ですので、使用する際には十分注意が必要です。
ただし、あくまでPHPライセンスで使用できるライセンスのライブラリで、GPLなど縛りの強いライセンスは同梱していないので、PHPライセンスであれば使用しても大丈夫です。

include

root/lib/include/

Auth/
Cache/
Calendar/
Crypt/
Date/
DB/
HTTP/
kcaptcha/
Log/
Mail/
Net/
PHP/
Services/
Smarty/
XML/
Auth.php
Cache.php
Date.php
DB.php
Etag.php
Log.php
Mail.php
PEAR.php
simplepie.inc
Snoopy.class.php

このincludeディレクトリは、外部のライブラリでOpenPNEに欠かせないライブラリが揃っています。
このincludeディレクトリの特徴としては、このincludeディレクトリはインクルードパスに指定されていますので、ライブラリ名を指定して読み込むだけでファイルを読み込むことが出来ます。
全体的にこのライブラリ群を見ると、このincludeディレクトリはの中に含まれるライブラリはほぼPEARのライブラリです。

この中でも主要なディレクトリや特徴のあるライブラリについて解説していきます。

まず、一番上のAuthディレクトリですが、OpenPNEの認証系には欠かせないライブラリが入っています。
このAuthディレクトリの中でも、ContainerディレクトリはSlavePNEを実現するためのライブラリ群が入っています。SlavePNEはこのPEAR_Authを使って実現しているので、どのような認証系が使えるかどうかが知りたければ、この中のContainerディレクトリを見てみるのもいいと思います。

root/lib/include/Auth/Container/

Array.php
DB_osc.php
DB.php
DBLite.php
File.php
IMAP.php
KADM5.php
LDAP.php
MDB.php
MDB2.php
Multiple.php
PEAR.php
POP3.php
RADIUS.php
SAP.php
SMBPasswd.php
SOAP.php
SOAP5.php
vpopmail.php

DBディレクトリもOpenPNEでは積極的に読み込んで使用しています。
OpenPNEはこのPEAR_DBに依存しているので、このライブラリ群がなければデータベースの操作はできません。

SmartyディレクトリはOpenPNEのテンプレートに使用しているテンプレートエンジンのライブラリ群が入っています。OpenPNEではこのSmartyに独自の拡張クラスを作成しているのですが、ベースはこのincludeディレクトリ以下のSmartyディレクトリに入っています。

ファイルの中に、simplepie.incというファイルがあります。
OpenPNEは現在のPHPライセンスにする前はGPLライセンスというライセンス形態をとっていました。RSS取得のためのライブラリにMagpieRSSを使っていたのですが、MagpieRSSがGPLライセンスなので、PHPライセンスにすることが出来ませんでした。そこで、OpenPNE2.3.0にするときに、このsimplepieというライブラリに変更したという経緯があります。

 PEAR
 http://pear.php.net/
 
 Smarty
 http://www.smarty.net/
 
 Simplepie
 http://simplepie.org/

smarty_plugins

root/lib/smarty_plugins/
    
modifier.date_format.php

このsmarty_pluginsディレクトリは先ほど説明したSmartyのプラグインのためのディレクトリです。 しかし、現状はmodifier.date_format.phpというファイルしか入っていません。 このファイルはSmartyで日付を扱う時に必要なので同梱しています。

pubic_html

root/public_html/

cmd/
css/
flash/
img/
js/
modules/
skin/
cap.php
config.inc.php
img_skin.php
img.php
index.php

それでは、Webサーバの公開領域であるpubic_htmlディレクトリを見ていきましょう。
このpubic_htmlディレクトリはWebサーバから読み込まれるディレクトリなのでcssやjsなどがあります。詳しくは後ほど説明します。
また、このpubic_htmlは公開領域であるために注意が必要な場合があります。
このpubic_htmlディレクトリ以下のファイルはURLを直接入力された場合は誰でも見ることが出来るという特徴があります。
例えば、会員のみに公開したい資料などをここに置いた場合でも、会員でない人がURLを直接入力してアクセスした場合は見ることが可能なので注意が必要です。

このディレクトリにあるファイルを見ると、まずcap.phpがあります。このcap.phpはlib/includeディレクトリ以下にあるkcaptchaというライブラリを使うためにあります。
kcaptchaライブラリは招待メールを送るときや、新規登録の際にコンピュータが判別しにくい崩れた人間しか読めない文字の画像を表示するために使用しています。
次に、img.phpとimg_skin.phpがあります。この2つのファイルはデータベースから画像ファイルを読み込むためにあります。ブラウザ側から直接Webサーバにアクセスすることができないので、このimg.phpとimg_skin.phpがブラウザとデータベースの橋渡しになって画像ファイルのやり取りをしています。
img.phpとimg_skin.phpの違いは、通常の画像なのか、スキン用の画像なのかという違いがあります。具体的には、認証の部分が違います。通常の画像はタイムスタンプがついていますが、テンプレートからスキン画像を読み込む場合はそれが出来ないので、この様に2種類のファイルに分けて画像の受け渡しをしています。

最後に、index.phpというファイルがあります。OpenPNEでは、基本的にすべてこのindex.phpが読み込まれて処理が始まります。OpenPNEのフレームワークはフロントコントローラという形式をとっており、入り口はこのindex.php一つにまとめています。このindex.phpからすべての処理が始まります。
このindex.phpを見てみると非常にシンプルなソースコードになっています。
openpne_executeという関数がありますが、これはOpenPNEのコントローラを実行する関数です。このopenpne_executeにURLから受け取ったパラメータを渡してそれぞれのパラメータから処理を判断して実行しています。

index.php
    
<?php
/**
* @copyright 2005-2008 OpenPNE Project
* @license   http://www.php.net/license/3_01.txt PHP License 3.01
*/

require_once './config.inc.php';
require_once OPENPNE_WEBAPP_DIR . '/init.inc';

openpne_execute();

?>

cmd

root/public_html/cmd/

amazon.co.jp.js
blog-apart.com.js
blogcruiser.js
docune.jp.js
flipclip.net.js
grouper.com.js
jp.youtube.com.js
kakaku.com.js
livlyisland.js
maps.google.co.jp.js
maps.google.com.js
postpet.js
ppw.js
r.gnavi.co.jp.js
r.gnavi.co.jp.js.2
r.tabelog.com.js
slurl.com.js
sns_info.js
sonetphoto.js
tagfriends.js
video.google.com.js
vote.nifty.com.js
wajju.jp.js
watchme.js
www.amazon.co.jp.js
www.blog-apart.com.js
www.ebitv.jp.js
www.flipclip.net.js
www.google.co.jp.js
www.google.com.js
www.grouper.com.js
www.netprice.co.jp.js
www.nicovideo.jp.js
www.wajju.jp.js
www.watchme.tv.js
www.youtube.com.js
youtube.com.js
youtube.js

このcmdディレクトリは、OpenPNEの目玉機能でもある小窓機能を実現するためのJavaScriptは入っています。小窓には通常小窓形式(CMDタグ)、URL2CMD形式(URL)と2つの形式がありますが、どちらの形式で小窓が使用されても、このcmdディレクトリにあるJavaScriptが読み込まれます。
このcmdディレクトリにあるファイルはすべてJavaScriptです。そのため、Webサーバから読み込むことが出来る必要があるため公開ディレクトリに存在します。
cmdディレクトリにあるJavaScriptファイルの特長としては、ファイル名が「ドメイン名+.js」となっているところです。これは小窓の規約に「使用するドメインに「.js」をつけるという」とうのがあるためです。

css

このcssディレクトリには、OpenPNEのスタイルシートが入っています。
OpenPNEのデザインに関わるCSSは基本的に、すべてこのcssディレクトリに入っています。しかし、現状は動的に書き出す必要がある配色設定などはテンプレートに直接書いています。
動的に書き出す必要がないフォントの大きさなどのCSSはこのcssディレクトリに入っています。

root/public_html/css/

main/
default.css

root/public_html/css/main/

commons.css
font.css
inc_info.css
inc_navi.css
inc_page_footer.css
inc_page_header.css
inc_search_box.css
mainframe.css
page_login.css

flash

root/public_html/flash/

list.swf

次はflashディレクトリです。
ここにはflashファイルが入っています。しかし、このflashディレクトリには現在一つしかファイルがありません。現在あるファイルはフレンドリストをFlashで表示するという機能のソースです。このflashのソースも公開してますので、これを編集しなおしてオリジナルのフレンドリストを作ることも可能です。

Flashの使い方
http://trac.openpne.jp/wiki/FlashHowTo

img

root/public_html/img/
    
gif/
jpg/
png/
.htaccess
index.php

次はimgディレクトリです。このimgディレクトリはデフォルトの設定では使いません。
この機能を使うときは、config.phpで設定します。
OPENPNE_IMG_CACHE_PUBLICをtrueに書き換える必要があります。
なぜ、このOPENPNE_IMG_CACHE_PUBLICをデフォルトの設定でtrueにしていないかというと、この画像キャッシュをpublic_html以下に置くにはmod_rewriteが必要でだからです。

root/config.php

// 画像キャッシュをpublic_html以下に置くかどうか(要mod_rewrite)
define('OPENPNE_IMG_CACHE_PUBLIC', true);

画像の一時ファイルをvarディレクトリに入れるのではなくpublic_htmlに公開することで、ブラウザが直接アクセスできるようになるため、OpenPNEのパフォーマンスが上がります。

imgディレクトリの中には、画像の形式ごとにディレクトリ分けされています。
また、画像の大きさが決まっているので、画像の大きさごとに各ディレクトリにキャッシュされます。

root/public_html/img/gif/
    
w_h/
w_h_raw/
w120_h120/
w180_h180/
w240_h320/
w76_h76/

js

root/public_html/js/

pne.js
prototype.js
show_flash.js

このjsディレクトリにもcmdディレクトリと同じく、JavaScriptファイルが入っています。OpenPNEには小窓以外にもJavaScriptが使われています、
pne.jsはURL2CMDを実現するために必要なJavaScriptファイルです。
prototype.jsはフォーム入力欄のフォーカス契機で色を変えるというものに使っていました。現在は使用されていませんが、今後使用する可能性が高いためこのライブラリを残しています。
show_flash.jsはフレンドリストをFlashで表示するために必要なJavaScriptファイルです。
OpenPNEでは基本的にJavaScriptを使っておらず、あくまで補助的なものとして使用しています。

modules

root/public_html/modules/

admin/
pc/
setup/

このmodulesディレクトリには、admin、pc、setupと各モジュールごとに必要なファイルが入っています。例えば、adminディレクトリでは、管理画面のCSSや管理画面のボタンが入っています。
pcディレクトリは現在空のディレクトリです。
setupディレクトリはsetupに必要なCSSが入っています。

skin

root/public_html/skin/

001_openpne_red/
002_openpne_beige/
003_openpne_yellow/
004_openpne_green/
005_openpne_blue/
006_openpne_navy/
007_openpne_purple/
900_openpne_ver28/
default/
dummy.gif

このskinディレクトリはOpenPNE2.10系から大きく構成が変更されたディレクトリです。
OpenPNE2.10系から、ヘッダーやナビメニューなどのスキン画像をプリセットカラーから選択出来る機能が追加されました。
上から、レッド、ベージュ、イエロー、グリーン、ブルー、ネイビー、パープル用のディレクトリがあります。その下にある900_openpne_ver28ディレクトリはOpenPNE2.8系で使用されていたスキン画像は入っています。

001_openpne_redディレクトリの中を見ると、imgディレクトリとskin.iniファイルがあります。

root/public_html/skin/001_openpne_red/
   
img/
skin.ini

このskin.iniファイルは管理画面から読み込まれる設定ファイルです。
captionで指定した名前が管理画面から読み込まれて表示されています。

root/public_html/skin/001_openpne_red/skin.ini

[skin]
caption = "OpenPNEレッド"

次に、imgディレクトリについて見てみましょう。このimgディレクトリにはOpenPNEレッドに必要な画像しか入っていません。具体的には、ヘッダーやナビやログイン画面の画像などです。つまり、ボタン画像やアイコンは入っていません。
001_openpne_redディレクトリにはない、ボタン画像やアイコンはskinディレクトリ以下のdefaultディレクトリが読み込まれることになっています。同名のファイル名がない場合は、defaultディレクトリの画像が使われることになります。

root/public_html/skin/001_openpne_red/img/

skin_after_header_2.jpg
skin_after_header.jpg
skin_before_header.jpg
skin_login_open.jpg
skin_login.jpg
skin_navi_c_2.jpg
skin_navi_c.jpg
skin_navi_f_2.jpg
skin_navi_f.jpg
skin_navi_h_2.jpg
skin_navi_h.jpg

setup

root/setup/

script/
sql/
OpenPNE_Setup_mybox.html
OpenPNE_Setup_pgsql.html
OpenPNE_Setup.html
OpenPNE_Upgrade.html

このsetupディレクトリにはセットアップに必要なファイルとOpenPNEのマニュアルが入っています。
PostgreSQLを使う場合はOpenPNE_Setup_pgsql.htmlを見てください。
そのほかにも、アップグレードのマニュアルもあるので安定版から安定版にアップグレードしたいときは、OpenPNE_Upgrade.htmlを見てアップグレードを進めてください。
それではscriptディレクトリから見ていきましょう。

script

root/setup/script/

update/
upgrade/

scriptディレクトリですが、このディレクトリには現状は何も入っていません。2.10からこのscriptディレクトリが追加されました。
OpenPNE2.10で固体識別番号という大きな機能追加を行ったのですが、その時にはこのディレクトリにはPHPファイルが入っていました。
この様に大きな機能追加などが行われたときにはこのscriptディレクトリにファイルが入る可能性があります。

sql

root/setup/sql/

mysql40/
mysql41/
postgres74/
README.txt

次に、sqlディレクトリですが、このディレクトリには基本的にSQLファイルが入っています。OpenPNEは原則として画像などもデータベースに保存しているためバージョンアップの時もこのSQLを実行するだけでバージョンアップをすることが出来ます。
基本的にはどのディレクトリも構造は同じなのでOpenPNEが推奨しているMySQL4.1系のディレクトリを詳しく見ていきましょう。

root/setup/sql/mysql41/

install/
option/
update/
upgrade/

mysql41ディレクトリにはinstall、option、update、upgradeのそれぞれの用途に合わせたSQLファイルが入っています。
installディレクトリにはOpenPNEを新規にインストールするためのSQLが入っています。

optionには、OpenPNEの動作に必須ではないSQLが入っています。例えば、add_c_api.sqlはOpenPNEの動作には直接関係していません。つまり実行しなくてもOpenPNEは動作します。
しかし、OpenPNEのAPIを使用する場合にはこのadd_c_api.sqlを実行する必要があります。sqlディレクトリにあるREADME.txtの「用途」の欄を見ればoptionディレクトリにあるSQLの説明があります。

updateには、OpenPNE2.9.1から2.9.2、2.9.2から2.9.3っていう形で、開発版のバージョンを上げるためのSQLが入っています。主に開発者や最新の動向を追いたい人が使用するSQLです。

upgradeには2.6から2.8、2.8から2.10という形で、大きくバージョンが上がるときに使います。通常SNSのバージョンをあげたい場合はのupgradeを使います。

また、各ディレクトリのSQLには大きく分けて2種類あります。create_tablesというテーブルを作るSQLとinsert_dataという初期設定値のデータを挿入するSQLがあります。 この2種類のSQLを実行することで、OpenPNEを動作させることが出来ます。

var

root/var/

function_cache/
img_cache/
log/
rss_cache/
templates_c/
tmp/
   

このvarディレクトリには基本的には一時的なファイル、一時的なデータが入るようになります。ですので、OpenPNEをダウンロードして展開した状態だと空の状態です。

OpenPNEはデータはデータベースに置くという方針で開発しています。しかし、毎回データベースに接続して読み込んでいると表示速度が遅くなることがあるので、一度データベースから読み込んだファイルはこのvarディレクトリに置いておきます。
そうすることで、毎回データベースにデータを読み込みに行く必要がなくなるのでパフォーマンスが上がります。

varディレクトリを詳しく見ていきましょう。
まず一番上にfunction_cacheディレクトリがあります。このfunction_cacheディレクトリは、 負荷のかかる処理などをキャッシュするために存在します。
例えば、OpenPNEにはランキングという機能がありますが、このランキングを集計するのは非常に時間がかかります。しかも、ランキングは一日に一回しか計算しません。ですので、あらかじめ計算しておいて、このfunction_cacheディレクトリに置いています。このように、計算の難しいことや時間のかかることは一回計算した結果をこのfunction_cacheディレクトリに置いておきます。そして、二回目からはデータベースを読み込まないで、ファイルを読み込んで計算結果を出力しています。

次に、img_cacheディレクトリです。このimg_cacheディレクトリは日記やプロフィールなどの画像をキャッシュするために存在します。この img_cacheディレクトリを見ると、まずは拡張子別で分かれていて、次に高さ・幅、サイズ別に分かれています。サイズを分けてキャッシュをとることによって性能が劣化するのを避けています。
public_htmlにも画像をキャッシュするディレクトリがありますが、config.phpで設定していない場合は通常このvarディレクトリ以下のimg_cacheディレクトリに画像がキャッシュされます。

次に、logディレクトリです。このlogディレクトリにはエラーログやメールの実行ログなどを記録するために存在します。logを有効にするためには、config.phpで設定が必要で、OPENPNE_DEBUGGINGを0にする必要があります。

root/config.php
    
//--- オプション設定

// デバッグモード
// 0: off ... エラー非表示、エラーログを記録する
// 1: on  ... エラー表示、エラーログを記録しない
// 2: on  ... 1 + Smartyデバッグコンソール
define('OPENPNE_DEBUGGING', 0);

次に、rss_cacheディレクトリです。rss_cacheディレクトリには外部ブログを取り込んだ結果を置いておきます。負荷対策のために、外部ブログのRSSもキャッシュしています。

次に、templates_cディレクトリです。templates_cディレクトリにはSmartyのテンプレートを一度解析して、解析の結果を一時ファイルとして置いています。Smartyのテンプレートもキャッシュをここに置いておくことで次に読み込まれるときに、このキャッシュを読み込むので、一回目にアクセスしたときより速く表示できます。

最後に、tmpディレクトリです。tmpディレクトリには一時画像や一時ファイルを保存しておく場所として存在します。 メールで画像を投稿するときに、チェックするために画像を保存する必要があり、一時的にこのtmpディレクトリに保存しています。

webapp

root/webapp/

lib/
modules/
templates/
validate/
init.inc
version.php

このwebappディレクトリがOpenPNEの根幹です。OpenPNEのアクションファイルなどはこのwebappディレクトリに入っています。
libディレクトリ、modulesディレクトリ、templatesディレクトリ、validateディレクトリの各ディレクトリについてはこの後詳しく見ていきます。

このディレクトリには2つのファイルがあります。

まず、init.incですがOpenPNEはconfigの後にこのファイルを読み込むことになります。このファイルにはOpenPNEのフレームワークの設定などがここには書いています。
version.phpはOpenPNEのバージョンを定義しているだけのファイルです。

lib

root/webapp/lib/
    
Auth/
Cache/
color/
db/
mail/
OpenPNE/
smarty_plugins/
util/
auth.inc
controller.php
db.inc.php
ktaiIP.php
OP.php
util.inc.php

それではlibディレクトリを見ていきましょう。libディレクトリはincludeディレクトリにもありますが、この2つのディレクトリには大きな違いがあります。

includeディレクトリ以下のライブラリは外部のライブラリで、このwebappディレクトリ以下のディレクトリはOpenPNEプロジェクトで開発されたライブラリです。includeディレクトリ以下のlibディレクトリ解説の時にライセンスが違うことがあるので注意が必要と書きましたが、このwebappディレクトリ以下のlibはOpenPNEプロジェクトで開発されたものなのですべてPHPライセンスです。

libディレクトリにはいくつかファイルがあります。その中でcontroller.phpというファイルがありますが、この中でOpenPNEのメインの処理を行っています。まずはじめに公開領域であるpubic_html以下のindex.phpが読み込まれたら、このcontroller.phpファイルの中のopenpne_executeという関数が実行されて、使用するモジュールなどを判断しています。

それでは主要なディレクトリについて詳しく見てみましょう。

db

root/webapp/lib/db/
    
action.php
api.php
ashiato.php
banner.php
bookmark.php
common.php
commu.php
deprecated_lib.php
diary.php
etc.php
file.php
friend.php
image.php
member.php
message.php
point.php
ranking.php
review.php
rss.php
schedule.php

OpenPNEではこのdbディレクトリ以下のファイルをよく使用しています。
例えば、メンバーのidを取得したい場合、member.phpファイル内のdb_member_c_member4c_member_idという関数を呼ぶと、指定したメンバーの情報が取得出来ます。

root/webapp/lib/db/member.php

.
.
.
function db_member_c_member4c_member_id($c_member_id, $is_secure = false, $with_profile = false, $public_flag = 'public')
{
    static $is_recurred = false;  //再帰処理中かどうかの判定フラグ

    if (!$is_recurred) {  //function cacheのために再帰処理を行う
        $is_recurred = true;
        $funcargs = func_get_args();
        return pne_cache_recursive_call(OPENPNE_FUNCTION_CACHE_LIFETIME_FAST, __FUNCTION__, $funcargs);
    }
.
.
.

OpenPNE

このOpenPNEディレクトリにはOpenPNEが使っているクラスライブラリが入っています。例えば、Smarty.phpはsmartyの派生クラスであるOpenPNE_Smartyというクラスを定義しています。ここではOpenPNE独自の処理を施しています。
そのほかにも、さまざまな派生クラスが定義されています。

color

colorディレクトリには配色設定があります。
このディレクトリいはktaiディレクトリとpcディレクトリに分けてプリセットカラーが定義されています。

pcディレクトリには各プリセットカラーの配色設定が定義されています。
同じフォーマットで新たに定義ファイルを追加すると、プリセットカラーとして管理画面から選択出来る様になります。

root/webapp/lib/color/pc/
    
001_red.ini
002_beige.ini
003_yellow.ini
004_green.ini
005_blue.ini
006_navy.ini
007_purple.ini

smarty_plugins

このsmarty_pluginsディレクトリには、OpenPNEプロジェクトが作ったSmartyのプラグインが入っています。
中でも、function.t_url.phpというプラグインはOpenPNE独特のプラグインです。
OpenPNEの場合は、SSLを使用することがあるので、アクションによってはURLが変わることがあります。ですので、テンプレートに直接URLを書くより、Smartyプラグインを使ってSmartyにURLを生成してもらう処理をしています。
その他にも、CMDタグを小窓にするfunction.t_cmd.phpや、絵文字を変換するためのoutputfilter.pne_display_emoji.phpなどもあります。

root/webapp/lib/smarty_plugins/
    
block.t_loop.php
function.ext_include.php
function.t_assign_rss.php
function.t_form.php
function.t_img_url_skin.php
function.t_img_url.php
function.t_url_mail.php
function.t_url.php
modifier.t_cmd.php
modifier.t_escape.php
modifier.t_implode.php
modifier.t_truncate.php
modifier.t_url2a_ktai.php
modifier.t_url2a.php
modifier.t_url2cmd.php
modifier.to_sjis.php
outputfilter.pne_display_emoji.php
resource.db.php

modules

root/webapp/modules/

admin/
api/
ktai/
pc/
setup/

modulesディレクトリには、管理画面からSNSの情報を変更をする、日記を読む、メッセージを送るなど、何らかの動作をするためのファイルがこの中には入っています。OpenPNEでの動作プログラムはほぼこのmodulesディレクトリの中にあります。
基本的には構造は同じなのでpcディレクトリを見ながら詳しく解説していきます。

pc

このpcディレクトリはdo、page、templates、validateと4つのディレクトリとinit.incの一つのファイルで構成されています。
基本的にこの構造で構成されています。

root/webapp/modules/pc/

do/
page/
templates/
validate/
init.inc
do

このdoディレクトリには、実行系の処理をするファイルが入っています。 このdoディレクトリを見ると、データベースに追加、削除など何らかの処理をしています。フォームにはdo系の関数が使われることが多いことも特徴です。

page

このpageディレクトリにはページを表示するために必要なファイルが入っています。
このpageの特徴としてはそのファイル名がそのままURLに使用されている点です。

templates

templatesディレクトリにはテンプレートが入っています。
page系と対になって存在するテンプレートが多いのが特徴です。しかし、同じpageでも一つのテンプレートを使っていることもあります。例えば、プロフィール確認と友人のホームというのは同じテンプレートを使用しています。

validate

validateディレクトリには入力値のチェックのためのファイルが入っています。
例えば、c_member_idは1や2などの数値ですが、aなどの文字列が変数として渡された時にプログラムが予期せぬ動作を起こすことがあるかもしれません。そのような予期せぬ動作を未然に防ぐために、あらかじめ変数の値をチェックをしています。
このvalidateディレクトリの中でもdoとpageに分かれておりどちらも変数の入力値をチェックしています。

root/webapp/modules/pc/validate/

do/
page/

templates

root/webapp/templates/

mail/
debug.tpl
error.tpl

このtemplatesディレクトリにはOpenPNEのすべてのモジュールから使用できるテンプレートが入っています。
一番上のmailディレクトリには、メールのテンプレートが入っています。このテンプレートの中に変数があり、その変数に値を渡してメールを送信しています。
次に、debug.tplはconfig.phpでOPENPNE_DEBUGGINGを2にしたときに出力されるデバッグコンソールの中身です。
最後に、error.tplというのがありますが、OpenPNEではエラーやメンテナンス画面はこのerror.tplを使って表示しています。

webapp_biz

webapp_bizディレクトリにはOpenPNEのBIZモジュールが入っています。
基本的なディレクトリの構造はwebappと同じ構造をしています。
BIZ機能を使用するときはまずこのwebapp_bizが読み込まれ、もしアクションファイルが存在しない場合は、webappのアクションファイルを読み込みます。

root/webapp_biz/modules/
    
admin_biz/
biz/
ktai/
ktai_biz/
pc/

webapp_ext

root/webapp_ext/modules/

admin/
ktai/
pc/

このwebapp_extディレクトリは拡張用のディレクトリです。
新しい機能を追加や拡張する時のために用意されているもので、デフォルトでは空のディレクトリです。
何らかの機能を追加したい場合、直接ファイルを書き換えるということも可能ですが、バージョンアップに追従できないというデメリットがあります。
実際にこのwebapp_extディレクトリを使用して機能を拡張する場合は、webapp_bizディレクトリが参考になると思います。

webapp_extディレクトリを使用する場合は、config.phpでUSE_EXT_DIRをtrueにする必要があります。このUSE_EXT_DIRをtrueにすることによって、まずwebapp_extディレクトリが読み込まれ、もしアクションファイルが存在しない場合は、webappのアクションファイルを読み込みます。

root/config.php

// webapp_ext ディレクトリ使用設定
///

define('USE_EXT_DIR', true);
define('OPENPNE_WEBAPP_EXT_DIR' , OPENPNE_DIR . '/webapp_ext');
define('OPENPNE_MODULES_EXT_DIR', OPENPNE_WEBAPP_EXT_DIR . '/modules');

ただ、webapp_extディレクトリを使用して開発する場合にいくつか注意が必要です。
一つ目は「アクションファイルを追加してもvalidateで変数の値をチェックする必要」で、二つ目は「do系のアクションを追加する場合はセッションIDのハッシュ値が必要」です。

まず、「アクションファイルを追加してもvalidateで変数の値をチェックする必要」の解説をします。例えば、do系でプログラムを追加するとします。そのプログラムの中で、変数のやり取りをしていた場合、validate以下のpcに「アクション名.ini」というファイルを追加しなければいけません。

次に、「do系のアクションを追加する場合はセッションIDのハッシュ値が必要」の解説をします。do系のアクションはクロスサイトリクエストフォージェリ対策(CSRF)防止のためにセッションIDのハッシュ値をリクエストの中に含めなければいけません。
OpenPNE内のフォームなどの場合は以下のような形でセッションIDのハッシュ値をリクエストの中に含めています。

<input type="hidden" name="sessid" value="({$PHPSESSID})">

OpenPNE trunk
http://trac.openpne.jp/browser/OpenPNE/trunk