「PHPの今とこれから 2008」
日本PHPユーザ会 廣川 類
PHPカンファレンス2008
2008年7月21日(土)‫‏‬
PHPの歩み
Netcraft社 (www.netcraft.com)による統計データ
Nexen Services (www.nexen.net)
PHP 34%, ASP 20%, その他 0%, 不明 45%
PHP 4.3.11
・OOP機能大幅強化
・SQLite
・Webサービス
PHP 4.3.0
PHP 5.0.0 PHP 5.0.4
PHP 6.0
・高速化
・ PDO
・Unicode/i18n
・キャッシュ(APC)‫‏‬
・レガシー機能廃止
・名前空間
・ガベージコレクタ
・mysqlnd
バグ
修正
リリース済み
開発中
PHP 4.4.0
バグ修正
(バイナリ非互換)
バグ
修正
PHP 5.1.0
PHP 4.4.8
バグ
修正
PHP 5.1.5
バグ
修正
・filter/json/zip
・メモリ管理改良
PHP 5.2.0 PHP 5.2.6
PHPバージョン
PHP 5.3・ICU
・OpenID
・名前空間
・GC改良
~2008.8.8
PHP アンケート 2008
 主に使っているPHPのバージョン
1) PHP4
2) PHP5
3) PHP3
4) PHP6
5) 使ってない
PHPカンファレンスアンケート
まだ使ったことがない
初心者
1年未満
1年以上
3年以上
5年以上
プログラマ(3年未満)
プログラマ(3年以上)
プログラマ(5年以上)
デザイナー
システム設計者
プロマネ
コンサルタント
経営者
学生
その他
フリーLinux
商用Linux
MS-Windows
Mac OS X
Solaris
FreeBSD
その他
MySQL
PostgreSQL
Firebird
SQLite
Oracle
MS SQL Server
DB2
その他
PHP 5への移行
 PHP4のサポート終了
 2008/1/3リリースのPHP 4.4.8が最終版
 2008/8/8まで致命的な
セキュリティ修正を実施
 PHP 4:62%
(昨年:75%) on Nexen.net
 GO PHP 5
 アプリ開発者、ホスティング
 2008/2/5 以降PHP5.2以上をサポート
 PEAR: PEAR2でPHP 5以降のみサポート
http://www.gophp5.org/
19%
40%8%
28%
5%
4.3
4.4
5.1
5.2
other
PHP4→PHP5移行のポイント
 オブジェクト(クラス)に関係する部分は要確認
 ディープコピーを仮定したプログラム
 オブジェクトの比較
 E_STRICTによる構文互換性チェック
PHP 5.3でE_STRICTはE_ALLに含まれる。E_DEPRECATED追加
 Zend Engine 1互換モード (PHP 5.3で廃止)
zend.ze1_compatibility_mode = Off
(E_STRICTを使用して非互換な部分を検出)
 一部の関数の処理が非互換‫‏‬
‫‏‬参照 :PHP5への移行に関するPHPマニュアル
http://docs.php.net/manual/ja/migration5.php
PHP 5.2
 2006/11リリース, 最新版(08/3):PHP 5.2.6
 更なる高速化
 stat(), implode(), str_replace(),シャットダウン
 メモリ管理効率化
 filter, zip, json エクステンション
 機能追加・改良
 PDO, SPL, xmlReader改良
 Apache 2.2 対応(Win32)
PHP 5.3
 2008/1リリース予定 -> 遅延中
 PHP6までのつなぎ(=当面の本命)
 PHP6 - (Unicode) + (pecl/intl)
 ICUエクステンション: pecl/intl
 Collator (文字列比較), 数値フォーマッタ
 OpenSSLエクステンションにOpenIDサポート追加
-> Zend Framework 1.5でサポート
 GC改良: 循環コレクタ
 スキャナ(字句解析器)高速化: flexからre2cへ
 名前空間: PHP 6からバックポート
 ereg_*がPECLへ
