LoginSignup
6
7

More than 5 years have passed since last update.

PHPとRuby間のソケット通信

Posted at

PHPプログラムとRubyプログラム間でソケット疎通しデータを受け渡す作業がありましたのでメモ。___〆(..)
※基本動作のみ行うシンプルなコードになっています。ruby 1.8.7、PHP 5.4.29です。

★PHP側(ソケット通信でRubyにデータを送信)

send.php
<?php
    $socket = null;
    //ソケット生成。localhostに40001番ポートで接続。タイムアウトは5秒とする。
    $socket = fsockopen("localhost",40001,$errno, $errstr,5);

    //ソケット接続結果
    if(!$socket){
        echo("ソケット接続失敗\n");
    }else{
        echo("ソケット接続成功\n");
    }

    //メッセージ送信
    $fwrite = fwrite($socket, "Hello, World!");

    //ソケット書き込み結果
    if(!$fwrite){
        echo("ソケット書き込み失敗\n");
    }else{
        echo("ソケット書き込み成功\n");
    }
    //ソケットクローズ
    fclose($socket);
?>

★Ruby側(ソケット通信でデータを受信)

receive.rb
#!/usr/bin/ruby -Ku
# encoding: utf-8

require 'socket'

begin
    # TCPサーバOPEN。PHPと疎通。
    socket=TCPServer.open("localhost",40001)
    print "TCPサーバ起動\n"
rescue => e
    # エラー処理
    print "TCPサーバ起動エラー\n"
else
    @socks=[socket]
    #ソケットの書き込みを常時待ち受ける
    while true
        sleep 1

        # 入力待ちSocket収集
        read_sock = select(@socks, nil, nil, 0.1)

        # 読み取り可能なソケットはあるか?
        unless read_sock == nil
            read_sock[0].each{|rs|
                # 新規接続か?
                if rs == socket then
                    cs=rs.accept
                    #接続を許可し、そのオブジェクトをソケット配列に入れる
                    @socks.push(cs)
                    # 接続情報出力
                    print "接続しました " + cs.peeraddr[3].to_s + "[" + cs.peeraddr[1].to_s + "]\n"
                else
                    #メッセージ受け取り実行
                    msg=rs.recv(8192)
                    #何も受信してるものがなければソケット情報配列からacceptしたソケット情報を削除し、ソケットをクローズ
                    if msg.empty? then
                        @socks.delete(rs)
                        rs.close
                    else
                        print "受信メッセージ: " + msg + "\n"

                        #受信したらソケットをクローズ
                        @socks.delete(rs)
                        rs.close
                    end
                end
            }
        end

    end
end

receive.rbを起動し、TCPサーバをOPENした状態にしてからPHPを実行してみます。

★PHP側の標準出力
PHP.PNG

★Ruby側の標準出力
RUBY.PNG

ちなみにreceive.rbを起動していないとソケット接続の確立ができないのでPHP側の結果は以下のようになります。
PHP2.PNG

まぁ、そのまんまなんですが・・・。(・ω・)

初めての方でもコピペで実装できちゃうくらいシンプルにまとめてみました。(・o・)

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7