【PHP】httpsqs_client PHP开源代码修正版

在httpsqs作者博客上可以找到用于在php中操作httpsqs队列的客户端开源代码,实际使用中发现这个客户端代码并不严谨,对于socket stream读写处理的一些异常情况的处理考虑不够,实际中该代码可能只适合作为“短连接"来使用,如果是对于需要”长连接“并考虑处理性能的场合,这个代码需要作一些完善。

以下是在原httpsqs_client.php基础上作一些简单修改后的结果,供参考(其中socket这块,感觉php的stream对socket的处理可能不是很好,很选项不能设置,socket的错误码也不能直接获取到,有时间考虑切换到使用socket扩展库来实现):

<?php
/*
----------------------------------------------------------------------------------------------------------------
HTTP Simple Queue Service - httpsqs client class for PHP v1.7.1


Author: Zhang Yan (http://blog.s135.com), E-mail: net@s135.com
This is free software, and you are welcome to modify and redistribute it under the New BSD License
----------------------------------------------------------------------------------------------------------------
Useage:
<?php
include_once("httpsqs_client.php");
$httpsqs = new httpsqs($httpsqs_host, $httpsqs_port, $httpsqs_auth, $httpsqs_charset);
$result = $httpsqs->put($queue_name, $queue_data); //1. PUT text message into a queue. If PUT successful, return boolean: true. If an error occurs, return boolean: false. If queue full, return text: HTTPSQS_PUT_END
$result = $httpsqs->get($queue_name); //2. GET text message from a queue. Return the queue contents. If an error occurs, return boolean: false. If there is no unread queue message, return text: HTTPSQS_GET_END
$result = $httpsqs->gets($queue_name); //3. GET text message and pos from a queue. Return example: array("pos" => 7, "data" => "text message"). If an error occurs, return boolean: false. If there is no unread queue message, return: array("pos" => 0, "data" => "HTTPSQS_GET_END")
$result = $httpsqs->status($queue_name); //4. View queue status
$result = $httpsqs->status_json($queue_name); //5. View queue status in json. Return example: {"name":"queue_name","maxqueue":5000000,"putpos":130,"putlap":1,"getpos":120,"getlap":1,"unread":10}
$result = $httpsqs->view($queue_name, $queue_pos); //6. View the contents of the specified queue pos (id). Return the contents of the specified queue pos.
$result = $httpsqs->reset($queue_name); //7. Reset the queue. If reset successful, return boolean: true. If an error occurs, return boolean: false
$result = $httpsqs->maxqueue($queue_name, $num); //8. Change the maximum queue length of per-queue. If change the maximum queue length successful, return boolean: true. If  it be cancelled, return boolean: false
$result = $httpsqs->synctime($num); //9. Change the interval to sync updated contents to the disk. If change the interval successful, return boolean: true. If  it be cancelled, return boolean: false
?>
----------------------------------------------------------------------------------------------------------------
*/


class httpsqs_client
{
const KEEPALIVE_TIME = 60;
const HTTPSQS_TIMEOUT = 10;// httpsqs读写超时时间
        public $httpsqs_host;
        public $httpsqs_port;
        public $httpsqs_auth;
        public $httpsqs_charset;
        /* BEGIN: Added by zhongjun 20130515 */
        public $get_result = null;
        /* END: Added by zhongjun 20130515 */
        
        public function __construct($host='127.0.0.1', $port=1218, $auth='', $charset='utf-8') {
                $this->httpsqs_host = $host;
                $this->httpsqs_port = $port;
                $this->httpsqs_auth = $auth;
                $this->httpsqs_charset = $charset;
                return true;
        }


