2010-11-25 10 views
0

私たちのシステムのいくつかの機能を自動化する必要があります。残念なことにAPIはなく、Telnetコマンドだけです。PHP経由のTelnetコマンド - PHPTelnetクラスを使用した非常に長い実行時間の問題

私はこれを発見しました:http://www.geckotribe.com/php-telnet/これは本質的にPHPのTelnetクラスです。

私は奇妙な問題を抱えていました。ログインに時間がかかっていたので、接続とユーザー名とパスワードの間に余分なsleep(2)を追加しました。

問題が発生しました:1行だけを出力するコマンドを実行した後、次の行(複数行出力)は、システムを2分15秒間停止させるように見えます(Eclipseデバッグモード)、ブラウザの負荷で1分20秒まで(私は180秒にタイムアウト設定を強制した後にのみ...)。

この行は次のようになります。$ r。= fread($ this-> fp、1000);クラスのDoCommand()関数で。ここで

は、私が実行しようとするスクリプトと同様に、私は最終的に取得し、出力にペーストビンリンクである(情報を保護するために変更して...)

コード:http://pastebin.com/TXEHWa05

出力:http://pastebin.com/mVFm5HM2

どのようなアイデアをこれの原因をデバッグするには?これまでのところ私のプロジェクトではデバッガは一切必要としていませんでした。( 理想的には、telnetで2-3秒のコマンドを5秒以内に実行し終えたいと思っています..それ以上ではなく 。

は、私はすぐにわかるを使用してPHPの使用状況のこの種のより多くの経験豊富な誰かがこの呼び出しが呼び出すループがでデータの1000のバイトを読んでいる:)

答えて

1

役立つことを願って)...など、ユーザーを切断する機能を追加しますすべてのデータを受信するまでの時間。 socket_get_status呼び出しが常に 'unread_bytes'の値を返す可能性があり、強制的なタイムアウトが呼び出されるまでループします。可能性のある相手側のサービスはかなり大きな応答を返します。この場合、適切な数が見つかるまで、ハングアップするたびにバイト読み取り長を1000ずつ増やすことができます。また、freadとsocket_get_statusの結果をvar_dump()で少しずつデバッグして、ハングアップしている場所を確認してください。

+0

ありがとうございます!私はプログラム全体を終了するのにまだ6〜10秒かかりますが、8192に変更しました。 – Carmageddon

+0

この値の意味は何ですか?私はそれは何文字を読むのかを理解していますが、本当に必要ですか?私にはそれは価値があるよりも多くのトラブルを引き起こすようです。 これを迂回する方法はありますか?ある日、それは8193の文字に立ち往生しません... – Carmageddon

関連する問題