ストリーム(?)を最後まで読み込みたいのですが、うまく出来ません。


下記のように、終端まで読み込もうとするとループしてしまうようです(とにかく動かなくなります)。

$stream1 = ssh2_shell($connection, 'vt100', null, 80, 24, SSH2_TERM_UNIT_CHARS);
stream_set_blocking($stream1,true);
while($line3 = fgets($stream1)){
print($line3);
}

下記のように、1行だけなら読み込めます。

$line = fgets($stream1);
print($line);

よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/06/16 00:48:09
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kn1967 No.2

回答回数2915ベストアンサー獲得回数301

ポイント35pt

fgets は ファイル終端コード(EOF:1A)で区切りを付けますが

VT-100 の場合は 伝送終了コード(EOT:04) で区切りを付けるため

fgets が延々と続きを待ち続けているのではないかと思われます。


php5 から実装された stream-get-line であればコードを自分で設定できますので

下記のようにしてみてはいかがでしょう。

while($line3 = stream-get-line($stream1, "\x04")){

PHP: stream_get_line - Manual

id:rapuntuleru

コメントありがとうございます。

勉強しつつ、やってみます。

別質問については、回答がついていませんでしたので、とりあえず削除しました(また、似たような質問を出させていただくかもしれまんせんが)。

2009/06/11 19:37:23

その他の回答2件)

id:pahoo No.1

回答回数5960ベストアンサー獲得回数633

ポイント35pt

ブロックモードに入っているので、fgetsはVT100からの終了条件を判断できず、無限ループに陥っていると思われます。

何らかの終了条件を設定してやる必要があります。

id:rapuntuleru

回答ありがとうございます。

ストリームのブロックモードと非ブロックモードの違いがよく分かってないので、また別に質問させていただくかもしれません。

2009/06/11 14:04:10
id:kn1967 No.2

回答回数2915ベストアンサー獲得回数301ここでベストアンサー

ポイント35pt

fgets は ファイル終端コード(EOF:1A)で区切りを付けますが

VT-100 の場合は 伝送終了コード(EOT:04) で区切りを付けるため

fgets が延々と続きを待ち続けているのではないかと思われます。


php5 から実装された stream-get-line であればコードを自分で設定できますので

下記のようにしてみてはいかがでしょう。

while($line3 = stream-get-line($stream1, "\x04")){

PHP: stream_get_line - Manual

id:rapuntuleru

コメントありがとうございます。

勉強しつつ、やってみます。

別質問については、回答がついていませんでしたので、とりあえず削除しました(また、似たような質問を出させていただくかもしれまんせんが)。

2009/06/11 19:37:23

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 espresso3389 35 34 6 2009-06-13 23:47:06
  • id:rapuntuleru
    質問者です。
    stream_set_blocking()をfalseにしても、やはりループしてしまいます…。
    適当な終了条件はないでしょうか?…(色々試していますがうまくいきません)
  • id:kmond2
    おや、これは「ポイントを消費させる目的のコメント」では?
    http://q.hatena.ne.jp/1243146827/218227/#i218246
  • id:kn1967
    ストリームを開く際の設定は、ブロックモードがデフォルトなので
    stream_set_blocking() での宣言自体は特にいらなかったりします。

    # 別質問 http://q.hatena.ne.jp/1244706134 は
    # 非ブロックモードについてうまく文章に出来ないので回答できませんが
    # どなたかから判りやすい回答がもらえると嬉しいですね。

  • id:hijk04
    (はてなにより削除しました)
  • id:kmond2
    他の質問に関する言い訳をここに書いてどうするつもりでしょう?
    http://q.hatena.ne.jp/1243146827
  • id:rapuntuleru
    質問者です。
    空白が何回か連続したら、whileからbreakするという荒業でとりあえずは動いたので、最悪それでいってしまおうかと…。
    kn1967さんの方法はまだ試せていません。
  • id:hijk04
    (はてなにより削除しました)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません