使用现有的PHP套接字

时间:2017-08-13 22:15:47

标签: php sockets stream

这是我在论坛上的第一篇帖子,所以对任何新手的错误表示道歉......

我有一个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。

任何想法或简单的解决方案都将受到高度赞赏。

感谢。吨。

1 个答案:

答案 0 :(得分: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);
?>