@blog.justoneplanet.info

日々勉強

PHP Accessing Network Resources(ネットワークアクセス)

■ファイルアクセスの同じ手法

以下のように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)
第一引数で指定したストリームに、第二引数のフィルタを先頭に付加する。

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment