さくらインターネット : PHP から Ruby の呼び出し

  結論から言うと、プロセス呼び出しはアウト



関連する記事
さくらインターネット : PuTTY ごった煮版で SSH 接続
さくらインターネット : PuTTY ごった煮版 + FDclone
さくらインターネット : Ruby : rubygems-1.3.5 のインストール( + mechanize )
さくらインターネット : Ruby+mechanize : mixi ボイスへの投稿を php と連携して行う


サーバー側で同じディレクトリに存在するのだから、直接呼び出したほうが良いのかと試してみると、
重い上に、POST の文字列に制限があるようなのですが、チューニングの方法を探すより HTTP で
呼び出したほうが良いと思い、方向転換するとあっさりうまく行きました。

まずは失敗した方法を以下に示します

  
$descriptorspec = array(
	0 => array("pipe", "r"),
	1 => array("pipe", "w"),
	2 => array("pipe", "w")
);

$process = proc_open('ruby mixi_voice.rb', $descriptorspec, $pipes);

if (is_resource($process)) {

	$str = mb_convert_encoding( $_POST['text1'], "utf-8", "euc-jp"  );
	$str = urlencode($str);

	fwrite($pipes[0], 
		"user1={$_POST['user1']}&pass1={$_POST['pass1']}&text1=$str");
	fclose($pipes[0]);

	echo stream_get_contents($pipes[1]);
	fclose($pipes[1]);

	stream_get_contents($pipes[2]);
	fclose($pipes[2]);

	$return_value = proc_close($process);

	echo "command returned $return_value\n";

}
  

マニュアルのサンプルコードをほぼそのまま転用しており、ログインはできたのですが
データ送ろうとすると正しく送れないようでした



  HTTP 呼び出し



この方法は、URL をファイルとして開く事が許されている必要がありますので、
レンタルサーバーによっては使え無いかもしれませんので注意して下さい
( allow_url_fopen )

  
mb_language( "ja" );
mb_internal_encoding("EUC-JP");

$url = "http://winofsql.jp/ruby/mixi_voice.rb";
$str = mb_convert_encoding( $_POST['text1'], "utf-8", "euc-jp"  );
$str = urlencode($str);
$params = "user1={$_POST['user1']}&pass1={$_POST['pass1']}&text1=$str";

print $params;

$result = file_get_contents($url, false, stream_context_create(array(
	"http" => array(
		"method" => "POST",
		"content" => $params
	)
)));

print $result;
  

POST の場合は必ず content に生データを設定する必要があります
( PHP: HTTP コンテキストオプション - Manual を参照 )

GET の場合は URL に付加しますが、間違っていてもサーバー側の仕様で偶然動く場合がありますが、
HTTP プロトコル上はこのような設定になります










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