这是我在论坛上的第一篇帖子,所以对任何新手的错误表示道歉......
我有一个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。
任何想法或简单的解决方案都将受到高度赞赏。
感谢。吨。
答案 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);
?>