PHP 6.0
 Unicodeネーティブ対応
 レガシーコード削除
 register_globals, magic_*, safe_mode,ze1_*
 エクステンション
 PECLから追加:APC, fileinfo他
 PECLへ移動:mime_magic他
 MySQLND (MySQL Native Driver)‫‏‬
 機能追加・改良
 名前空間
 ガーベッジコレクタ(cycle collector)
PHP 5の高速化
0
5
10
15
20
25
30
35
PHP 4.4 PHP 5.2 PHP 5.3 PHP 6.0
実行時間[s]
strcat(200000)
sieve(30)
nestedloop(12)
matrix(20)
heapsort(20000)
hash2(500)
hash1(50000)
fibo(30)
ary3(2000)
ary2(50000)
ary(50000)
ackermann(5)
mandel2
mandel
simpleudcall
simpleucall
simplecall
simple
• PHP 5.1/5.2 ZendEngine大幅に高速化
• PHP 5.2/5.3 メモリ使用効率化
php-src/Zend/bench.php
AMD64, 2GHz, Windows Vista
Late Static Binding
 コンパイル時ではなく、実行時にスタティックイベントを処理
 利点: (例えば)ActiveRecordを正しく実装できる
 下位互換性なし
class ActiveRecord {
public static function getClass() {
return __CLASS__;
}
public static function find() {
echo self:: getClass();
}
}
class Foo extends ActiveRecord {
public static function getClass() {
echo __CLASS__;
}
}
Foo::find(); // ActiveRecord
class ActiveRecord {
public static function getClass() {
return __CLASS__;
}
public static function find() {
echo static:: getClass();
}
}
class Foo extends ActiveRecord {
public static function getClass() {
echo __CLASS__;
}
}
Foo::find(); // Foo
PHP <= 5.2 PHP >= 5.3
Namespace 名前空間
 PHP 5.3でもサポート(PHP 6.0からバックポート)
 namespace で名前空間を定義
 変数/関数名衝突回避、長いクラス名の記述が不要に
DB_MySQL_Form_Row → (DB::MySQL::Form) Row
<?php
namespace My::Cal::Week;
class DateTime extends ::DateTime {}
?>
<?php
include 'mydate.php';
use My::Cal::Week::DateTime as DateTime;
$a‫‏=‏‬new‫‏‬DateTime(‘2008-07-21’);‫//‏‬ 内部クラス
echo get_class($a); // My::Cal::Week::DateTime
?>
MySQL ND
 DB I/F (libmysqlの機能)をネーティブ実装 (PHPライセンス)
 DB I/FをPHPから管理可能: メモリ管理、キャッシュ等
 使用メモリ低減(40%)、高速化
 PHP5/PHP6をサポート: PHP6 ,PHP 5.3 に標準バンドル
 mysqli (mysql)サポート。PDO_mysqlnd 開発中
mysqli, PDO
libmysql
MySQL
mysqlnd
変数コピー
変数コピー
変数コピー
mysqlnd.net_cmd_buffer_size = 2048
mysqlnd.net_read_buffer_size = 32768
mysqlnd.collect_statistics = On
mysqlnd.collect_memory_statistics = Off
mysqli_fetch_assoc("...");
設定パラメータ
mysqli_get_client_stats()
mysqli_get_connection_stats(mysqli $link)
関数
循環コレクタ(Cycle collector)
 従来はシンプルなガーベッジコレクタ(参照カウント)を実装
 課題:直接・間接的な自己参照を検知できない
 David Wang氏が「Google Summer of Code」で課題に
 リファレンスカウンティング+サイクル検知
 eZ Componentsを使ったベンチマーク(テンプレートなど)
 メモリ消費量は1/2~1/22に(実行時間は若干増加)
 PHP 6.0に採用予定。PHP 5.3にも採用
 有効/無効: zend.enable_gc = On (php.ini)
 gc_collect_cycles()により明示的に実行可能
