Strings of Life

PHP/Phalcon/MySQL/JavaScript/RegExp/Ruby/Perl/ActionScript

タグ:php







本書の対象読者は、「PHPによるプログラミングを始めて少なくとも半年から1年以上の経験があり、PHPの基本的な文法を習得している人」「PHP以外にも、HTML、データベース、JavaScript、Linuxの基本知識が必要」。

ということで、中級者向けのPHP入門書なわけだけど、それにしてはちょっとなあ、という部分が少なくない。構成としては、テンプレートエンジン + ベタ書きPHP→オブジェクト指向を使用→フレームワーク という流れで、少しずつモダンになっていくのだけど、最終到達点がCakePHPの1.3系では、2013年の今から見ると、古い印象は拭えない。


1.3系に留まっているのには、出版のタイミングと、書籍化までのタイムラグもあったのだろう(CakePHP2.0.0は、2011年10月リリース。本書は2012年1月刊行なので、CakePHP2系対応は現実的ではない)。

また、CakePHPの1系と2系はアップグレードの筋道が確保されているので、1系で作ったアプリケーションを2系に上げることは、簡単ではないにせよ、可能である。

とはいえ、2013年現在、新しいWebアプリを作るためにCakePHP 1.3を採用することは、ほとんどありえない。

いま、CakePHPを学ぶなら『CakePHP2 実践入門』等の2系について解説した本を読むべきだろう。また、日本語の入門書が無いのが痛いが、PHP5.3以上に対応したモダンなフレームワークについて学びたいなら、Symfony2が良い。


率直に言って、本書を読む意義が、イマイチ見いだせない。PHP中級者向けの書籍としては、『パーフェクトPHP』が定番。名前空間をはじめとしたPHP5.3の新機能をきっちり解説してあり、2013年現在でも、他の追随を許さない。


本書は、出版当時(2012年1月)であれば、現実的な範囲でモダンな内容だったのかもしれない。だが、現在では、ややレガシーな印象を受ける。出版時期の悪さと、掘り下げの少なさが災いして、あっという間に賞味期限が切れてしまった書籍だと思う。

twitter APIにアクセスするためのPHP製ライブラリとしては、codebirdtwitteroauthなどありますが、大抵はcurl系の関数を使っています。

ただ、curl系の関数は必ず使えるわけではなく、コンパイルオプションを指定したり、PHP 5.5以降ではPECLからインストールしたりする必要があります。

一方、PHPには、組み込みでリクエストの送信を行える関数が存在します。file_get_contents()です(fopen()でもおそらく可)。php.iniで「allow_url_fopen = On」と設定されていれば、file_get_contents()の第三引数にコンテキストリソースを渡すことで、HTTPリクエストを行うことができます。

なお、OAuthに関しては、処理が複雑なので、今回はライブラリ(oauth-php)を利用します。
<?php

require_once __DIR__ . '/OAuth.php';

// アプリケーションのコンシューマキー、アクセストークンを設定
$consumer_key = '';
$consumer_secret = '';
$access_token = '';
$access_secret = '';

// リクエストを行うURL
$url = 'https://api.twitter.com/1.1/statuses/update.json';

// 投稿は POST
$method = 'POST';

$tweet = 'ツイートテスト' . mt_rand(0, 100); // 同じツイートは繰り返せないので、後ろに乱数をくっつける(繰り返しのテストをやりやすくするため)

$parameters = array('status' => $tweet);

// OAuth関係の処理
$sha1_method = new OAuthSignatureMethod_HMAC_SHA1();
$consumer = new OAuthConsumer($consumer_key, $consumer_secret);
$token = new OAuthConsumer($access_token, $access_secret);
$request = OAuthRequest::from_consumer_and_token($consumer, $token, $method, $url, $parameters);
$request->sign_request($sha1_method, $consumer, $token);

$options = array(
  'http'=>array(
    'method'  => $request->get_normalized_http_method(),
    'header'  => 'Content-Type: application/x-www-form-urlencoded',
    'content' => $request->to_postdata()
  )
);
$context = stream_context_create($options);

$result = file_get_contents($request->get_normalized_http_url(), false, $context); // ツイートを行う

$result = json_decode($result); // twitterから返ってきたJSON文字列を配列に変換
var_dump($result);

参考:OAuth.phpだけで twitter APIする
上記参考URLのスクリプトを参考に、(1) twitter APIのURLを最新版に修正 (2) リクエストのヘッダーにContent-Typeを追加 を行いました。

・Mac OS X 10.8
・VMWare Fusion 5
・DVD版isoのDebian 7.1

1. インストールダイアログに従ってインストール
GUI環境とかはインストールしない。入れるのはsystem utilities、Webサーバ、SSHサーバ。SQLサーバはここでは入れない。

2. rootでログイン

