PHPの最近のブログ記事
Ubuntu9.04のPECL版memcachedクライアントを入れようとしたらphpizeでエラーが出ます。
この場合は、php5-devをインストールすればOK。
userdqn@colinux:~$ sudo pecl install memcached
downloading memcached-1.0.0.tgz ...
Starting to download memcached-1.0.0.tgz (22,281 bytes)
........done: 22,281 bytes
4 source files, building
running: phpize
sh: phpize: not found
ERROR: `phpize' failed
この場合は、php5-devをインストールすればOK。
$ sudo apt-get install php5-dev
Ethnaでは、アクションクラス内でreturn 'user_login' などと書くと、対応するビュークラスを呼び出して画面表示してくれる。
ここで、スペルミスでreturn 'user_loginnn'など存在しないビュー名を書くと、ブラウザの画面が真っ白になることがある。
Ethna初心だった頃の私は、よくこの真っ白画面に出くわして途方にくれた。
何が原因かさっぱりわからず、ビュー名の指定ミスだと気付くまでに数時間かかったりした。
そこで簡単な対処法を紹介します。
Ethna_Controller.phpの1545行目あたりで、
この下に、下記のように1行追加してやればOK。
※他にもっと良いやり方があったら教えてください。
ここで、スペルミスでreturn 'user_loginnn'など存在しないビュー名を書くと、ブラウザの画面が真っ白になることがある。
Ethna初心だった頃の私は、よくこの真っ白画面に出くわして途方にくれた。
何が原因かさっぱりわからず、ビュー名の指定ミスだと気付くまでに数時間かかったりした。
そこで簡単な対処法を紹介します。
Ethna_Controller.phpの1545行目あたりで、
$this->logger->log(LOG_DEBUG, 'view class is not defined for [%s] -> use default [%s]', $forward_name, $class_name);
となっている行があります。この下に、下記のように1行追加してやればOK。
$this->logger->log(LOG_DEBUG, 'view class is not defined for [%s] -> use default [%s]', $forward_name, $class_name);
trigger_error( sprintf( 'view class is not defined for [%s] -> use default [%s]', $forward_name, $class_name) );
こうすると、
「ビュークラスが見つかりませんでした」的な警告がブラウザに表示されます。※他にもっと良いやり方があったら教えてください。
PHPをコマドライン(cli)から起動すると、表題のようなエラーが出ることがあります。
私の場合は、
前者ではphp_pgsql.dll(PostgreSQL接続用モジュール)が読み込まれる設定になっていたのに、後者では何も設定していなかったので、上記のエラーが出た次第です。
Fatal error: Call to undefined function pg_connect()
ブラウザから動かしたらちゃんと動くのにおかしいなーと思っていろいろ調べたら、原因がわかりました。
原因
phpは、Apacheと連動して動く場合と、コマンドライン(cli)から起動して動く場合で、別々のphp.iniファイルを参照しているようです。私の場合は、
- Apacheモジュールとして動作する場合: c:\windows\php.ini
- コマンドラインのコマンドとして動作する場合: c:\php5\php.ini
前者ではphp_pgsql.dll(PostgreSQL接続用モジュール)が読み込まれる設定になっていたのに、後者では何も設定していなかったので、上記のエラーが出た次第です。
対処法
コマンドライン(cli)用のphp.iniを、下記のように書き換えれば、動くと思います。;extension=php_pgsql.dll
↓
extension=php_pgsql.dll
php_pgsql.dllが読み込まれているかを確認する方法
コマンドラインから、>php -i
と打って、"PostgreSQL"または"pgsql"という文字が出てくればOKです。
spp/Sample_Controller.php
再びindex.phpを見てみましょう。<?php
require_once 'C:¥xampp¥htdocs¥sample¥app/Sample_Controller.php';
Sample_Controller::main('Sample_Controller', 'index');
?>
Sample_Controllerのmain関数を呼び出しています。では、Sample_Controller.phpを開いて、Sample_Controllerクラスを探しましょう。
おっ、ありました。
class Sample_Controller extends Ethna_Controller
{
...
よしよし。では、main関数はと・・・
あれ、ない。
Sample_Controllerにmain関数はないようです。
この場合、Sample_Controllerの親クラスであるEthna_Controllerのmain関数が呼び出されることになっています。
次回は、Ethna_Controllerの中を覗いてみましょう。
はじめに
この連載では、Ethna2.3.6のソースコードとその読み方を解説します。Ethnaコマンドを使って"Sample"という名前のプロジェクトを作ったという前提で話を進めます。
手元にEthnaがない方は、公式サイトを見てインストールしてみてください。
Ethnaインストールガイド
Windowsユーザの方はコレ↓で一発です。
5分でまっさらなWindowsにEthnaをインストールしてHello Worldを表示する方法
話を単純化するために、CLI,XML-RPC,SOAPなどには一切触れませんのでご了承ください。
Ethnaのプログラム実行はどこから始まるのか
EthnaでWebアプリを作るとき、通常はアクション、ビュー、テンプレートファイルの3セット(+DBクラスや自作ライブラリ)をバリバリ記述することになると思います。
では、問題です。
Ethnaで作ったWebアプリの実行はどこから始まるのでしょうか?
こたえ:index.php
全てはindex.phpから始まる
これは重要です。そのアプリが、たとえ"hello world"と表示するだけの簡単なアプリであろうと、
あるいは、何百人のユーザを抱える大規模なソーシャルネットワーキングSNSサービスであろうと、
ユーザがindex.phpにアクセスしてきたなら、プログラムの実行はindex.phpから始まります。
つまりここから始まります。
<?php
require_once 'C:¥xampp¥htdocs¥sample¥app/Sample_Controller.php';
Sample_Controller::main('Sample_Controller', 'index');
?>
これがEthnaの第一歩です。
解説
1行目では、Sampleプロジェクトのコントローラーファイルを読み込んでいます。コントローラというのは、メインのプログラムのことです。
require_once 'C:¥xampp¥htdocs¥sample¥app/Sample_Controller.php';
2行目では、読み込んだファイルの中の、Sample_Controllerクラスのmain関数を実行しています。
Sample_Controller::main('Sample_Controller', 'index');
さあここからが、Ethna内部への旅の始まりです。
つづく
余談:MVCなど忘れてしまえ
公式サイトやEthna本によると、Ethnaとは、
MVCモデル2とフロントコントローラパターンに基づいたスタンダードなウェブアプリケーションフレームワークであると書かれています。
んがっ、そんな話は忘れてしまいましょう。