PHP Conference 2012に来ています。

PHPプログラマー・・・募集っっっ!!圧倒的・・・募集っっっ!!徹頭徹尾、募集っっっ!!

最近、大門からほど近い会社さんに週2日いってPHPプロジェクトのお手伝いをしています。所謂一つのレガシー改善というやつです。

PHP5.3.3 + CakePHP1.3って感じなんですが、圧倒的にPHPプログラマーが足りないっ!

なので、PHPプログラマーのかた、フリーランス・開発会社様、問いませんので、PHPプログラマーのかた、またはPHPプログラマーをご存知のかた、ご紹介いただけると嬉しいです・・・。(出来れば僕といっしょに常駐していただければなお・・・)

もちろんtestディレクトリなんて空っぽだったのでテストを追加したり、jenkinsでCI環境作ったりしています。一緒にPHPをガリガリ書いてくださるかたを募集しています。というか助けてください・・・。

ご連絡はTwitterで@komagataもしくはkomagata@gmail.comまで「興味あるよ!」って感じでいただければありがたいです。

※追記:

「来週までにPHPとCakePHP覚えといて」

と無茶振りしてるので、チンカスーくん(チンカス + わぷーくん)もいます。

関連:レガシーPHP改善日記シリーズ

cakephp1.3はwebアプリとしてのtestrunnerしか無い。terminalからやりたいとかjenkinsでshell exexuteしたいときとかに困る。

神の子、@itemanさん達が作られてるStagehand_TestRunnerがCakePHP x simpletestの実行に対応してるのでそれを使えばOK。

CLI のための継続的テストランナー v3 - Stagehand_TestRunner - Piece Framework

Stagehand_TestRunnerをComposerでインストール

% vi composer.json 
{
  "require": {
    "piece/stagehand-testrunner": ">=3.3.1"
  }
}
% php composer.phar install
% ./vendor/bin/testrunner --preload-script=vendor/autoload.php --cakephp-app-path=app --cakephp-core-path=cake cakephp app/tests/cases/models/post.test.php

(ハマっていた時、Twitterで@itemanさん、@rskyさんに助けていただきました。ありがとうございます。)

% curl -s http://getcomposer.org/installer | php

http://packagist.org/ を見て欲しいライブラリをcomposer.jsonを書く。

% php composer.phar install

bundle installと同じ。vendor以下に色々入る。あとはアプリの方でvendor/autoload.phpをrequireすればいい。(Bundler.requireみたいなもん)

xxx.pharはxxx.jarみたいなもん。

CakePHP1.3でtestを書くにはsimpletestが必要。(デフォルトで付いてない)CakePHP1.3はちょっと古いのでsimpletestの最新では動かないので1.0系を使う。

まずFixtureを書く。Fixtureはクラスで書く。(これyamlとかでできないかなあ)

<?php
class PostFixture extends CakeTestFixture {
    var $name = 'Post';
    var $table = 'posts';

    var $fields = array(
        'id' => array(
            'type'    => 'integer',
            'null'    => false,
            'key'     => 'primary'
        ),
        'name' => array(
            'type'    => 'integer',
            'null'    => false
        )
    );

    var $records = array(
        array('id' => 1, 'name' => 'komagata'),
        array('id' => 2, 'name' => 'machida'),
        array('id' => 3, 'name' => 'yoshida')
    );
}
?>

modelのテストケースを書く。

<?php
class TestPost extends Post {
    var $cacheSources = false;
    var $useDbConfig = 'test';
}

class PostTestCase extends CakeTestCase {
    var $Post = null;
    var $fixtures = array('app.post');

    function startTest() {
        $this->Post =& ClassRegistry::init('Post');
    }

    function endTest() {
        unset($this->Post);
        ClassRegistry::flush();
    }

    function testPostInstance() {
        $this->assertTrue(is_a($this->Post, 'Post'));
    }

    function testFetchKomagata() {
        $this->Post->recursive = -1;
        $result = $this->Post->fetchKomagata();
        $expected =  array(
            'Post' => array('id' => 1, 'name' => 'komagata')
        );
        $this->assertEqual($result[0], $expected);
    }
}
?>

こんな感じ。/test.phpから結果が見れる。

