Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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と違い、IPv...
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()
...
streamはOK
$cont = file_get_contents('http://ipv6.google.com/');
$fp = fsockopen('ipv6.google.com', 80);
$out = "GET / HTTP...
ext/sockets
•streamではないネットワーク入出力
•socketそのままのAPI
•bind,listen,acceptもある
•一応IPv6対応しているが、AF_INET6を明
示的に指定する必要がある
•IPv6→IPv4フ...
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...
PEAR::Net_Socket
•socketのOO API
•fsockopen/pfsockopenを呼び出している
•つまりstreamを使う
•connect時にIPv4を前提にしたアドレス
チェックを行なっている
•ホスト名が渡され...
PEAR::Net_Socketつづき
•IPv6なアドレスやAAAAしかないホスト名
が渡されると、この部分は無効になる
•結果的にPHP内部で名前解決される
• OK!
if (!$addr) {
return $this->raiseEr...
PEAR::Net_Socketつづき
require_once 'Net/Socket.php';
$sock = new Net_Socket;
$sock->connect('ipv6.google.com', 80);
$out = "...
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で必要かどうかも疑問
...
お願い
•まだまだ調査不足を実感しています
•私もIPv6でサービスを運用した経験は
ありません
•とりあえずIPv6触ってみませんか?
•他言語の調査をしてくれる方大募集
41
Upcoming SlideShare
Loading in …5
×

PHPプログラミングのIPv6対応の実際

1,881 views

Published on

2008/11/27 Internet Week 2008 「実践!IPv6 Webサービス構築」で発表した資料。

Published in: Technology
  • Be the first to comment

PHPプログラミングのIPv6対応の実際

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

×