[PHP-users 19336]プロセス間通信

Tsukasa Koizumi tsukasa @ koiz.com
2003年 12月 12日 (金) 22:06:29 JST


小泉です。お世話になります。

PHPからPerlで書かれたサブプロセスへコマンドを送り、その出力を受け取る
…というスクリプトを作成しています。

ただし、動作環境に次のような制限があります。

    ・PHP 4.2.3
    ・pcntl、socketsはコンパイルされていない

そこで、次のような仕組みでサブプロセスとの間で通信をしようと考えました。

[PHP]
  popen()でPerlスクリプトを起動         fopenで出力ファイルを開く
  fwrite()でコマンドを送信              fgetsで逐次読み込み
            ↓                                   ↑
[Perl]
    標準入力からコマンドを受信    →    処理結果をファイルへ出力

※出力はFIFOを介して受け取る方法も検討中です…。

ところが、上記の左側…つまりPHPからPerlスクリプトへコマンドを送るとこ
ろで難航しています。

下記は検証用に作ったスクリプトです。
PHPから文字列を1行送るごとに、Perl側でwhileループが1回処理される…とい
う仕様です。

しかしこれを実行すると、PHP側で20行目のpclose()が実行された時点で、送
信された4行の文字列がPerl側で受信され、処理されます。

念のためPHP 4.3.xでも試したのですが、4.3.xでは1行ごとに実行されました。

これはおそらく4.2.3のバグによるものだろうと思われますが、4.2.3でこれを
なんとか解決する方法がありましたら、ご教授いただきたいのです。

よろしくお願いいたします。

#↓この辺が関係ありそうな…
#http://nx.eth.jp/hiki.cgi?PHP-Changes-4.3.0
#「出力バッファのサイズが0になった場合の無限ループを修正。(Marcus, 
Wez) 」



[PHP]-----------------------------------------------------------------
<?php
$fp = popen("./test.pl", "w");

sleep(1);
fwrite($fp, "aaaaaaaaaa\n");
ob_flush();

sleep(1);
fwrite($fp, "bbbbbbbbbb\n");
ob_flush();

sleep(1);
fwrite($fp, "ccccccccccc\n");
ob_flush();

sleep(1);
fwrite($fp, "quit\n");
ob_flush();

pclose($fp);
?>
----------------------------------------------------------------------

[Perl]----------------------------------------------------------------
#!/usr/bin/perl
open FILE, ">./result";
select FILE;
$| = 1;

print FILE "START\n";

while (1) {
	$_ = <STDIN>;
	print FILE $_;
	if ($_ eq "quit\n") {
		last;
	}
}

close FILE;
----------------------------------------------------------------------



/*------------------------------------------------------------------*/
/* 小泉 司@コイズコムデジタルワークス(東京都文京区)              */
/* Desk: mailto:tsukasa @ koiz.com / Mobile: mailto:pigtail @ pdx.ne.jp */
/* PGP Public Key: http://www.koiz.com/~tsukasa/PGP_KEY/tsukasa.asc */
/*------------------------------------------------------------------*/


PHP-users メーリングリストの案内