6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?