カテゴリー: PHP

PHPからexec()でスクリプトを実行したときに途中で落ちる場合

PHPからexec()でスクリプトを実行したときに途中で落ちる場合

バックエンドでPHPからスクリプトを実行した場合に
途中で処理が止まってしまう場合がある。

ローカル環境だとエラーログとかにエラーが出てくれる
場合があるけどCPIとかのレンサバに載せたときに何も
エラーを吐いてくれなくてはまったのでメモ。

初心者みたいだ・・・。

とりあえず以下の値を確認する。

phpinfoで「max_execution_time」

スクリプトがパーサにより強制終了されるまでに許容される最大の 時間を秒単位で指定します。この命令は、いい加減に書かれた スクリプトがサーバーの負荷を上げることを防止するのに役立ちます。 デフォルトでは、30 に設定されています。 PHP を コマンドライン から実行する場合のデフォルト設定は 0 です。
最大実行時間は、システムコール、ストリーム操作等の 影響を受けません。より詳細な情報については、 set_time_limit() 関数の説明を参照ください。
セーフモードで実行している場合にはこの設定を ini_set() で変更することはできません。次善策としては セーフモード をオフにするか あるいは php.ini 上で制限時間を変えるしかありません。
Web サーバー側でもタイムアウトの設定項目を持ち、 その設定で PHP の実行が中断されることもあります。 Apache には Timeout ディレクティブ、IIS には CGI タイムアウト関数があり、どちらもデフォルトで 300 秒に設定されています。 これらの意味については、Web サーバーのドキュメントを参照ください。

30秒で足りない場合はset_time_limit()関数とかで設定変える。

そのほかにローカルで動いていて、レンサバで動かない場合は「memory_limit」の
可能性もあるのでそっちも調べる。

RHEL6でnamazuをインストールしてPHPから使う

RHEL6でnamazuをインストールしてPHPから使う

RHEL4のサーバからデータ移行するときにはまったメモ。

■環境

# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.3 (Santiago)

 

# php -v
PHP 5.3.3 (cli) (built: Jul  3 2012 16:53:21)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
    with the ionCube PHP Loader v4.0.14, Copyright (c) 2002-2011, by ionCube Ltd.

■kakashiインストール

$ wget http://kakasi.namazu.org/stable/kakasi-2.3.4.tar.gz
$ tar xzvfp kakasi-2.3.4.tar.gz
$ cd kakasi-2.3.4
$ ./configure
$ make
$ su
# make install

■namazuインストール

$ wget http://www.namazu.org/stable/namazu-2.0.21.tar.gz
$ tar xzvfp namazu-2.0.21.tar.gz
$ cd namazu-2.0.21
$ su
# cd File-MMagic/
# yum -y install perl-ExtUtils-MakeMaker
# perl Makefile.PL && make install
# cd ../
# ./configure
# make
# make install

■namazu.so作成
php-namazuが無いのでそこを対応する

http://sourceforge.jp/projects/php-i18n/
上記サイトよりnamazu-2.3.1.tgzをwget

# wget http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Fphp-i18n%2F14174%2Fnamazu-2.3.1.tgz

http://tzono.com/wiki/index.php?linux%2Fnamazu
上記サイトのように作業しようとするもphpizeコマンドが無い事が発覚。
php-develに同梱されているようなのでインストールする

php-develが入ったところから。。。

# cd namazu-2.3.1
# phpize
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626
# ./configure --with-namazu
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for a sed that does not truncate output... /bin/sed
・・・
# make
# make install
Installing shared extensions:     /usr/lib64/php/modules/

■php.iniを変更する
末尾に以下を追加しapacheをリスタートする

extension="namazu.so"
namazu.debugmode = Off
namazu.lang = ja_JP.SJIS

apacheリスタート後にはphpinfo.phpに「namazu」セクションが追加されている

あとはインデックスの再構築したり。。

■参照URL
サイト内検索システム構築(Namazu)

linux/namazu おどうぐ箱

PHP5 の Namazu モジュールを作成するための Patch

PHPのNamazuモジュールの組み込み

PHPで簡単に死活監視をする方法

PHPで簡単に死活監視をする方法

処理の前に特定のサーバの状態を確認する必要があったのでメモ。

fsockopen関数を利用します。

