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を実行してみます。
ちなみにreceive.rbを起動していないとソケット接続の確立ができないのでPHP側の結果は以下のようになります。
まぁ、そのまんまなんですが・・・。(・ω・)
初めての方でもコピペで実装できちゃうくらいシンプルにまとめてみました。(・o・)