■ファイルアクセスの同じ手法
以下のようにfopen関数を用いてファイルアクセスと同じように、ネットワークリソースを利用できる。但し、当然ながらhttpを使っているので書き込みなどは行えない。
<?php $data = ''; if($fh = fopen('http://google.com', 'r')){ while($str = fread($fh, 1000)){ $data .= $str; } } else{ //error } print($data); ?>
以下のようにして外部のファイルをインクルードすることもできる。但し、JavaScriptなどではお馴染みの手法もPHPでは大きなリスクを伴うことを理解する必要がある。
<?php require_once('http://sample.org'); ?>
■ストリームコンテキスト
以下のようにstream_context_create関数を使って、特定の関数を使用したときに任意の(HTTP)ヘッダを使うよう指定することができる。
<?php $strmtxt = stream_context_create(array( 'http' => array( 'user_agent' => 'Super Browser Like FF', 'max_redirects' => 3 ) )); $data = file_get_contents('http://localhost', false, $strmtxt); ?>
各関数について
- string file_get_contents(string $filename[, bool $use_include_path=false[, resource $context[, int $offset=-1[, int $maxlength=-1]]]])
- $filenameのファイルを文字列として全て読み込む。$use_include_pathをtrueにするとインクルードパスから検索してくれる。第三引数にストリームコンテキストを用いて通信の挙動を指定できる。
- resource stream_context_create([array $options])
- ストリームコンテキストを生成する。引数は$array[‘wrapper’][‘option’] = $valueのような連想配列でなければならない。
■ソケット接続
以下のようにしてホスト間のソケット接続を確立する。
サーバ側
<?php $socket = stream_socket_server('tcp://0.0.0.0:1037'); while($conn = stream_socket_accept($socket)){ fwrite($conn, "Hello, World!n"); fclose($conn); } fclose($socket); ?>
php ./server.php &
クライアント側
<?php $socket = stream_socket_client('tcp://0.0.0.0:1037'); while(!feof($socket)){ print(fread($socket, 100)); } fclose($socket); ?>
php ./client.php #Hello, World!
各関数について
- resource stream_socket_client(string $remote_socket)
- インターネットドメインもしくはUNIXドメインのソケット接続を開く。
- resource stream_socket_server(string $local_socket)
- インターネットドメインもしくはUNIXドメインのサーバソケットを生成する。
- resource stream_socket_accept(resource $server_socket)
- サーバソケットの接続を受け入れる。
■ストリームフィルタ
以下のようにstream_filter_append関数を使用してストリームフィルタを付加する。フィルタ「string.toupper」は「全ての文字を大文字」にし、「zlib.inflate」は「データの圧縮」をする。
<?php $socket = stream_socket_server('tcp://0.0.0.0:1037'); while($conn = stream_socket_accept($socket)){ stream_filter_append($conn, 'string.toupper'); stream_filter_append($conn, 'zlib.deflate'); fwrite($conn, "Hello, World!n"); fclose($conn); } fclose($socket); ?>
<?php $socket = stream_socket_client('tcp://0.0.0.0:1037'); stream_filter_append($socket, 'zlib.inflate'); while(!feof($socket)){ print(fread($socket, 100)); } fclose($socket); ?>
各関数について
- resource stream_filter_append(resource $stream, string $filtername)
- 第一引数で指定したストリームに、第二引数のフィルタを末尾に付加する。
- resource stream_filter_prepend(resource $stream, string $filtername)
- 第一引数で指定したストリームに、第二引数のフィルタを先頭に付加する。