3. vimをインストール
(1) aptitude install vim
(2) vim ~/.bashrc
(3) 以下の行を追記
export EDITOR=/usr/bin/vim
export GIT_EDITOR=/usr/bin/vim

4. sudoをインストール
(1) aptitude install sudo
(2) visudo
(3) インストール時に作った一般ユーザーユーザーを追加

5. rootはログアウト。インストール時に作った一般ユーザーで再ログイン。

6. gitをインストール
(1) sudo aptitude install git
(2) git config --global color.ui auto をやっておくとハッピー

7. bash-itをインストール(bashの見た目を整えるだけなので任意で)
(1) git clone http://github.com/revans/bash-it.git ~/.bash_it
(2)
~/.bash_it/install.sh(オプションは全てN又はnone)
(3) vim ~/.bash_profile
(4) .bash_profile の以下の行をコメントアウト
export EDITOR="/usr/bin/mate -w"
export GIT_EDITOR='/usr/bin/mate -w'
(5) .bash_profile の末尾に以下のスクリプトを追記(.bashrcを利用するため)
if [ -f ~/.bashrc ]; then
  source ~/.bashrc
fi

8. MySQLをインストール
(1) sudo aptitude install mysql-server
(2) インストール中に聞かれるrootのパスワードは「pass」で
(3) mysql -uroot -ppass で起動確認

9. PHPをインストール(symfony1を動かす前提なので、php5-apc、php5-xslをインストール)
(1) sudo aptitude install php5 php5-cli php5-mysql php-pear php5-dev php-apc php5-xsl

10. php.iniを編集してshort_open_tagをOffに(symfonyのcheck_configuration.phpに怒られるため)
(1) sudo vim /etc/php5/apache2/php.ini

(2) sudo vim /etc/php5/cli/php.ini

11. symfonyの設定チェック
(1) wget http://sf-to.org/1.4/check.php
(2) php check.php → 全てOKのはず

12. symfonyをダウンロード
(1) wget http://pear.symfony-project.com/get/symfony-1.4.20.tgz

あとは
http://symfony.com/legacy/doc/gentle-introduction/1_4/jaあたりを読めば…

Symfony勉強会#8に参加してきました。

Symfony勉強会#8では、Symfony初心者向けのハンズオンセミナーが開催されました。Webアプリケーションフレームワークのハンズオンセミナー、私は受講者側でしか経験がありませんが、ハマりどころが無数にあり、主催者の苦労が偲ばれます。

私自身、Symfonyは一応インストール(というかぶっちゃけ、ダウンロードだけ…)はしておいたものの、動作確認はしていませんでした。案の定、会場で動かしてみると動作せず。。。Macで動かすのは諦めてVMのCentOSに環境構築。それでもApacheが上手く動かず、TAの方にPHPのビルトインサーバーの起動方法を教えてもらい、それで何とか動きました。

丁寧にサポートしていただいたTAの方に感謝です。というか、動作確認くらいしておくべきでした。。。


OS、普段はMac + CentOSで事足りてるんですが、新し目のフレームワークを触るときには、標準リポジトリがPHP5.4対応しているOSを使うべきですね(CentOS、サポート期間が長いのは非常に有り難いんだけど、PHP 5.3.3 / MySQL 5.1は古すぎ…)。あと、yumの代替リポジトリ登録で古い情報つかんでハマったので、ソースからmakeしてインストールする練習もしておかないと。

また、sshで接続してvimで編集してたらソースコードのコピペ時にインデントが崩れまくったので、CyberduckでSFTP接続してSublime Textで編集に切り替えました。意外な落とし穴。


本題のSymfonyに関しては、symfony 1とSymfony2は全く別物ということが実感できました。フルスタックのMVCフレームワークという特徴と、フレームワークの名前、開発リーダーくらいしか共通点がありません。

ディレクトリ構造も全然違いますし、symfony 1でお馴染みのsymfonyコマンドは、Symfony2では app/console です。

symfony 1は普通のフルスタックMVCフレームワークですが、Symfony2は、一部モジュールだけを取り出してマイクロフレームワークを作ったり、モジュール単位でライブラリとしての利用も可能です。

Symfony2は、名前空間等のPHP5.3の機能をフル活用し、根本的な設計変更を行なっています。


感心したのは「依存性の注入(DI, Dependency Injection)」という概念。クラスごとの結びつきは最低限にとどめておいて、設定ファイルで実際の動きを制御する。動きを変えたいときは、ソースコードを変えなくても設定ファイルを変えればよいので、変更に強くなります。


今回のSymfony勉強会をきっかけにSymfony2を使うようになるかというと、そうはなりそうにないですね。。。新しいフレームワークを覚えるよりも先に、知識の基礎固めが必要でしょう。しかしSymfony2、コードも洗練されてるし、開発用の機能も豊富。そして、Symfonyユーザー会の方々もカッコ良い。いずれはSymfony2で開発したいな、と思いました。

このページのトップヘ