fsockopen — インターネット接続もしくは Unix ドメインソケット接続をオープンする

■サンプルコード

function ping($host, $port=80, $timeout=5){
    $fsock=@fsockopen($host, $port, $errno, $errstr, $timeout);
    if(!$fsock){
        echo 'errno ... ' . $errno . "\n";
        echo 'errstr ... ' . $errstr . "\n";
        return FALSE;
    }else{
        return TRUE;
    }
}

$host='www.mogumagu.com';
$res=ping($host);

echo $res ? '応答有り' : '応答無し' . "\n";

PHPでSelenium2(WebDriver API)を使うための構成

PHPでSelenium2(WebDriver API)を使うための構成

Seleniumを使っての自動テスト環境を作るときに
いつも何がどの役割なのかわからなくなるので構築
方法をメモする。Seleniumの情報に古いのが多くて
結構はまった。

今回は簡易的なところまででJenkinsと連携して
自動ビルド&自動ユニットテスト&自動UIテストとかは
次の話しということで。
そもそもこのやり方がいいのかちょっとわからないです。。。
おかしなところあったら指摘してください。

■今回の構成

◆クライアントPC(実際にUIテストを行なうPC)

OS:Windows7 32bit
ブラウザ:IE9とFirefox16.0.2
Java:1.7.0_09
IP:192.168.1.10

◆サーバ

VMware上で。
OS:CentOS6.3
Webサーバ:Apache 2.2.15
PHP:5.4.8
PHPUnit:3.7.8
Java:1.7.0_09
IP:192.168.1.100

今回の構成ではクライアントPCとサーバの両方でselenium-server
を起動する形式にする。
selenium-serverはこちらのページの「Selenium Server (formerly the Selenium RC Server)」をダウンロードする。

※この時点でのバージョンは2.25.0

↑今回の構成図

サーバ側はSelenium Gridとして動かし分散実行にも備える。
クライアントPC側は役割をwebdriverとし、ハブとして
サーバ側で起動したSelenium Gridを指定して自身をテスト
マシンとして登録する。

■実際の実行手順

①サーバ側にselenium-serverを配置、役割をハブ(Selenium Grid)として実行。
※デフォルトは4444ポートで起動

$ java -jar selenium-server-standalone-2.25.0.jar -role hub

ブラウザでSelenium Gridの確認
http://192.168.1.100:4444/grid/console

②次にクライアントPCにselenium-serverを配置。役割をwebdriverとして起動。このときにサーバを指定。
※パスは読み替えてください。

C:\work>java -jar selenium-server-standalone-2.25.0.jar -role webdriver -hub http://192.168.1.100:4444/grid/register

この状態でサーバ側のSelenium Gridの画面を確認すると
クライアントPCが表示されているはず。

ブラウザでSelenium Gridの確認
http://192.168.1.100:4444/grid/console

ここまで設定を行えばあとはPHPUnitのテストケースで
「PHPUnit_Extensions_Selenium2TestCase」をextendsして
テストケースを作成し、実行を行えばクライアントPCで指定
したブラウザが立ち上がりテストが実行される。

記述方法はPHPUnitのページにあります。

サポートしているメソッドとか、実際の記述方法は
PHPUnit_Extensions_Selenium2TestCase のエンドツーエンドテストを確認してください。

以下実際に動かしたサンプルテストケース(SeleneseTest.php)
※seleniumのページを開いてtitleの内容をチェック。
※setHostに「192.168.1.100」、setPortに「4444」を指定する

class Selenese2Test extends PHPUnit_Extensions_Selenium2TestCase {

    protected function setUp() {
        $this->setHost("192.168.1.100");
        $this->setPort(4444);
        //$this->setBrowser("internet explorer");
        $this->setBrowser("firefox");
        $this->setBrowserUrl("https://www.google.co.jp/");
    }

  public function testMyTestCase()
  {
        $this->url('http://seleniumhq.org/');
        $this->assertEquals('Selenium - Web Browser Automation', $this->title());
  }
}

③テストケースを実行する。

$ phpunit SeleneseTest.php
PHPUnit 3.7.8 by Sebastian Bergmann.

.

Time: 14 seconds, Memory: 1.50Mb

OK (1 test, 1 assertion)

Selenium Grid経由で192.168.1.10のFirefoxが立ち上がりテストが始まる。