  public function &http_get($query)
    {
    static $socket = NULL;
static $last_time = 0;


// reset $get_result
$this->get_result = null;
$this->get_result = array();

if ($last_time == 0)
{
$last_time = time();
}

$now = time();

if ($now >= $last_time + self::KEEPALIVE_TIME)
{
/* BEGIN: Modified by zhongjun 20130504 */
/* 只是将$socket重置,应该存在发生资源泄漏的可能 */
if (isset($socket))
{
fclose($socket);
$socket = NULL;
}
/* BEGIN: Modified by zhongjun 20130504 */
}

if (is_null($socket))
{
$socket = fsockopen($this->httpsqs_host, $this->httpsqs_port, $errno, $errstr, 1);

if (!$socket)
{
logmsg($_SERVER['SCRIPT_FILENAME'], LOGID_DEBUG_LOG, "fsockopen failed in http_get");
   
$this->get_result = false;
return $this->get_result;
}

stream_set_timeout($socket, self::HTTPSQS_TIMEOUT);
}

// 组装get报文
   $out = "GET ${query} HTTP/1.1\r\n";
   $out .= "Host: ${host}\r\n";
   $out .= "Connection: Keep-Alive\r\n";
   $out .= "Keep-Alive:".self::KEEPALIVE_TIME."\r\n";
   $out .= "\r\n";
   
   // 发送get请求
   $ret = fwrite($socket, $out);
   if ((false === $ret) || ($ret != strlen($out)))
   {
    // 发送get请求出错,或超时
    logmsg($_SERVER['SCRIPT_FILENAME'], LOGID_DEBUG_LOG, "write GET request failed in http_get");
   
    fclose($socket);
    $socket = NULL;   
   
    $this->get_result = false;
    return $this->get_result;
   }
   
   // 当请求发送成功时,更新$last_time
   $last_time = $now;
   
   $line = trim(fgets($socket));
   $header .= $line;
   list($proto, $rcode, $result) = explode(" ", $line);
   $len = -1;
   
   while (($line = trim(fgets($socket))) != "")
   {
       $header .= $line."\n";
       if (strstr($line, "Content-Length:"))
       {
           list($cl, $len) = explode(" ", $line); 
       }
       if (strstr($line, "Pos:"))
       {
           list($pos_key, $pos_value) = explode(" ", $line);
       }                   
       if (strstr($line, "Connection: close"))
       {
           $close = true;
       }
   }
   
   if ($len < 0)
   {
// 接收应答消息的http头失败
    logmsg($_SERVER['SCRIPT_FILENAME'], LOGID_DEBUG_LOG, "read http header failed in http_get");
   
    fclose($socket);
    $socket = NULL;
   
    $this->get_result = false;
    return $this->get_result;
   }
        
   // 接收消息体,最多尝试3次
        $body = fread($socket, $len);
        
        $fread_times = 0;
        while(strlen($body) < $len)
        {
        if ($fread_times > 1)
        {
        break;
        }
       
            $body1 = fread($socket, $len - strlen($body));
            
            $body .= $body1;
            unset($body1);                    
            
            $fread_times++;
        }
        
        if (strlen($body) < $len)
        {
        // fread出错或超时
        logmsg($_SERVER['SCRIPT_FILENAME'], LOGID_DEBUG_LOG, "read http body failed in http_get, the received body:\n$body");
       
        fclose($socket);
        $socket = NULL;
       
        $this->get_result = false;
        return $this->get_result;
        }   
        
        if ($close)
        {
        logmsg($_SERVER['SCRIPT_FILENAME'], LOGID_DEBUG_LOG, "http_get: the CONNECTION option is CLOSE in http header");
        fclose($socket);
        $socket = NULL;
        }
        
        $this->get_result["pos"] = (int)$pos_value;
        $this->get_result["data"] = $body;
        
        return $this->get_result;
    }
    




