ホームページ >バックエンド開発 >PHPチュートリアル >PHPソケットプログラミングの詳しい説明

PHPソケットプログラミングの詳しい説明

WBOY
WBOYオリジナル
2016-06-23 13:38:38863ブラウズ

私が最近取り組んでいるプロジェクトには、時間のかかるタスクをバックグラウンドで実行する必要がある機能がありますが、プロジェクトのメインコードは PHP に基づいているため、PHP は永続的なバックグラウンド デーモンとしてはあまり適していません。バックグラウンドで実行されている場合、デーモンが別の言語に変更されると非常に不便になります。そのためWeb側とデーモン部分の通信が絡むことは避けられず、Socketを使うのが良い方法です。

ソケットとは何ですか?

socket の本来の英語の意味は「穴」または「ソケット」です。 BSD UNIX のプロセス通信機構としては後者の意味をとります。一般に「ソケット」とも呼ばれ、IP アドレスとポートを記述するために使用され、通信チェーンへのハンドルです。インターネット上のホストは通常​​、複数のサービス ソフトウェアを実行し、複数のサービスを同時に提供します。各サービスはソケットを開き、異なるポートに異なるサービスにバインドされます。

上記の内容は Baidu Encyclopedia からのものです

簡単に言えば、ソケットは異なるサービスが異なるポートで通信するのに役立ちます。

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

set_time_limit(0);

// ホストとポートを設定

$host = "127.0.0.1" ;

// TCP ストリームを作成

$socket =ソケット_INET 、SOCK_STREAM , SOL_TCP)

or die ( "socket_create() failed:" .socket_strerror(socket_last_error()));

// ブロックモードを設定します

socket_set_block( $socket )

or die ( "socket_set_block( )失敗しました:" .socket_strerror(socket_last_error()));

// ポートにバインド

socket_bind( $socket , $host , $port )

or die ( "socket_bind() failed:" .socket_strerror (socket_last_error( )));

// リスニングを開始

ソケット_listen( $socket , 4)

or die ( "socket_listen() failed:" .ソケット_strerror(socket_last_error()));のソケット on $host:$port ... n" ;

while (true) {

// 接続リクエストを受信し、サブ接続ソケットを呼び出してクライアントとサーバー間の情報を処理します

if (( $msgsock =ソケット_accept( $socket )) < 0) {

echo "socket_accept() が失敗しました:" 。ソケット_strerror(socket_last_error());

} else {

// 读データ

$out = '' ;

while ( $buf =ソケット_read( $msgsock ,8192)){

$out .= $buf ;

}

// 写データ

$in = "データは $out" ;

ソケット_write( $msgsock , $in , strlen ( $in ));

}

// 结束通信

ソケット_close( $msgsock );

}

socket_close( $socket );

?>

服务端主行了以下步骤:

  • 创建ソケットの监听、等待连接続
  • 当链接到来時、开启一子接続处理IO
  • 客户端からの受信データ
  • 将結果写回给客户端
  • 客户端

    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

    set_time_limit(0);

    $host = "127.0.0.1" ; 

    $ポート = 12387;

    // 创建一tcp流

    $socket =ソケット_create(AF_INET, SOCK_STREAM, SOL_TCP)

    または、死ぬ ( "socket_create() failed:" .socket_strerror(socket_last_error())) ;

    echo "$host:$port...n に接続してみます" ;

    $result =ソケット_connect( $socket , $host , $port )

    or die ( "socket_connect() failed:" .socket_strerror(socket_last_error()));

    $in = "こんにちは" ;

    if (!socket_write( $socket , $in , strlen ( $in ))) {

    echo "socket_write() failed:" 。ソケット_strerror( $socket );

    } else {

    echo "発行成功!n" ;

    }

    $out = '' ;

    while ( $buf =socket_read( $socket , 8192)) {

    $out .= $buf ;

    }

    echo "受け入れられたコンテンツは: $out n" ;

    ソケット_close( $socket );

    クライアントは主に次の手順を実行します。サーバーソケット

    サーバーへのデータの書き込み サーバーからのデータの受信

  • 声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。