これで完了。
クライアントでIE9を使うとエラーが表示されるかもしれない。
こんなやつ↓
「リモートデバイスまたはリソースが接続を受け付けません」
これはブラウザの設定で「ツール」⇒「インターネットオプション」⇒「セキュリティ」で
全部のセキュリティゾーンの設定(保護モード)をそろえればいいということらしい。

Selenium2のInternetExplorerDriverでエラーになった

今回はSelenium Gridとphpunitの実行を同じサーバでおこなったけど
別に一緒のサーバでやる必要はないです。
使えるリソースが無かっただけです。。。。

■参考サイト
Selenium2.0 WebDriverで複数ブラウザのUIテスト もう一度、Selenium再入門
PHPUnit Manual 第17章 PHPUnit と Selenium
Selenium 2.0 と WebDriver
Selenium2.0ってどんなもの?とりあえず動かしてみよう!
Selenium + PHPUnitで簡単エンドツーエンドテストを実現する
Seleniumを使ったWeb UI自動テストシステムの構築でやったことまとめ
Selenium2のInternetExplorerDriverでエラーになった

メモ:SymfonyではじめるDIを読んだので実際に写経した。

vol.71は楽しい記事が多いなぁ~。
WEB+DB PRESSでSymfonyではじめるDIを読んだので実際に写経する。

■まずphpのバージョン確認(Composerの兼ね合いで。。)

$ php -v
PHP 5.3.3 (cli) (built: Jul  3 2012 16:40:30)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

■Composerのインストール

$ curl -s http://getcomposer.org/installer | php
#!/usr/bin/env php
Some settings on your machine may cause stability issues with Composer.
If you encounter issues, try to change the following:

Your PHP (5.3.3) is quite old, upgrading to PHP 5.3.4 or higher is recommended.
Composer works with 5.3.2+ for most people, but there might be edge case issues.

Downloading...

Composer successfully installed to: /path/symfony_DI/composer.phar
Use it: php composer.phar

バージョンで文句言われたけど無視。

■Composer用の設定ファイル作成
$ vim composer.json

{
        "require":{
                "symfony/dependency-injection": "2.1.*",
                "symfony/config": "2.1.*",
                "symfony/yaml": "2.1.*"
        }
}

 

$ ll
total 632
drwxrwxr-x 2 takeuchi takeuchi   4096 Oct 31 15:21 ./
drwxrwxrwx 8 takeuchi takeuchi   4096 Oct 31 15:18 ../
-rw-rw-r-- 1 takeuchi takeuchi    118 Oct 31 15:21 composer.json
-rwxr-xr-x 1 takeuchi takeuchi 631264 Oct 31 15:18 composer.phar*

■依存パッケージの取得

$ php composer.phar install
Loading composer repositories with package information
Installing dependencies
  - Installing symfony/dependency-injection (v2.1.3)
    Downloading: 100%

  - Installing symfony/config (v2.1.3)
    Downloading: 100%

  - Installing symfony/yaml (v2.1.3)
    Downloading: 100%

Writing lock file
Generating autoload files
$ ll
total 644
drwxrwxr-x 3 takeuchi takeuchi   4096 Oct 31 15:23 ./
drwxrwxrwx 8 takeuchi takeuchi   4096 Oct 31 15:18 ../
-rw-rw-r-- 1 takeuchi takeuchi    118 Oct 31 15:21 composer.json
-rw-rw-r-- 1 takeuchi takeuchi   4939 Oct 31 15:23 composer.lock
-rwxr-xr-x 1 takeuchi takeuchi 631264 Oct 31 15:18 composer.phar*
drwxrwxr-x 4 takeuchi takeuchi   4096 Oct 31 15:23 vendor/

■依存のないクラスの実装とかそれ以降のコード
$ vim initial.php

