忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/07/26 15:48 |
PHP1-31:PHPでソケット接続
PHPにはfile_get_contentsやらftp_getといった超便利関数が揃っているので、リモートファイルへのアクセスが非常に簡単です。
他言語では入出力ストリームを作成して云々、ファイルポインタを作成して云々、などと一手間かけないといけないのですが、PHPだと一瞬で終わってしまうのが楽なところでもありいい加減なところでもあります。
そんなわけで普通にWebアプリを作成する上では全く使用することはないのですが、意味もなく直接関数を書いて接続することも出来ます。
とりあえずソケット接続してみましょう。

Socket以外にもCurlSOAPやその他諸々のネットワーク系関数がたくさんあるのですが正直さっぱりわかりません。
いったい何がどう違うんだ。

socket.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php
    //送信内容
    $sock_data_array['id']='123';
    $sock_data_array['number']='456';
    
    //ソケット送信先
    $sock_server='www.example.com';
    $sock_port='80';
    $sock_script='index.php';
    
    //送信データ作成
    $sock_data=http_build_query($sock_data_array,"","&");
    $sock_server_ip=gethostbyname($sock_server);
    
    $send  = "POST /".$sock_script." HTTP/1.0\n";
    $send .= "Content-type: application/x-www-form-urlencoded\n";
    $send .= "Content-Length: ".strlen($sock_data)."\n\n";
    $send .= $sock_data."\n\n";
    
    //ソケット作成
    $sock=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
    
    //ソケット接続先
    socket_connect($sock,$sock_server_ip,$sock_port);
    
    //データ送信
    socket_write($sock,$send,strlen($send));
    
    //返り値取得
    $ret='';
    while($sock_res=socket_read($sock,4096)){
        $ret.=$sock_res;
    }
    
    //ソケット閉じる
    socket_close($sock);
    
    var_dump($ret);
    
    
    #file_get_contentsで同じことをやってみる
    
    //URL
    $con_url='http://'.$sock_server.'/'.$sock_script;
    
    //送信データ作成
    $send = "Content-type: application/x-www-form-urlencoded\n";
    $send.= "Content-Length: ".strlen($sock_data)."\n\n";
    
    $con_context = array(
        "http" => array(
            "method"  => "POST",
            "header"  => $send,
            "content" => $sock_data
        )
    );
    $con_stream=stream_context_create($con_context);
    
    //データ取得
    $ret=file_get_contents($con_url, false, $con_stream);
    
    var_dump($ret);


$sock_data_arrayに登録した内容がPOSTで送信されます。

$sock_serverにサーバのアドレス、$sock_scriptにパスを含めたファイル名を記入します。
$sock_scriptに対応するファイルには、適当にvar_dump($_REQUEST);でも入れておきましょう。
$sock_portはhttpである限り普通は80です。

socketではヘッダを含めたレスポンス全体が、file_get_contentsではsocketからヘッダを除いた内容が取得できたはずです。

上記内容は単にfile_get_contentsが内部でやっているだろう動作を適当にソケット関数を使ってやってみたというだけで、こういった内容ならわざわざソケット関数を使用する必要もありません。
TCP以外のプロトコルで通信したいとか、任意のヘッダを送信したいといった場合に役に立つかもしれませんししないかもしれません。
あまりに本格的な通信プログラムをPHPで作るのもどうかと思いますし、それ以前によくわかりませんし。
 
どうでもいいが↓でエラーになるのは何故ですか。

socket_get_option($sock,getprotobyname('tcp'),SO_LINGER);
Warning: socket_get_option() [function.socket-get-option]: unable to retrieve socket option [0]: 無効な引数が提供されました。

無効とか言われましても。

PR


2008/10/03 20:07 | Comments(0) | TrackBack(1) | PHP

トラックバック

トラックバックURL:
HTTPリクエストを送受信するクラスです。 送受信ならfile_get_contents()やcurl_exec()で十分だろ、と思いきやこいつらには重大な問題があります。 何処かにPOST送信を行った際、ステータスコード302が返ってくるとそっちにGETで送り直しちゃうんだよね。 http://www.studyinghttp.net/status_code#Code302 本来POSTで302が返ってきたらユーザに一旦確認したうえで移動先にPOST送信する、というのが本来の動きな...
弱小PHPerの憂鬱 | 2010/10/05 22:07

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP1-32:PHPでカレンダー | HOME | PHP1-30:GMailから簡単にメール>>
忍者ブログ[PR]