    public function http_post($query, &$body)
    {
    static $socket = NULL;
    static $last_time = 0;
   
    if ($last_time == 0)
    {
    $last_time = time();
    }
   
    $now = time();
   
    if ($now >= $last_time + self::KEEPALIVE_TIME)
    {
    /* BEGIN: Modified by zhongjun 20130504 */
    /* 只是将$socket重置,应该存在发生资源泄漏的可能 */
    if (isset($socket))
    {
    fclose($socket);
    $socket = NULL;
    }
    /* BEGIN: Modified by zhongjun 20130504 */
    }
   
    if (is_null($socket))
    {
    $socket = fsockopen($this->httpsqs_host, $this->httpsqs_port, $errno, $errstr, 1);
   
    if (!$socket)
    {
    logmsg($_SERVER['SCRIPT_FILENAME'], LOGID_DEBUG_LOG, "fsockopen failed in http_get");
    return false;
    }
   
    // 将socket读写超时设为10秒
    stream_set_timeout($socket, self::HTTPSQS_TIMEOUT);
    }

// 组装put消息
        $out = "POST ${query} HTTP/1.1\r\n";
        $out .= "Host: ${host}\r\n";
        $out .= "Content-Length: " . strlen($body) . "\r\n";
        $out .= "Connection: Keep-Alive\r\n";
$out .= "Keep-Alive:".self::KEEPALIVE_TIME."\r\n";
        $out .= "\r\n";
        $out .= $body;
        
// 发送put命令
        $ret = fwrite($socket, $out);
        if ((false === $ret) || ($ret != strlen($out)))
        {
        // 发送get请求出错,或超时
        logmsg($_SERVER['SCRIPT_FILENAME'], LOGID_DEBUG_LOG, "write GET request failed in http_post");
        
        fclose($socket);
        $socket = NULL;
        
        return false;
        }


        // 当请求发送成功时,更新$last_time
        $last_time = $now;
        
        $line = trim(fgets($socket));
        $header .= $line;
        list($proto, $rcode, $result) = explode(" ", $line);
        
        $len = -1;        
        while (($line = trim(fgets($socket))) != "")
        {
            $header .= $line;
            if (strstr($line, "Content-Length:"))
            {
                list($cl, $len) = explode(" ", $line);
            }
            if (strstr($line, "Pos:"))
            {
                list($pos_key, $pos_value) = explode(" ", $line);
            }                   
            if (strstr($line, "Connection: close"))
            {
                $close = true;
            }
        }
        
        if ($len < 0)
        {
            // 接收应答消息的http头失败
    logmsg($_SERVER['SCRIPT_FILENAME'], LOGID_DEBUG_LOG, "read http header failed in http_post");
   
    fclose($socket);
    $socket = NULL;
   
    return false;
        }
        
        $recv_body = @fread($socket, $len);
        
        if (strlen($recv_body) < $len)
        {
        // fread出错或超时
        logmsg($_SERVER['SCRIPT_FILENAME'], LOGID_DEBUG_LOG, "read http body failed in http_post, the received body:\n$recv_body");
         
        fclose($socket);
        $socket = NULL;
         
        return false;
        }
        
        if ($close)
        {
        logmsg($_SERVER['SCRIPT_FILENAME'], LOGID_DEBUG_LOG, "http_post: the CONNECTION option is CLOSE in http header");
        fclose($socket);
        $socket = NULL;
        }


        $result_array["pos"] = (int)$pos_value;
        $result_array["data"] = $recv_body;
        
        return $result_array;
    }
        
   
    
    public function put(&$queue_name, &$queue_data)
    {
    $tPostBegin = time();
        $result = $this->http_post("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=put", $queue_data);
        $tPostEnd = time();
        
        $tTime = $tPostEnd - $tPostBegin;
        if ($tTime > self::HTTPSQS_TIMEOUT)
        {
        logmsg($_SERVER['SCRIPT_FILENAME'], LOGID_DEBUG_LOG, "httpsqs put takes $tTime seconds, and result is :".$result["data"]);
        }
        
        if ($result["data"] == "HTTPSQS_PUT_OK") 
        {
            return true;
        } 
        else if ($result["data"] == "HTTPSQS_PUT_END") 
        {
            return $result["data"];
        }


        return false;
    }
    
    public function &get(&$queue_name)
    {
    $tGetBegin = time();
        $result = &$this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=get");
    $tGetEnd = time();
        
        $tTime = $tGetEnd - $tGetBegin;
        if ($tTime > self::HTTPSQS_TIMEOUT)
        {
        logmsg($_SERVER['SCRIPT_FILENAME'], LOGID_DEBUG_LOG, "httpsqs get takes $tTime seconds, and result is :$result");
        }
        
   return $result["data"];
    }
    
     public function get_alive($queue_name)
    {
        $result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=get");
                if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false) {
                        return false;
                }
      return $result["data"];
 //       return $result;
    }
   
        
    public function gets($queue_name)
    {
        $result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=get");
                if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false) {
                        return false;
                }
        return $result;
    }   
        
    public function status($queue_name)
    {
        $result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=status");
                if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false) {
                        return false;
                }
        return $result["data"];
    }
        
    public function view($queue_name, $queue_pos)
    {
        $result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=view&pos=".$queue_pos);
                if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false) {
                        return false;
                }
        return $result["data"];
    }
        
    public function reset($queue_name)
    {
        $result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=reset");
                if ($result["data"] == "HTTPSQS_RESET_OK") {
                        return true;
                }
        return false;
    }
        
    public function maxqueue($queue_name, $num)
    {
        $result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=maxqueue&num=".$num);
                if ($result["data"] == "HTTPSQS_MAXQUEUE_OK") {
                        return true;
                }
        return false;
    }
        
    public function status_json($queue_name)
    {
        $result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=status_json");
                if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false) {
                        return false;
                }
        return $result["data"];
    }


    public function synctime($num)
    {
        $result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=httpsqs_synctime&opt=synctime&num=".$num);
                if ($result["data"] == "HTTPSQS_SYNCTIME_OK") {
                        return true;
                }
        return false;
    }
}
?>

