狠狠撸

狠狠撸Share a Scribd company logo
PHPプログラミングの
IPv6対応の実際
小山 哲志
(株)ビート?クラフト
koyama@beatcraft.com
1
講演者について
?小山哲志 (こやま てつじ)
?株式会社ビート?クラフト所属
?Webアプリ/サービス開発者
?アジャイルメディアネットワーク広告
配信サーバなど
?日本PHPユーザ会スタッフ
?IW2008プログラム委員
2
セッションの趣旨
?IPv4アドレス枯渇に対するWeb業界のア
クションが遅い
?IPv6にサービスを対応させるにしても、
使っているプログラミング言語はどこま
で大丈夫?
?各言語のサーベイが必要
3
まずお詫び
?Web開発で用いられる4大言語
?Perl
?Python
?Ruby
?PHP
?本来は上記全ての言語のIPv6対応を解説
したい
?PHP以外は講演者が見つからなかった
4
本日の内容
?IPv6対応とはどういうことか?
?PHP本体のIPv6対応
?外部Extension/PEARの対応
?まとめ
5
本日の内容
?IPv6対応とはどういうことか?
?PHP本体のIPv6対応
?外部Extension/PEARの対応
?まとめ
6
IPv4とIPv6の違い
?アドレス長が違う
?IPv4: 32ビット (xxx.xxx.xxx.xxx)
?IPv6: 128ビット
(ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff)
?IPv4と違い、IPv6はインターフェースに
複数のアドレスが付くのが普通
?どのアドレスをsrcにするか?
7
IPv6対応とは?
?IPv4でしか動かないものを、
IPv6のみで動くようにすること
ではなく
IPv4でもIPv6でも、両方で動くようにす
ること。
?プロトコルに依存しないプログラミング
8
OSの対応は完了している
?最新のOSであれば問題なし
?Linux,BSD(MacOS),その他UNIX
?WindowsXP,Vista
?新APIに従ったアプリケーションならば
大丈夫
?PHPもOSから見ればアプリケーション
9
ホスト名→アドレス
?リゾルバ
?/etc/hosts
?DNS
?etc..
10
API変更
?IPv4
?gethostbyname
?gethostbyaddr
?IPv4+IPv6
?getaddrinfo
?getnameinfo
11
何故APIの変更が必要か?
?これまでのアドレス情報(sockaddr)
?IPv4決めうち
?これからのアドレス情報
?複数の情報が返る可能性
?A,AAAA両方設定されているかも
12
本日の内容
?IPv6対応とはどういうことか?
?PHP本体のIPv6対応
?外部Extension/PEARの対応
?まとめ
13
PHPの使われ方
?Apache(やその他のWebサーバの)モ
ジュールとして
?mod_php
?CGIとして
?コマンドラインとして
14
mod_php/CGI
?ネットワーク入出力はhttpdが面倒を見
てくれる
?PHP自体はIPv6対応の必要なし
?アドレス解析部分は除く
?Apacheは問題なくIPv6を扱える
15
httpdに頼れない場合
?PHPで独自にネットワーク接続をする
?他のWebサービスにアクセスする
?メール送受信
?FTP送受信
?etc...
16
PHPのネットワークIO
?streamモデル
?ソケットを直接使わなくても、ネット
ワーク入出力ができる
?ライブラリのほとんどはこれを利用して
いるが、例外あり
17
streamのIPv6対応
?php_network_getaddresses()
?main/network.c
?getaddrinfoを用いて、セオリー通りに
プログラミングしている
?php_stream_xport_create()
?main/streams/transports.c
?問題なし
18
streamはOK
$cont = file_get_contents('http://ipv6.google.com/');
$fp = fsockopen('ipv6.google.com', 80);
$out = "GET / HTTP/1.1rn";
$out .= "Host: ipv6.google.comrn";
$out .= "Connection: Closernrn";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
19
ext/sockets
?streamではないネットワーク入出力
?socketそのままのAPI
?bind,listen,acceptもある
?一応IPv6対応しているが、AF_INET6を明
示的に指定する必要がある
?IPv6→IPv4フォールバックができない
?要注意!
20
DNS Query
?dns_get_record (PHP関数)
?AAAAも含めて、すべてのレコードが
ちゃんと返ってくる
?ただしBSD(MacOS含む),Windowsでは
実装されていない
?PEAR::Net_DNSを使う
21
gethostbyname
?PHP関数
?同名のC APIの単純なラッパー
?IPv6対応のコードは一応入っている
?でもOSによっては動かない
?Linux,MacOSはだめ
?gethostbyaddrも同様
22
本日の内容
?IPv6対応とはどういうことか?
?PHP本体のIPv6対応
?外部Extension/PEARの対応
?まとめ
23
extension/PEAR
?標準extension
?soap, ftp, xmlrpc
?PECL
?PEAR
?Net_IPv6
?Net_Socket
?Net_POP3
?Net_IMAP
?Net_Server
24
ext/soap
?SOAP
?HTTPでXMLを用いたRPC
?http_connect(): php_http.c
?php_stream_xport_createを使ってい
る
?streamの上で動いているのでOK
25
ext/ftp
?FTP
?ファイル転送プロトコル
?php_network_connect_socket_to_hostを
呼び出している
?その下でphp_network_getaddresses
?問題なし
26
PECL
?独立パッケージのextension
?ネットワーク関連のものはいくつかある
?外部ライブラリのブリッジのみ
?IPv6対応しているかどうかはライブラ
リ次第
27
PEAR::Net_IPv6
?IPv6アドレス解析クラス
?メソッドは3つだけ
?Uncompress
?Compress
?CheckIPv6
28
PEAR::Net_IPv6つづき
require_once 'Net/IPv6.php';
$v6addr = 'fe80::1';
$uc = Net_IPv6::uncompress($v6addr);
echo $uc;
// fe80:0:0:0:0:0:0:1
29
PEAR::Net_Socket
?socketのOO API
?fsockopen/pfsockopenを呼び出している
?つまりstreamを使う
?connect時にIPv4を前提にしたアドレス
チェックを行なっている
?ホスト名が渡されるとgethostbynameで
名前解決する
30
PEAR::Net_Socketつづき
?IPv6なアドレスやAAAAしかないホスト名
が渡されると、この部分は無効になる
?結果的にPHP内部で名前解決される
? OK!
if (!$addr) {
return $this->raiseError('$addr cannot be empty');
} elseif (strspn($addr, '.0123456789') == strlen($addr) ||
strstr($addr, '/') !== false) {
$this->addr = $addr;
} else {
$this->addr = @gethostbyname($addr);
}
31
PEAR::Net_Socketつづき
require_once 'Net/Socket.php';
$sock = new Net_Socket;
$sock->connect('ipv6.google.com', 80);
$out = "GET / HTTP/1.1rn";
$out .= "Host: ipv6.google.comrn";
$out .= "Connection: Closernrn";
$sock->write($out);
while (!$sock->eof()) {
echo $sock->gets(128);
}
$sock->disconnect();
32
PEAR::Net_POP3
?メール取得プロトコルPOP3
?Post Office Protocol version3
?PEAR::Net_Socketを使っている
?OK!
33
PEAR::Net_IMAP
?メール取得プロトコルIMAP
?Internet Message Access Protocol
?PEAR::Net_Socketを使っている
?OK!
34
PEAR::Net_SMTP
?メール転送プロトコルSMTP
?Simple Mail Transfer Protocol
?PEAR::Net_Socketを使っている
?OK!
35
PEAR::HTTP_Request
?HTTP送受信ライブラリ
?PEAR::Net_Socketを使っている
?OK!
36
PEAR::Net_Server
?PHPでサーバを作るクラス
?bindしてlistenするもの
?sockets extensionを利用
?IPv4/IPv6で同時に待ち受けるサーバは作
れない
37
PEAR::Net_DNS
?DNS問い合わせを行なうクラス
?socketはfsockopenを使っている
?AAAAも含めて問い合わせできるが、RR
Typeを指定しなくてはいけない
38
本日の内容
?IPv6対応とはどういうことか?
?PHP本体のIPv6対応
?外部Extension/PEARの対応
?まとめ
39
まとめ
?fsockopen/Net_Socketがベースになって
いるものが多い。
?自動的にIPv6名前解決、接続できる
?IPv6アドレス解析はまだまだ不十分
?マルチキャスト/エニーキャストの考慮
はない
?PHPで必要かどうかも疑問
40
お願い
?まだまだ調査不足を実感しています
?私もIPv6でサービスを運用した経験は
ありません
?とりあえずIPv6触ってみませんか?
?他言語の調査をしてくれる方大募集
41

More Related Content

笔贬笔プログラミングの滨笔惫6対応の実际