26
PHP PHP の今とこれから の今とこれから 2012 2012 日本PHPユーザ会 廣川 類 PHPカンファレンス2012 2012915()

PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

Embed Size (px)

DESCRIPTION

Summary of recent activity in the PHP community, new feature of PHP 5.3, 5.4 and 5.5. This presentation is written by Japanese.

Citation preview

Page 1: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

PHPPHPの今とこれから の今とこれから 20122012

日本PHPユーザ会 廣川 類

PHPカンファレンス2012

2012年9月15日(土)

Page 2: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

ポスト5.3時代のコード

マイクロフレームワークSlimの例

モジュラーデザイン:名前空間、オートローダー

<?phprequire 'vendor/autoload.php';

$app = new \Slim\Slim();$app->get('/hello/:name', function ($name) use ($app) { $app->render('tpl1.php', array('name'=> $name));});$app->run();

[tpl1.php]Hello, <?= $name; ?>

[tpl1.php]Hello, <?= $name; ?>

Hello, taroHello, tarohttp://www.example.com/hello/tarohttp://www.example.com/hello/taro

ComposedComposed

無名関数無名関数

名前空間名前空間

Page 3: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

PHP アンケート 2012

主に使っているPHPのバージョン1) PHP 4.x 2) PHP 5.0-5.1 3) PHP 5.2 4) PHP 5.35) PHP 5.4 6) 使ってない

Page 4: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

PHPユーザ分布

引用: W3Techs.com, 2012/9/8版

77.9%

21.2%

4.0%1.2%0.9%0.6%0.2%

usage of server-side programming language (2012/9/8)

PHPASP.NETJavaColdFusionPerlRuby

54.3%

8.9%

7.0%

3.7%

3.3%

22.8%

Market Share of CMS

WordPressJoomlaDrupalvBulletinBloggerother

Page 5: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

PHPユーザ分布

引用: W3Techs.com, 2012/9/8版

95.7%

4.3%

Version of PHP (2012/9/8, W3Techs.com)

PHP 5PHP 4

4.1%

58.6%

36.5%

0.7%

version of PHP 5 (2012/9/8, W3Techs.com)

5.1

5.2

5.3

5.4

Page 6: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

バージョンを更新する/しない理由

・新機能/性能が魅力的

・セキュリティ/バグ修正

・サポート切れ

・新機能/性能が魅力的

・セキュリティ/バグ修正

・サポート切れ

・更新/確認の手間

・新機能/性能の魅力小

・周辺環境の更新が追いつかない

・更新/確認の手間

・新機能/性能の魅力小

・周辺環境の更新が追いつかない

更新する理由 更新しない理由

「開発リソースの有効活用」とサポートの両立が課題

Page 7: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

PHPの歩み

・自動グローバル変数のデフォルト無効化・mbregex・zend-multibyte

2003 2004 2005 2006 2007 2008 2009

4.3・CLI・stream

4.4`02/12 `05/6

・バグ修正`08/8 (EOL)

2010

5.3`09/6

・名前空間・クロージャ・遅延静的束縛・GC改善・MySQLnd

5.5

PHP10周年

JPUG10周年

フレームワークAJAX

XMLW/S API

Web/DBセキュリティ

2011 2012PHPcon関西

PHPcon北海道

5.4・Traits- 速度改善- MB対応標準化- 組込みWebサーバ- レガシー機能削除

`12/36.0`10/3 キャンセル

・Unicode

・エンジン/OOP大幅強化:ZE2・XML対応強化(SimpleXML)・Webサービス(SOAP)・DB強化 (SQLite, MySQLi)

`10/12 (EOL)

5.0`04/7

5.1`05/11 5.2

`06/11

・メモリ/速度改善・入力フィルタ・速度改善

・PDO

スマフォ

Page 8: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

開発のソーシャルコーディング対応

 2012/3 ソースコードの管理をsubversionからgitへ移行

 git.php.net → githubにミラー

RFC作成

投票

新機能

議論/更新

http://wiki.php.net/rfc

バグトラッカで検索

http://bugs.php.net

バグ修正

登録(チケット取得)

#12345

PHPソースをクローン

実装+テストコード作成

pullリクエスト発行

リクエスト受理/拒否

http://github.com/php/php-src

議論/更新

Page 9: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

フレームワークと相互運用性

PHP 5.3時代のフレームワーク(名前空間)

ZF 2Symfony2FuelPHP 1.2

相互運用性interoperability

フレームワークA ORMクラスC

ViewクラスD

独自クラスE

フレームワークB

ViewクラスF

独自クラスE

ORMクラスCモジュラー

Page 10: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

PHP-FIG と PSR