【基于QT的调色板】是一个使用Qt框架开发的色彩选择工具,类似于Windows操作系统中常见的颜色选取器。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式设备,支持C++和QML语言。这个调色板功能提供了横竖两种渐变模式,用户可以方便地选取所需的颜色值。 在Qt中,调色板(QPalette)是一个关键的类,用于管理应用程序的视觉样式。QPalette包含了一系列的颜色角色,如背景色、前景色、文本色、高亮色等,这些颜色可以根据用户的系统设置或应用程序的需求进行定制。通过自定义QPalette,开发者可以创建具有独特视觉风格的应用程序。 该调色板功能可能使用了QColorDialog,这是一个标准的Qt对话框,允许用户选择颜色。QColorDialog提供了一种简单的方式来获取用户的颜色选择,通常包括一个调色板界面,用户可以通过滑动或点击来选择RGB、HSV或其他色彩模型中的颜色。 横渐变取色可能通过QGradient实现,QGradient允许开发者创建线性或径向的色彩渐变。线性渐变(QLinearGradient)沿直线从一个点到另一个点过渡颜色,而径向渐变(QRadialGradient)则以圆心为中心向外扩散颜色。在调色板中,用户可能可以通过滑动条或鼠标拖动来改变渐变的位置,从而选取不同位置的颜色。 竖渐变取色则可能是通过调整QGradient的方向来实现的,将原本水平的渐变方向改为垂直。这种设计可以提供另一种方式来探索颜色空间,使得选取颜色更为直观和便捷。 在【colorpanelhsb】这个文件名中,我们可以推测这是与HSB(色相、饱和度、亮度)色彩模型相关的代码或资源。HSB模型是另一种常见且直观的颜色表示方式,与RGB或CMYK模型不同,它以人的感知为基础,更容易理解。在这个调色板中,用户可能可以通过调整H、S、B三个参数来选取所需的颜色。 基于QT的调色板是一个利用Qt框架和其提供的色彩管理工具,如QPalette、QColorDialog、QGradient等,构建的交互式颜色选择组件。它不仅提供了横竖渐变的色彩选取方式,还可能支持HSB色彩模型,使得用户在开发图形用户界面时能更加灵活和精准地控制色彩。
标题基于Spring Boot的二手物品交易网站系统研究AI更换标题第1章引言阐述基于Spring Boot开发二手物品交易网站的研究背景、意义、现状及本文方法与创新点。1.1研究背景与意义介绍二手物品交易的市场需求和Spring Boot技术的适用性。1.2国内外研究现状概述当前二手物品交易网站的发展现状和趋势。1.3论文方法与创新点说明本文采用的研究方法和在系统设计中的创新之处。第2章相关理论与技术介绍开发二手物品交易网站所涉及的相关理论和关键技术。2.1Spring Boot框架解释Spring Boot的核心概念和主要特性。2.2数据库技术讨论适用的数据库技术及其在系统中的角色。2.3前端技术阐述与后端配合的前端技术及其在系统中的应用。第3章系统需求分析详细分析二手物品交易网站系统的功能需求和性能需求。3.1功能需求列举系统应实现的主要功能模块。3.2性能需求明确系统应满足的性能指标和安全性要求。第4章系统设计与实现具体描述基于Spring Boot的二手物品交易网站系统的设计和实现过程。4.1系统架构设计给出系统的整体架构设计和各模块间的交互方式。4.2数据库设计详细阐述数据库的结构设计和数据操作流程。4.3界面设计与实现介绍系统的界面设计和用户交互的实现细节。第5章系统测试与优化说明对系统进行测试的方法和性能优化的措施。5.1测试方法与步骤测试环境的搭建、测试数据的准备及测试流程。5.2测试结果分析对测试结果进行详细分析,验证系统是否满足需求。5.3性能优化措施提出针对系统性能瓶颈的优化建议和实施方案。第6章结论与展望总结研究成果,并展望未来可能的研究方向和改进空间。6.1研究结论概括本文基于Spring Boot开发二手物品交易网站的主要发现和成果。6.2展望与改进讨论未来可能的系统改进方向和新的功能拓展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值