k-holyのPHPとか諸々メモ

Webで働くk-holyがPHP(スクリプト言語)とか諸々のことをメモしていきます。ソースコードはだいたいWindowsで動かしてます。

噂のPhalcon FrameworkをWindowsで動かしてみた

"The fastest PHP Framework" を標榜する Phalcon フレームワーク、実はWindows版もあるんです。

Phalcon for Windows を入れる

extension として実装されてるわけですが、Windowsの場合は DLL ファイルを置くだけなのである意味Linux版よりもインストールは楽ちんです。

環境に合うものをダウンロードして展開、php_phalcon.dll を php.ini で設定された extension_dir に配置します。

(C:\phpPHPをインストールした場合、多分 C:\php\ext になるはず)

php.iniへの設定追加も忘れずに。

php.ini

extension=php_phalcon.dll

Phalcon DevTools を入れて phalcon コマンドの準備

Phalcon の流儀に従って一からファイルを作成してもいいんですが…

Phalcon DevTools に付属の phalcon コマンドを使えば、プロジェクトのひな形を作成してくれるので、最初はこれに頼った方がいいかなぁと。

Composer でのインストールにも対応していますが、プロジェクト単位に配置する物ではないので、普通に git clone して、クライアントアプリケーションと考えて適当な場所に入れた方がいいでしょう。

私の場合は C:\Applications\phalcon-devtools に配置しました。

Windows用に用意されている phalcon.bat の中身はこんな感じになってます。

phalcon.bat

@echo off

set PTOOLSPATH=%~dp0\
php %PTOOLSPATH%\phalcon.php %*

ここにパスを通すなり、シンボリックリンクやジャンクションを作成するなりします。

私の場合はシェルにNYAOSを使ってるので _nya 設定ファイルにこんな感じで alias の設定を追加しました。

%HOME%_nya

alias phalcon C:\Applications\phalcon-devtools\phalcon.bat

なお公式ドキュメントでは c:\phalcon-tools に入れて、このパスをPath環境変数に追加することを推奨しています。

phalcon コマンドでプロジェクトの雛形を作成

コマンドラインで phalcon project と入力すると、ヘルプが表示されます。

$ phalcon project

Phalcon DevTools (1.2.4)

Help:
  Creates a project

Usage:
  project [name] [type] [directory] [enable-webtools]

Arguments:
  help  Shows this help text

Example
  phalcon project store simple

Options:
 --name               Name of the new project
 --enable-webtools    Determines if webtools should be enabled [optional]
 --directory=s        Base path on which project will be created [optional]
 --type=s             Type of the application to be generated (micro, simple, modules)
 --template-path      Specify a template path [optional]
 --use-config-ini     Use a ini file as configuration file [optional]
 --trace              Shows the trace of the framework in case of exception. [optional]
 --help               Shows this help

これによると "project [name] [type] [directory] [enable-webtools]" とあります。

type オプションには micro, simple, modules の三種類あって、プロジェクトのスタイルによっていずれかを選択すればいいようです。

スタイルの違いはこちらが参考になります。

「simple」の場合は controllers ディレクトリにコントローラクラスを配置するのに対して、「micro」の場合は app.php にルーティング設定とハンドラを無名関数で定義するスタイルのようです。

ここは、Silex好きな私には馴染み良さそうな感じの micro で。

$ phalcon project test micro

Phalcon DevTools (1.2.4)


  Success: Project 'test' was successfully created.

testディレクトリが作成され、中には .htaccess, app.php, index.html ファイルと、.phalcon, config, modules, public, views ディレクトリが作成されています。

流れを追ってみます。

.htaccess

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule  ^$ public/    [L]
    RewriteRule  (.*) public/$1 [L]
</IfModule>

リクエストされたパスの前に public/ を付けて…

public/.htaccess

AddDefaultCharset UTF-8

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
</IfModule>

public/ で受けたパスを index.php に _url パラメータで渡して…

public/index.php

<?php

error_reporting(E_ALL);

try {

    /**
    * Read the configuration
    */
    $config = include __DIR__ . '/../config/config.php';

    /**
    * Include Services
    */
    include __DIR__ . '/../config/services.php';

    /**
    * Include Autoloader
    */
    include __DIR__ . '/../config/loader.php';

    /**
    * Starting the application
   */
    $app = new \Phalcon\Mvc\Micro();

    /**
    * Assign service locator to the application
    */
    $app->setDi($di);

    /**
    * Incude Application
    */
    include __DIR__ . '/../app.php';

    /**
    * Handle the request
    */
    $app->handle();

} catch (Phalcon\Exception $e) {
    echo $e->getMessage();
} catch (PDOException $e){
    echo $e->getMessage();
}

設定ファイル(.phpファイル!)を読み込んで、DIコンテナにサービスを登録して、オートローダーを読み込んで、アプリケーションオブジェクト(Phalcon\Mvc\Micro)を生成して実行しているようです。

例外処理とかすっごい雑ですが、あくまで雛形なので、好きに変えちゃっていい…のでしょうか。

ルーティング設定は、途中で読み込まれる app.php で行われています。

app.php

<?php

/**
 * Add your routes here
 */
$app->get('/', function () use ($app) {
    echo $app['view']->getRender(null, 'index');
});

/**
 * Not found handler
 */
$app->notFound(function () use ($app) {
    $app->response->setStatusCode(404, "Not Found")->sendHeaders();
    echo $app['view']->getRender(null, '404');
});

こういう突然変数が現れる書き方も好きじゃないんですが、なんとなく流れは分かりました。

ビルトインWebサーバ用のルーティングスクリプトを作成

せっかくなので、ビルトインWebサーバで実行できるようにします。

プロジェクト内の public ディレクトリ直下にルーティングスクリプトを作成します。

public/.router.php

<?php
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

if (file_exists(realpath(__DIR__ . $path))) {
    return false;
}
$_GET['_url'] = $_SERVER['REQUEST_URI'];
require __DIR__ . DIRECTORY_SEPARATOR . 'index.php';

Windowsなので、ビルトインWebサーバ起動用のショートカットを作成するのが楽だと思います。

リンク先を C:\php\php.exe -S 127.0.0.1:8080 .router.php として、作業フォルダーにドキュメントルートを指定します。

ビルトインWebサーバを起動して、ブラウザで 127.0.0.1:8080 を見てみます。

ヤッター ∩( ・ω・)∩ とりあえず動くところまで確認できました。