2017-08-13 16 views
1

...使用既存のPHPソケット

私は、サーバーにストリーミングソケットを開き、PHPスクリプトを持って、応答のための要求を待つ送信メッセージ。スクリプト上


<?php 
$addr="192.168.1.1"; 
$port=6010; 

$sock = fsockopen("tcp://$addr:$port", $errno, $errstr, $timeout) or die("socket problem"); 
stream_set_timeout($sock,30) or die("timeout not set"); 

$message='<?xml version="1.0" encoding="UTF-8"?><Request><Type>1</Type></Request>' 

$slen=pack("N",strlen($message)); 

fwrite($sock,$slen.$message); 

ob_flush();flush(); 

while((!feof($sock)) && (!$info['timed_out'])){ 
    $b3=fread($sock,3); 
    $b4=fread($sock,1); 
    $temp=unpack("N",$b3.$b4); 
    $length=$temp[1]; 
    $lines=fread($sock,$length); 
    if($lines){ 
     if(preg_match("'<Response>(.*?)</Response>'",$lines, $match)){ 
      if($match){ 
       $content=$match[1]; 
       echo nl2br($content); 
      } 
     } 
    } 
    $info = stream_get_meta_data($sock); 
} 
fclose($sock); 
?> 

はうまく動作しますが、私は、whileループを終了し、サーバーにキャンセルメッセージを送信するために( - ボタンキャンセル)が機能を追加したいと思います:スクリプトは次のようになります同じソケットを使用して、例えばタイプ0

問題は、サブミットによってページがリフレッシュされ、現在の$ sockが緩くなることです。

いずれかのアイデアや簡単な解決策が高く評価されます。

ありがとうございました。 T.

+1

私はあなたがスクリプトは、データベースから状態を読み込むように、外部の何かを確認する必要があるとしている実行しているされたと考えることができますすべてのファイル処理をいつ変更するかを知るために、各反復でセッションハンドラを開始および終了させることができます。 – Scuzzy

答えて

0

@Scuzzyが示唆していることを詳述すると、を別のPHPスクリプトに非同期でと呼ぶ「キャンセルボタン」を持つことができます。これは、ファイル/ディスク/データベース(あなたの選択)にユーザがキャンセルを要求したことを示すフラグを設定します。

非同期呼び出しは、メインのPHPスクリプトでセッションを保持します。

このメインループでは、定期的にフラグの状態を確認し、フラグが設定されているとすぐに終了し、必要に応じて追加のクリーンアップを実行します。

メインループのための擬似コードは次のようになります。

<?php 
/* 
    All the initialization 
*/ 

cancelOperation = False; 
while((!feof($sock)) && (!$info['timed_out'])){ 
    $b3=fread($sock,3); 
    $b4=fread($sock,1); 
    $temp=unpack("N",$b3.$b4); 
    $length=$temp[1]; 
    $lines=fread($sock,$length); 
    if($lines){ 
     if(preg_match("'<Response>(.*?)</Response>'",$lines, $match)){ 
      if($match){ 
       $content=$match[1]; 
       echo nl2br($content); 
      } 
     } 
    } 
    $info = stream_get_meta_data($sock); 

    // Now check external condition, from either file or db for example 
    cancelOperation = checkExternalCondition(); 
    if (cancelOperation === True) { 
     break; 
    } 
} 
if (cancelOperation === True) { 
    // additional cleanup needed goes here. 
} 
fclose($sock); 
?> 
+0

入力用のScuzzyとSalをお寄せいただきありがとうございます。私は提案されたアプローチをテストして、これを行う最も適切な方法を見つけます... – Tapass

関連する問題