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

Version 16 (modified by ebihara, 12 years ago) (diff)

binディレクトリなど変更(間に合うか?)

TOC

ディレクトリツアー

解説:海老原
文:井本

概要

ここでは、OpenPNEのディレクトリのうち、特に主要なものをアルファベット順に解説していきます。
SourceForge?.netなどからダウンロードできるOpenPNEの圧縮ファイルを解凍したり、trac.openpne.jpでOpenPNEのtrunkを見てみると、以下のような構造になっているのがわかると思います。

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

今回は、これらのディレクトリをひとつひとつ見て回ることにします。

ルートディレクトリ

各ディレクトリを見る前に、ルートディレクトリ(一番上の階層)について見ていきましょう。

  • LICENSE - OpenPNEは現在PHPLicenseを採用しています。そのライセンス事項が書かれているのが、このファイルです
  • config.php.sample - 設定ファイル(config.php)の編集前のファイルです。OpenPNEをセットアップするには、このconfig.php.sampleからconfig.phpをコピーし、config.phpのほうをコメントの内容に従って書き換える必要があります

ところで、WordPressやXOOPSなど、ほかの一般的なWEBアプリケーションのように、このディレクトリにはindex.phpがルートディレクトリに存在しません。これは、OpenPNEでは後ほど解説するpublic_htmlディレクトリのみをWEBサーバの公開領域に設置することを推奨しているためです(注:config.phpなどのファイルをWEBサーバの公開領域に設置してしまうと、サーバの設定などによってはファイルの中身(config.phpであればデータベースの接続情報など)が見られてしまったり、想定外のPHPスクリプトにアクセスされてしまうなど、セキュリティ上好ましくありません)。

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

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

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ディレクトリにあるファイルは、他のディレクトリにあったファイルとは違い、OpenPNEからではなく、cronやPostfixなどから実行されるスクリプトです。
*.cron という拡張子を持つファイルは、対になった同名のPHPファイルを実行するためのスクリプトとなっています。RSSの取得や、デイリーニュースの送信など、定期的におこなう処理については、これらのファイルを実行することで実現します。
mail.phpは、catch all機能を使ってPostfixがメールを受信した際に実行されるスクリプトです。受信したメールがmail.phpに渡され、日記のメール投稿処理などをおこないます。
(注:config.inc.phpファイルは、config.phpファイルを読み込むためのファイルです。OpenPNEの設定を取得する必要のあるディレクトリに置かれています)

libディレクトリ

root/lib/

include/
smarty_plugins/
README.txt

このlibディレクトリの中には、includeディレクトリとsmarty_pluginsディレクトリがあります。このlibディレクトリには外部のライブラリが入っています。具体的にはPEARのライブラリなどが入っています。

このlib直下のREADME.txtにも書いていますが、このライブラリを使用する際に注意が必要です。OpenPNEはPHPライセンスですが、このlib直下のライブラリは必ずしも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のライブラリです。

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

まず、一番上の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というファイルがあります。このファイルはRSS取得のためのライブラリです。
以前、OpenPNEはGPLライセンスというライセンス形態をとっていました。その時はRSS取得のためにMagpieRSSというライブラリを使用していました。しかし、MagpieRSSはGPLライセンスであるため、PHPライセンスにすることができませんでした。そこで、OpenPNE2.3.0にバージョンアップするときに、RSS取得のためのライブラリをMagpieRSSからこの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ファイルやJavaScriptファイルなどがあります。詳しくは後ほど説明します。
また、この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が必要だからです。 mod_rewriteに対応していないレンタルサーバでも動くように、OPENPNE_IMG_CACHE_PUBLICをデフォルトでfalseにしています。

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ディレクトリには基本的に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が変わることがあります。そのため、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})">