?:演算子
 3項演算子の簡略版。
 A ?: B A (A≠偽), B (A=偽)
 ちなみに3項演算子(A ? B : C) B (A≠偽), C (A=偽)
$host = $_SERVER[‘REMOTE_HOST’] ?: $_SERVER[‘REMOTE_ADDR’];
ext/intl
 Unicodeに基づく国際化処理
 PECLにて公開、PHP 5.3.0にバンドル
 6/27 intl 1.0.0リリース
 書記素クラスタ (grapheme cluster) 単位の処理
 substr, strlen, strposなど
 ロケール(Locale)、比較(Collaor) 、正規化(Normalizer)
 フォーマット
 NumberFormatter, IntlDateFormatter, MeesageFormatter
http://www.hardened-php.net/
・PHPのセキュリティ強化パッチ:Suhosin
- ログ機能,
- 入力チェック(サニタイズ), PHP保護
- セッション, Cookie 暗号化
PHPとセキュリティ
1.アプリケーション固有の脆弱性(XSS等)
2.設定に起因する脆弱性(OS、Webサーバ、DB、PHP)
3.システム固有の脆弱性
(OS、Webサーバ、Webブラウザ、DB、PHP)
39.2
55.1
17.5
60.8
44.9
82.5
0% 50% 100%
PHP4.4
PHP5.2
PHP6
covered
non-covered
PHPとQA
elePHPant
- PHP自体のコード品質は比較的高く、改善されている
Coverity (米国国土安全保障省): The Scan Report on Open Source Software 2008
0.004 Defetects/KLOC (rung2) in 473KLOC
http://scan.coverity.com/rung2.html
- テストされていないコードには欠陥がある
→コードカバレッジはまだまだ低い(55%)
→ コードカバレッジを指標とするテストの整備
→ testFest (2008年5月)
→ コミュニティ参加によるテストツール整備
テストへの参加
--TEST--
Hello World
--FILE--
<?php print ‘Hello World’; ?>
--EXPECT--
Hello World
http://gcov.php.net/
オープンソースソフトウエアはユーザが改善に参加できる!
test1.phpt
 PEAR:505, PECL:186, アカウント:2619
 パッケージャ/インストーラ
 package.xml 1.0, PEAR 1.3.6サポート打切(2008.1.1)
 PEAR 2.0.0
 リリース遅延中
 PHP Archiver (phar)サポート
 新インストーラ:Pyrus
 PHP 5.2以降をサポート
PEAR/PECL Update
http://pecl2.php.net/downloads/php-windows-builds/
http://screencast.com/t/lSIaPpkLG
Windows環境におけるPHP
 5 minute "how to compile php on windows" video
PHPの未来
 常に改善・改良を求めることでオープンソースの活力が維持される
 安定した枯れた環境は実用的なシステムも有用だが、進化は
必然
 新たな開発者(特に若い人)に参加してもらう工夫が必要
 Google Summer of Code
 改善/機能強化の提案方法
 PHP本体 http://wiki.php.net/rfc クロージャなど提案中
 クラス:PEAR
 エクステンション:PECL
PHP 6.0のUnicode対応
 PHPに文字列リテラルという概念が生まれる
 Unicodeネーティブ対応:ICU 3.6をエンジンとして使用
 多くの機能が影響を受ける
 Unicode Preview Release Q4,2007年リリース?
 Unicode対応と国際化
 正規表現,エンコーディング変換
 Unicode Collation:言語依存のソート/検索手法標準化
 ロケール
 Transliteration(音訳)
Web アプリケーションと文字
Web Browser
PHP
Shift_JIS/EUC-JP
JIS/UTF-8 (未知)‫‏‬
Shift_JIS+ベンダー固有文字
Webサーバ
(Apache)‫‏‬
PHPスクリプト
RDBMS
Shift_JIS/EUC-JP
JIS/UTF-8
Shift_JIS/
EUC-JP/UTF-8
Shift_JIS/
EUC-JP/UTF-8
e-mail
ISO-2022-JP
外部→内部
内部→外部
ユーザ入力
SQLクエリ
送信
読込み
Mobile Phone
Unicode対応の流れ
PHP4/PHP5
 バイナリ文字列しかない
 マルチバイト文字はバイナリ列として認識
 mbstringのような専用の関数を使用する必要がある