phpの読み込みはコメントアウトされてるので外す。

# /etc/apache2/httpd.conf:
LoadModule php5_module libexec/apache2/libphp5.so

VirtualHostの設定の読み込みがデフォルトでコメントアウトされてるので外す。(罠)

# /etc/apache2/httpd.conf:
Include /private/etc/apache2/extra/httpd-vhosts.conf

Web共有は無くなったのでapachectlを使う。

% sudo apachectl restart

Selenium RCをインストール

PHPUnitをインストール

PHPUnit_Seleniumをインストール。

% pear install phpunit/PHPUnit_Selenium

testを書く(ファイル名はクラスと同じCamelCase)

test/integrations/LoginTest.php

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';

class LoginTest extends PHPUnit_Extensions_SeleniumTestCase
{
    protected function setUp()
    {
        $this->setBrowser('*firefox');
        $this->setBrowserUrl('http://foo/');
    }

    public function testTitle()
    {
        $this->open('/sign_in');
        $this->assertTitle('Sign In');
        $this->type('account', 'foo');
        $this->type('password', 'password');
        $this->submitAndWait('user_form');
        $this->assertTitle('Dashboard');
    }
}
?>

実行。対象ディレクトリ以下のなんとかTest.phpを全部実行する。

$ phpunit test/integrations

cakephp1.3系(+svn)のプロジェクトのテコ入れ的な仕事をやることになったのですが、php浦島状態です。下記、もしわかれば教えていただけるとありがたいです!

  • エンドツーエンドテストがしたい。(selenium rc+simpletestなのかな?)
  • CIしたい。(jenkins + selenium rc+simpletest or phpunitとかでできるのかな?)
  • migrationしたい。(若干あきらめ気味)
  • deployはどうやるんだろう?
  • stagingとproductionを簡単に切り替えるdeployがしたい(贅沢?)

識者の方、なにとぞ、なにとぞ・・・ m(_ _)m

追記:

@yandoさんに教えてもらった情報。

migration = migration plugin

deploy =cap-cake (capistrano)

あとはエンドツーエンドテストが気になります。(個人的にbehatはやり過ぎ感)

phpでアップロードサイズね。はいはい、upload_max_filesize、ワロスワロスとかいってっとやべーぞ!

nginxのclient_max_body_sizeとphp.iniのupload_max_filesize, post_max_sizeを変える必要がある。

それぞれデフォルトは1MB, 2MB, 8MBになってっからデカイ画像とかアップできない。

# nginx
client_max_body_size 32M;
; php.ini
post_max_size = 32M
upload_max_filesize = 32M

WordPressで複数カラムでorder byしたかったんで調べたんですが、WordPressではSQLの代わりにWP_Queryってのがあって記法が独特。

SQL:

SELECT * FROM foo ORDER BY name ASC, id DESC

WP_Query:

orderby=name id&order=ASC DESC

SQL Injectionが多発したので別記法を強制したいんだと推測しますが、プレースホルダでもORMでもなく、何故別の文字列ベースの記法になったのかはワカラナイ。

さくらVPS 512のDebian Squeezeに入れた。(さくらVPS 512にSqueezeを入れる方法はこちら

apacheと古いphp5を削除

$ sudo apt-get remove --purge apache2* apache2.2* php5*
$ sudo apt-get autoremove

dotdeb

$ sudo vi /etc/apt/source.list
deb http://packages.dotdeb.org squeeze all
deb-src http://packages.dotdeb.org squeeze all
$ wget http://www.dotdeb.org/dotdeb.gpg
$ cat dotdeb.gpg | sudo apt-key add -
$ rm dotdeb.gpg

nginx

$ sudo apt-get install nginx
server {
        listen 80;
        server_name unk.fjord.jp;

        location / {
                root /var/www/unk.fjord.jp;
                index index.html index.php;
        }

        location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME /var/www/unk.fjord.jp$fastcgi_script_name;
        }
}

php5-fpm

$ sudo apt-get install php5-fpm

apc

$ sudo apt-get install php5-apc

mysql

$ sudo apt-get install mysql-client mysql-server php5-mysql

wordpress

(略)

速いし良い感じッス。