PHP+SQLite3で2ちゃんねるっぽい掲示板を作るにインスパイヤされて。そういや私、いままでの人生でスレッドフロート掲示板とか作ったことない。作ってみよう。
PHPを入れる
PHP 7をインストールしよう。それ以下のバージョンはレガシーだ。特に5.4系以下はセキュリティサポートも終了してるので相手にしてはいけない。
Macなら、こんな感じで入れるのがいいです。
brew tap homebrew/php
brew install php70 php70-gmp php70-intl php70-pcntl
WindowsでまじめにPHPやるのとか正直微妙なので、VirtualBoxとVagrant入れてrlerdorf/php7devとか動かしてみるといいです。
やりかたはpixiv/intern2015wとかに書いたので、よくわからなかったらこれが動くようにしてみるのがいいですかね。
Linuxでは… まあよしなにやってください。
Composerを入れる
ComposerはPHPのパッケージの依存性を管理するツールです。php -r 'echo file_get_contents("https://getcomposer.org/composer.phar");' > ./composer; chmod +x ./composer
とかでダウンロードしておくのがいいですね。
設計
-
パッケージ名:
zonuexe/inspire-bbs
-
名前空間:
InspireBBS
- OS: Windowsじゃなきゃいいや
- Webサーバ: めんどくさいしビルトインウェブサーバーでいいや
- RDBMS: めんどくさいしSQLiteで。手元にあったのは3.8.10.2だった。
なんかそれっぽく作っておけば後で本番にリリースするときに変更できるし良いでしょ。
じゃあ作ってみよう
はじめにディレクトリから。作る場所は自分のホームディレクトリでいいです。私は$HOME/repo/php
みたいなディレクトリに作ってるよ。
cd inspire-bbs
mkdir inspire-bbs
git init
touch README.md
echo "## inspire BBS" > README.md
touch .gitignore
edit .gitignore
git add .gitignore README.md
git commit -m "Init repository"
git remote add origin git@github.com:$USER/inspire-bbs.git
git push origin master
.gitignore
ファイルはこんな感じにしとくと良い。
/cache
/phpunit.xml
/vendor/*
/.env
/.idea
/*.iml
/.vagrant
最初からGitHubにアップロードしていきましょうねー。この先「ここでgit commit
する」とかいちいち書かないので、自分でわかりやすい範囲でやってみよう。
ディレクトリ構成を作る
わかりやすいように、こんな感じにしていきましょうか。
% tree
.
├── README.md
├── cache
│ ├── db.sq3
│ └── twig
├── public
│ └── index.php
└── src
└── functions.php
DBのファイルはcache/db.sq3
にします。テンプレートエンジンはTwig - The flexible, fast, and secure PHP template engineを選ぶことにするので、そのディレクトリとかも置きますね。
PDOを作るラッパーを用意してみる
DBは一個あればいい[要出典]ので、おてがるにdb()
って函数を用意しておきましょうね。
<?php
/**
* @author USAMI Kenta
* @copyright 2016 USAMI Kenta
* @license WTFPL
*/
/**
* @return \PDO
*/
function db()
{
static $db;
if (!$db) {
$db = new \PDO(getenv('DB_DSN'), null, null, [PDO::ATTR_PERSISTENT => true]);
}
return $db;
}
Composerでパッケージを入れてみる
てはじめに、いくつかパッケージを置いてみますね。PHPのライブラリはPackagistから探してきます。
- vlucas/phpdotenv: 設定ファイルをかんたんに読み込めるすごいやつだよ
- twig/twig: いい感じに良いテンプレートエンジンだよ
- twig/extensions: Twigの標準に入ってない機能が追加されてるパッケージだよ
- filp/whoops: エラーをかっこよく画面表示するやつだよ
シェルでこんな感じに実行してみよう。
composer require vlucas/phpdotenv twig/twig twig/extensions
composer require --dev filp/whoops
Whoopsは開発環境用では便利だけど外部公開すると脆弱性とか個人情報漏洩みたいなことも発生しうるので気をつけてね。
index.php
をつくる
じゃ、作ってみましょうか。
<?php
/**
* @author USAMI Kenta
* @copyright 2016 USAMI Kenta
* @license WTFPL
*/
namespace InspireBBS;
require_once dirname(__DIR__) . '/vendor/autoload.php';
// エラーは漏らさず捕捉する
error_reporting(E_ALL | E_STRICT);
// カッコイイエラー画面を表示するための魔法の呪文
$whoops = new \Whoops\Run;
$whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler);
$whoops->register();
echo "こんにちはこんにちは";
PHPのE_NOTICE
を潰すやつは生かしておいてはいけないのでE_ALL | E_STRICT
って書こう。長いのでerror_reporting(-1)
って書いてもいいです。
サーバーを起動します
PHPを起動するにはApacheが要るんじゃないかって? お前がサーバーになるんだよ!
php -S localhost:3939 public/index.php
コマンドラインでこのコマンドを実行すると、PHPちゃんがWebサーバーになってくれます。それがビルトインウェブサーバーってやつです。ローカル開発がしたいだけならApacheとかnginxとか要らない。
ブラウザで http://localhost:3939/ を開いてみる。
こんな感じになれば良いですね。
エラーを見てみる
せっかくのカッコイイエラー表示ツールを入れたので、エラーを起こしてみましょうか。
こんにちはこんにちは、の下あたりにecho $foo;
って書いてみます。
ちなみにデフォルトのエラー表示だと、こんな感じ。
まあ、これでも事は足りるけど… って感じですね。特にエラーが発生する箇所がネストの深い場所だと、わかりやすさにかなりの差があります。
本日のまとめ
- PHPは新鮮な7を入れよう
- Composerを入れよう
- ローカルで開発するならApacheとか要らないよ
- Whoopsは良いものだよ
まだ掲示板は影も形もないし、せっかくインストールしたTwigも使ってないけど… 本日はここまで。
おやすみなさい ヾ(〃><)ノ゙ ZZz...