PHP Framework Interoperability Group (PHP-FIG)  (以前: PHP Standards Working Group) 主要F/W関係者が参画: CakePHP, ZF,Symfony, ... PHP standards recommendation (PSR)を発行

PSR-0 :ファイル/クラス/名前空間の標準化:autoloader

PSR-1 : 基本的なコーディング標準

PSR-2 : コーディングスタイルガイド

http://www.php-fig.org/

プロジェクトをPSR準拠とする

効率的で柔軟な運用が可能に

Page 11: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

PSR準拠とするには?

2.PHP_CodeSnifferで確認

1.PHP Coding Standards Fixer (http://cs.sensiolabs.org/) PSR-0~2準拠となるよう修正

$ pear install PHP_CodeSniffer$ cd /usr/share/php/CodeSniffer/Standards$ git clone https://github.com/klaussilveira/phpcs-psr PSR$ phpcs --config-set default_standard PSR

$ wget http://cs.sensiolabs.org/get/php-cs-fixer.phar

$ php php-cs-fixer.phar fix /path/to/dir

Page 12: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

依存性マネージャ:Composer

パッケージマネージャ → dependency manager プロジェクト単位で複数/階層的な依存関係を解決

主要フレームワークに対応 : Symfony2, ZF, FuelPHP, ...

$ php composer.phar install

{ "require": { "twig/twig": "1.6.*", "slim/slim": "1.6.*", }}

composer.jsonの例

(デフォルト:バージョンをロック)

$ php composer.phar update

composer.jsonに依存性を記述composer.jsonに依存性を記述

パッケージのインストールパッケージのインストール

依存性を更新依存性を更新

オートローダとロックファイル(composer.lock)自動生成

Page 13: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

PackagistPackagist::ComposerComposerによる配布による配布

http://packagist.org/statistics

Page 14: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

PHP 5.4 改善/変更のポイント

速度改善:10%~15%

Mix-inライクな機能を実現:Trait

古い機能の削除:

register_globals, magic_quotes*, safe_mode* , ext/sqlite, ...

ZEマルチバイト標準化、mbstring機能強化

組込みWebサーバー: php -S localhost:8080

課題: APCのサポートがまだβ版

Page 15: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

PHP 5.4でより速く、快適に

大幅に高速化、省メモリ化

Athlon II X4 640 3.0GHz, Ubuntu 12.04

PHP 5.2 PHP 5.3 PHP 5.4 PHP 5.50

1

2

3

4

5

6Zend/bench.php strcat(200000)

sieve(30)nestedloop(12)matrix(20)heapsort(20000)hash2(500)hash1(50000)fibo(30)ary3(2000)ary2(50000)ary(50000)ackermann(7)mandel2mandelsimpleudcallsimpleucallsimplecallsimple

実行

時間

[s]

Page 16: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

PHP 5.4でより速く、快適に

大幅に高速化、省メモリ化

Athlon II X4 640 3.0GHz, Ubuntu 12.04PHP 5.2 PHP 5.3 PHP 5.4 PHP 5.50

5

10

15

20

25

30

35

40Zend/micro_bench.php $x = $f ? $f : tmp

$x = $f ? $f : $a

$x = $f ?: tmp

$x = $a ?: null

$x = $str[0]

$x = $hash['v']

$x = $GLOBALS['v']

$x = $_GET

$x = TEST

new Foo()

$x = Foo::TEST

$this->f()

empty($this->x)

isset($this->x)

$this->x--

$this->x++

--$this->x

++$this->x

$this->x += 2

$this->x = 0

$x = $this->x

Foo::f()

self::f()

empty(Foo::$x)

isset(Foo::$x)

Foo::$x = 0

$x = Foo::$x

empty(self::$x)

isset(self::$x)

self::$x = 0

$x = self::$x

int_func()

undef_func()

func()

empty_loop

実行

時間

[s]

Page 17: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

PHP 5.4 でコード再利用:Trait

Trait: 単一継承の言語でコードを再利用する仕組み

実装の再利用( ≠ interface:実装を強制)

クラスや他のTraitとのメソッド名衝突を解決する仕組みが必要<?php trait A { public function show() {

echo 'Hello,',$this->getName(),'!'; } abstract public function getName(); }

class Base { /* 1 */ }

class Foo extends Base {use A;public function getName() { echo 'PHP'; }

}$obj = new Foo();echo $obj->show(); // Hello,PHP!

<?php trait A { public function show() { echo 'Hello,';} } trait B { public function show() {echo 'PHP!';} }

class Foo { use A, B { A::show insteadof B; B::show as showN; }}

$obj = new Foo();echo $obj->show() . $obj->showN();

リネームではなくエイリアス

Page 18: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

PHP 5.4 で日本語の扱いが便利に

Zendエンジンマルチバイト対応標準化:バイナリ互換性改善

デフォルト文字コードがISO-8859-1からUTF-8に: default_charset, htmlspecialchars(), etc.

mbstring文字コード追加: 携帯絵文字(Unicode 6), etc.

◇ PHP構築時: --enable-zend-multibyte --enable-mbstring ◇ mbstring.script_encoding でスクリプト文字コード指定

PHP <= 5.3

◇ zend.multibyte = On で有効に ◇ zend.script_encodingでスクリプト文字コード指定

PHP 5.4

Page 19: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

echo mb_ereg_replace_callback('(\S+)', function ($m) { echo strlen($m[0]);}, $str);

正規表現置換eオプション:セキュリティホールとなりやすい

mb_ereg_replace_callback()関数追加  → 置換文字列で コールバック関数を使用可能に

PCREにおけるpreg_replace_callback()に相当

PHP 5.4.1:コールバック関数による置換

$str = 'abc 123 #';echo mb_ereg_replace('(\S+)',"strlen('\\1')", $str, 'e');

Page 20: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

PHP 5.5

リリース時期: 未定 (2013/3 ?)

PHP 5.3、5.4と比べて小幅な改訂となる可能性がある

目玉機能は、(今のところ) Generator

Page 21: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

Generator

Generator:イテレータを関数で定義(Python) 例:ファイルの各行を処理: ファイル全体読込み→メモリが大量に必要

イタレータ定義:多くのコード記述が必要

配列全体を返すのではなく、値を生成するイタレータを返す

<?phpfunction xrange($start, $end, $step = 1) { for ($i = $start; $i < $end; $i += $step) { yield $i; }}

foreach (xrange(10, 20) as $i) { echo $i;}

(https://wiki.php.net/rfc/generators)

Nikita Popov17歳、ベルリン

10,11,....,20

Page 22: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

finallyキーワード

(https://wiki.php.net/rfc/finally)

try { echo ”1"; throw new Exception("ex");} catch (Exception $e) { echo ”2";} finally { echo "#";}

finallyブロック:tryブロックから出る際に常に実行される

例外発生の有無によらない → クリンナップコードを記述

return等でクリンナップコードがバイパスされることを防止

12#

Page 23: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

$hash = password_hash($password, PASSWORD_BCRYPT);

パスワード用ハッシュ

(https://wiki.php.net/rfc/password_hash) パスワードハッシュ用API

$key = hash_pbkdf2("sha512", $password, $salt, 5000, 16, true);$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128,

   $key, $data, MCRYPT_MODE_CBC, $iv);

PBKDF2: パスワードハッシュ用キーストレッチ

scrypt に基づく実装も提案されている

echo password_verify($password, $hash) ? "OK" : "NG";

crypt関数のラッパー:従来はsalt文字列を作るのが面倒だった

Page 24: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

function randomHexString($length) { for ($i = 0, $s = ''; $i < $length; ++$i) { $s .= "0123456789abcdef"[mt_rand(0, 15)]; } return $s;}echo randomHexString(10); 

その他の機能(1)

(https://wiki.php.net/rfc/constdereference)

echo ”123”[1]; echo [1,2,3][2];

ランダムな16進文字列を生成する例

配列/文字列定数の添字参照

foreach ($users as $user) { list($id, $name) = $user; echo “$id => $name”;}

foreach ($users as list($id, $name)) { echo “$id => $name”;}

foreachでリスト代入が可能に (https://wiki.php.net/rfc/foreachlist)

1e1384a471

2

3

Page 25: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

PHPの成功と未来

学習が容易: 言語がシンプル、ドキュメントが豊富 - 多様な要求に応えつつ、わかり易さを保つことが必要

- 地道な活動が重要: ローカルなPHPカンファレンス、勉強会、等

進化を継続: Webの進化に対応し、必要十分な解を提供

- 開発者/貢献者の育成

- キラーアプリ(WordPressなど)の存在がキー

PHPは歯ブラシのようなもの。いつも使う役に立つシンプルなツールだけど、誰も歯ブラシのことなんて気にしないよね。PHPは「問題を解くためのシンプルなツール」なのさ。

(http://en.wikiquote.org/wiki/Rasmus_Lerdorf)Rasmus語録

Page 26: PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)

PHPユーザ相互の情報交換およびコミュニティの健全な発展

設立趣旨

• 高性能Webミドルウエアへのニーズ増大• オープンソースソフトウエアの発展

背景

国内PHPユーザの増加

活動内容

ドキュメント整備

セミナー/イベント

メンバー/スタッフ国際化

http://www.php.gr.jp/Web

・PHPユーザ会員と思ったらメンバー・運営するのも楽しいかも

日本PHPユーザ会

(2000年4月発足)

php-users, php-dev, php-doc, phpug-admin

メーリングリスト