PHP6
 unicode_semantics=on (デフォルト:off) で切替
 Unicode文字列(unicode) or バイナリ文字列(binary)
 各関数がUnicode文字列にネーティブ対応
 Unicodeとローカルエンコーディング間の相互変換を
ネーティブサポート
mbstring と文字エンコーディング変換
Web Browser
PHPスクリプト
http_input
http_output
script_encoding
internal_encoding
ファイルシステム
(Shift_JIS)‫‏‬
バイナリ文字列
メール
mb_send_mail()‫‏‬
mbstring. を省略
データ
mb_convert_encoding()‫‏‬
PHP6 と文字エンコーディング変換
Web Browser
PHPスクリプト
http_input_encoding
output_encoding
script_encoding runtime_encoding
ファイルシステム
filesystem_encoding
Unicode文字列
バイナリ文字列
fallback_encoding
ストリーム
stream_encoding()‫‏‬
unicode. を省略
UTF-16
課題:PHP6と日本語
 PHP6ではmbstringの機能の多くがネーティブ実装化
 日本語対応は十分か?(mbstringと同等か?)
 (入力)文字コード検出は?
 ICU 3.6に実装(現在はICU 3.4)
 mbstringは不要になるか?
 案1)Unicode完全移行:mbstringをPECLに移動
 案2)エンジンlibmbflをICUに変更してマルチバイト固有の処理
を実装
 案3)現状のまま
PHP6のデモ
PHP Framework Update
月宮・安藤・久保・一井,他
PHPカンファレンス2008の見どころ
PHPの今とこれから 2007 廣川
10:00
11:00
12:30 昼休憩
13:30
パネル「ビジネス側面から語るPHP」
河江・加藤・一條・森
今日からはじめるPHPエクステンション 関山
15:00
16:00
クロージング/懇親会
マイクロソフトの次世代Webテクノロジー 徹底解説 -
Windows Server 2008 / IIS7.0 / FastCGIで変わるPHP
環境 奥主
大規模サイトの構築・運用ノウハウ
藤本・尾藤
PHP入門(仮題)
柏岡
PHP at Yahoo! Japan 荻原
ライトニングトーク
モバイル開発におけるPHPの利用方法やTips (荒木)
PHPを使ったPHPライセンスのSNSエンジン「MYNets」について(辻岡)
PEAR DB_DataObject開発ケーススタディ(熊倉)
PHPで画像処理をしてモテようかと思う(個々一番)
PHPプログラマのための恋愛術(海原)
codeなにがしの紹介(早川)
ケータイキット for Smartyについて (寺嶋)
PHPでログインシェルを作る(尾藤)
17:00
Zend Core による PHP 環境の改善 for Windows and
PowerGres 岡部
まとめ
今年も熱い「PHPカンファレンス」を
お楽しみください!
Namespace 名前空間(2006版)
<?php
namespace ns {
class class1 {
public $val = 1;
}
class class2 {
public‫‏‬static‫$‏‬msg‫‘‏=‏‬hello’;
}
}
?>
<?php
import ns:class1;
import ns:class2 as ns_class2;
$obj = new ns:class1();
echo ns_class2::$msg;
?>
PHP4→PHP5移行関連情報
 商用PHP5移行サービス開始(例:Asial)
http://www.asial.co.jp/php5migration/
 移行に関する情報(例:gihyo.jp)‫‏‬
 PHP5スキル認定(例:Zend PHP 5 Certification)
 下位互換性がない変更点
PHPマニュアル
http://docs.php.net/manual/ja/migration5.php
http://www.zend.co.jp/certification/

PHPの今とこれから2008