PHP 套接字连接优化

Posted

技术标签:

【中文标题】PHP 套接字连接优化【英文标题】:PHP socket connection optimization 【发布时间】:2011-05-31 03:43:45 【问题描述】:

我正在使用使用 telnet 的 API 建立此连接,当我在 shell 中运行命令时,一切都发生得更快,但是,当我使用 php 套接字运行命令时,性能会急剧下降。我有一些误解的代码?

/ **  
* Tries to make the connection to the server specified in the constructor, if the connection is made returns TRUE  
* Otherwise FALSE.  
* @Return boolean  
*/  
public function connect()   

    try   
        $stream = fsockopen($this->getHost(), $this->getPort(), $errno, $errstr, $this->getTimeOut());  

        $this->setStream($stream);  

        return true;  
     catch (ErrorException $e)   
        echo $e->getMessage();  
        return false;  
     catch (Exception $e)   
        echo $e->getMessage();  
        return false;  
      
  

/ **
* Runs the specified command in $command at voipzilla's API through a socket connection.  
* @See $this-> connect ()  
* @Param string $command  
* @Param int $nl number of new lines (Enter) after the command   
* @Param boolean $command Sets the command clause will be added to the specified command  
* @Return string coming API's response API  
* /  
public function runCommand($command, $nl=4, $commandClause=true)   
        //response  
        $response = null;  
        //
        $login = "login " . $this->getLogin() . "\n";  
        $login .= "password " . $this->getPassword() . "\n\n";  

        if ($commandClause)   
            $command = "command " . $command;  
          

        $command = $login . $command;  

        for ($i = 1; $i <= $nl; $i++)   
            $command .= "\n";  
          

        if(!$this->connect())exit(0);  

        fwrite($this->getStream(), $command);  

        while (!feof($this->getStream()))   
            $response .= fgets($this->getStream(), 128);  
          

        return $response;  

【问题讨论】:

【参考方案1】:

因为您的代码每次都会自行连接和验证(登录)一个命令。因此,客户端和服务器之间的通信比单个 SSH 会话更多。

解决方案:尝试使用pfsockopen 而不是fsockopen,并且不要每次都进行身份验证。它的行为与fsockopen() 完全相同,不同之处在于脚本完成后连接不会关闭。它是fsockopen() 的永久版本。

【讨论】:

我只尝试过一次认证,当认证后尝试运行命令时,该命令没有执行,因为API自动关闭连接,应该由interval承担在身份验证和执行下一个命令之间(由于速度慢,时间很长)。我现在正在做的方式(每次都进行身份验证)有效。我使用了 pfsockopen 并且速度仍然缓慢。

以上是关于PHP 套接字连接优化的主要内容,如果未能解决你的问题,请参考以下文章

高流量站点NGINX与PHP-fpm配置优化

使用 PHP 的多套接字连接

PHP Web套接字未在SSL中连接

PHP反复从TCP套接字接收数据

无法捕获 PHP 套接字连接的响应 :: 504 Gateway Time-out

PHP TCP 套接字连接限制 - Windows 服务器