namespace App{
         class Controller{
                private $memberRegistration;
                private $router;
                private $templating;
                public function __construct(){
                        echo __METHOD__.PHP_EOL;
                }
                public function registerAction(){
                        echo __METHOD__.PHP_EOL;
                        $memberData=$this->getRequestData();
                        $this->memberRegistration->register($memberData);
                        $html=$this->templating->render('register');
                        return $html;
                }
                public function setMemberRegistration(\Domain\MemberRegistration $memberRegistration){
                        echo __METHOD__.PHP_EOL;
                        $this->memberRegistration=$memberRegistration;
                }
                public function setRouter(\App\Router $router){
                        echo __METHOD__.PHP_EOL;
                        $this->router=$router;
                }
                public function setTemplating(\App\Templating $templating){
                        echo __METHOD__.PHP_EOL;
                        $this->templating=$templating;
                }
                private function getRequestData(){
                        return array();
                }

        }

        class Templating{
                private $router;
                public function __construct(){
                        echo __METHOD__.PHP_EOL;
                }
                public function render($templateName){
                        echo __METHOD__.PHP_EOL;
                        $url=$this->router->generateUrl('test');
                }
                //セッターインジェクション
                public function setRouter(\App\Router $router){
                        $this->router=$router;
                }
        }

        class Router{
                public function __construct(){
                        echo __METHOD__.PHP_EOL;
                }
                public function generateUrl(){
                        echo __METHOD__.PHP_EOL;
                }
        }
}

namespace Domain{
        class MemberRegistration{
                public function __construct(){
                        echo __METHOD__.PHP_EOL;
                }
                public function register($memberData){
                        echo __METHOD__.PHP_EOL;
                }
        }
}

namespace{
        require_once 'vendor/autoload.php';
        use Symfony\Component\DependencyInjection\ContainerBuilder;
        use Symfony\Component\DependencyInjection\Reference;

        $container=new ContainerBuilder();

        $container->register('app.controller', '\App\Controller')
                ->addMethodCall('setTemplating', array(new Reference('app.templating'),))
                ->addMethodCall('setRouter', array(new Reference('app.router'),))
                ->addMethodCall('setMemberRegistration', array(new Reference('domain.member_registration'),));

        $container->register('app.templating', '\App\Templating')
                ->addMethodCall('setRouter', array(new Reference('app.router'),));

        $container->register('app.router', '\App\Router');

        $container->register('domain.member_registration', '\Domain\MemberRegistration');

        $controller=$container->get('app.controller');
        $controller->registerAction();
}

■実行結果

$ php initial.php
App\Controller::__construct
App\Templating::__construct
App\Router::__construct
App\Controller::setTemplating
App\Controller::setRouter
Domain\MemberRegistration::__construct
App\Controller::setMemberRegistration
App\Controller::registerAction
Domain\MemberRegistration::register
App\Templating::render
App\Router::generateUrl

このあとはYAMLにしたりダンプで再利用とか。

■参考URL
PHPの外部ライブラリの管理にComposerを使う

HerokuでPHP

HerokuでPHP

WEB+DB PRESSのvol.71のHeroku特集を見てRailsで試してみたけど
PHPも動くらしいのでやってみた。

Play framework2を試すはずなのに脱線しまくり。

ではHerokuでPHPを動かしてみる。
Herokuのアカウント持ってて、herokuコマンドインストール済みのログイン済みで以下。

$ mkdir myapp
$ cd myapp/
$ git init
Initialized empty Git repository in /path/myapp/.git/
$ vim index.php
<?php echo "Hello Heroku!!";

phpinfo();

?>
$ git add .
$ git commit -m "first commit"
[master (root-commit) 024c43b] first commit
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 index.php
$ heroku create --stack cedar
Creating evening-chamber-8448... done, stack is cedar
http://evening-chamber-8448.herokuapp.com/ | git@heroku.com:evening-chamber-8448.git
Git remote heroku added
$ git push heroku master
Counting objects: 3, done.
Writing objects: 100% (3/3), 252 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)

-----> Heroku receiving push
-----> PHP app detected
-----> Bundling Apache version 2.2.22
-----> Bundling PHP version 5.3.10
-----> Discovering process types
       Procfile declares types -> (none)
       Default types for PHP   -> web
-----> Compiled slug size: 9.5MB
-----> Launching... done, v4
       http://evening-chamber-8448.herokuapp.com deployed to Heroku

To git@heroku.com:evening-chamber-8448.git
 * [new branch]      master -> master

今回であれば以下にブラウザでアクセスすれば表示されるはず(もう消したけど)
http://evening-chamber-8448.herokuapp.com/

すっごい簡単。。

※index.php置かないと

-----> Heroku receiving push
 !     Heroku push rejected, no Cedar-supported app detected

