使用现有的 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。

任何想法或简单的解决方案将不胜感激。

谢谢。

详细说明@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);
?>

最新更新