To git@heroku.com:laxherokuphptest.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@heroku.com:laxherokuphptest.git'

とか言われるので注意。

で実際にphpinfoを見てみるとmbstringが無いのでググって調べる。

herokuで(mbstring有効な)phpがすぐ動いた

HerokuのBuildpackを利用してmbstringが有効なPHPサーバを立ててみた

buildpackを使ってみればいいのか。
ということでもう一度再挑戦。

$ mkdir myapp
$ cd myapp/
$ git init
Initialized empty Git repository in /path/myapp/.git/
$ vim index.php
<?php echo "Hello Heroku!!";

phpinfo();

?>
$ git add .
$ git commit -m "first commit"
[master (root-commit) 1dca1f5] first commit
 1 files changed, 5 insertions(+), 0 deletions(-)
 create mode 100644 index.php
$ heroku create --buildpack https://github.com/winglian/heroku-buildpack-php -s cedar
Creating stark-wildwood-1510... done, stack is cedar
BUILDPACK_URL=https://github.com/winglian/heroku-buildpack-php
http://stark-wildwood-1510.herokuapp.com/ | git@heroku.com:stark-wildwood-1510.git
Git remote heroku added
$ git push heroku master
Counting objects: 3, done.
Writing objects: 100% (3/3), 261 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)

-----> Heroku receiving push
-----> Fetching custom git buildpack... done
-----> PHP app detected
-----> Extracting Apache 2.4.3 PHP 5.4.8 build 2.0-a4
-----> from http://vulcan-wlian.herokuapp.com/output/b8bace2a-2a8e-4441-acc3-eb8e6ad608a5
Creating Slug Identifier file with id: c24ac748141520640ed3220f65e2cde0
-----> Discovering process types
       Procfile declares types -> (none)
       Default types for PHP   -> web
-----> Compiled slug size: 10.3MB
-----> Launching... done, v5
       http://stark-wildwood-1510.herokuapp.com deployed to Heroku

To git@heroku.com:stark-wildwood-1510.git
 * [new branch]      master -> master

mbstring入ったーbuildpackすげー。
というかこのbuildpack PHP5.4.8だし

herokuでPHP面白いかも。

こんなのも見つけた。

mhoofman / wordpress-heroku

Symfony2 on heroku (other php frameworks too)

PHPプログラム中でapacheユーザでchownする方法

PHPプログラム中でapacheユーザでchownする方法

PHPでブラウザからプログラムを動かして、
作成したファイルやフォルダの権限を変更したい場合のやり方。

通常はapacehユーザでファイルやフォルダが作成
されてしまうのでプログラム中でchownを実行したいの
だけれど、chownはrootで動かさないとなのでこのまま
単純にchownを実行しても権限やグループを変えることが
できない。

そこで、sudoでapacheユーザに特定のコマンドだけを許すように設定
を変更する。

# visudo

apache ALL=(ALL) NOPASSWD: /bin/mkdir, /bin/chown

上記の場合はapacheユーザにパスワード無しで「mkdir」と「chown」の実行を許可している。
他のコマンドも許可したければ、続けて記述していけばOK。

これで大丈夫かなと思って実行してみたらchownで変更できていない。
エラーログを見ると以下のメッセーが・・・。

「sudo: sorry, you must have a tty to run sudo」

SSHクライアントとかコンソールではエラーが出ないのに。。。
調べてみると「Defaults requiretty」をコメントアウトすればいいことが判明。

# visudo

Defaults requiretty
↓
#Defaults requiretty

するとエラーが出なくなり、無事にchownが実行できた。

■参考URL

Apacheユーザーでsudo

TTY経由でないsudoの実行

PHPプログラム内でPOSTを飛ばしたらContent-type not specified assuming application/x-www-form-urlencoded

PHPのプログラム内からPOSTでリクエストを飛ばしたときに
出たエラーのメモ。

■エラーが出た状態

$url='http://wwww.example.com/xxxx.php';
$data=array(
    'data1' => 'xxxxxxxx',
    'data2' => 'yyyyyyyy'
);

$options = array(
    'http' => array(
        'method' => 'POST',
        'content' => http_build_query($data)
    )
);
$contents = file_get_contents($url, false, stream_context_create($options));

■発生したエラー

Severity: Notice –> file_get_contents() [function.file-get-contents]: Content-type not specified assuming application/x-www-form-urlencoded xxxxxxxxx.php 80

headerを追加して対応。

■修正版

$url='http://wwww.example.com/xxxx.php';
$data=array(
    'data1' => 'xxxxxxxx',
    'data2' => 'yyyyyyyy'
);

$headers = array(
    'Content-Type: application/x-www-form-urlencoded',
    'Content-Length: '.strlen(http_build_query($data))
        );

$options = array(
    'http' => array(
        'method' => 'POST',
        'content' => http_build_query($data),
        'header' => implode("\r\n", $headers),
    )
);
$contents = file_get_contents($url, false, stream_context_create($options));

■参考URL

とても簡単にPHPからPOSTリクエストを送信する方法【PHP】

[PHPエラー] Content-type not specified assuming application/x-www-form-urlencoded の対処法

PHPでセッションの有効期限を延ばす設定

セッションの寿命を延ばす

クッキーに有効期限を設定できる場合はこれが簡単。
主に徳丸本より。

PHPの場合

session_set_cookie_params関数でセッションIDを保持するクッキーの有効期限を設定する。
php.iniもしくは.htaccess等でsession.gc_maxlifetime設定の時間を延ばす。
session.gc_maxlifetimeはデフォルトで1440秒(24分)に設定されている。

php.iniで有効期限を最低3時間にする例

session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 10800

【参考サイト】

【PHP】セッションタイムアウトの時間を設定する

セッション(session)の有効期限を設定するには

セッションのガーベッジコレクションをテストする

PHP のセッション寿命の設定

session_set_cookie_params関数

session_get_cookie_params関数

session.gc_maxlifetime

session.gc_probability

session.gc_divisor

効率的なWebアプリケーションの作り方のメモ


最近「効率的なWebアプリケーションの作り方」読んで写経してます。
目次

■Part1 MVC開発の基礎知識

  • 1章 MVC開発の概要
  • 2章 オブジェクト指向

■Part2 フレームワークを利用する利点

  • 3章 レガシーコードの欠点
  • 4章 リファクタリング・デザインパターン実践
  • 5章 フレームワークを活用する

■Part3 モダンPHP Webアプリケーション開発

  • 6章 アプリケーション開発を始めるための準備
  • 7章 データベースとエンティティ
  • 8章 コントローラとビュー
  • 9章 フォームとデータベース

■Part4 機能の作成と実装のパターン化

  • 10章 ユーザ登録
  • 11章 イテレーション
  • 12章 管理画面
  • 13章 コマンドラインスクリプト
  • 14章 ユニットテスト
  • 15章 機能テスト

Part1、Part2はオブジェクト指向、フレームワークに関することがすごく
コンパクトにまとめられててとってもいいと思った。

ここにまとめられていることはオブジェクト指向の分厚い本で出てくる内容なので
先にこの本で概要を見てから分厚い本に取り組めばより理解しやすいんじゃないかなと思う。
普通のPHPの本では触れられていないところが記載されている感じ。

Part3からはSymfony2を使っての開発を一通り行う構成。
この本が出た当初のSymfonyのバージョンは2.0.11だけど9月に2.1.2が
出てるので公式サイトからそのまま落とすと設定ファイルの内容が違ったりして
テンパる。
本に沿って写経するなら公式サイトから2.0.17のstandardをダウンロードする。

Download

そのほかにPart3を現在写経するにあたって問題がありそうなのは、
7章のデータフィクスチャのところ。
本に記述してあるやり方では入らなかったので公式サイトに書いてある
やり方で設定する必要がある。
DoctrineFixturesBundle
このページでも2.0バージョンを選択しないとやり方が違うので注意。

あとは8章のViewを作っていくところで、サンプルのソースコードを
そのまま入力するとまだ読み込んでいないパラメータとかを使っていて
エラーがでるので、画面のエラーメッセージを見つつ修正していく必要があった。

あとは技術評論社のサポートページからサンプルソースを落として
見比べながらやっていけばOK。

ほかの書評記事でも書いている通り初心者がSymfony2を覚えるための本では
ないなーという感じ。
PHPでDDDで組むための参考にはちょうどいいと感じた。

まだ習得できてないけどね。