PHP - fwrite() 不写入套接字

问题描述

我正在使用 PHP 开发面向对象的应用程序,该应用程序连接到远程服务器以读取和发送数据。为此,我使用 fsockopen()fgets() 读取、fwrite() 写入和 fclose()
我把它简化为必要的代码

<?PHP
namespace myApplication;

class client {
    protected $socket;
    public $connected = false;
    
    public function connect(string $host,int $port) : bool {
        if (($this->socket = fsockopen($host,$port,$errno,$errstr,15)) == false) {
            return false; //or error handling
        }
        $this->connected = true;
        return true;
    }
    
    public function disconnect() {
        if ($this->connected) {
            @fclose($this->socket);
            $this->connected = false;
        }
    }
    
    
    public function read() : ?string {
        if ($this->connected === false) {
            /*
            throw error
            */
        }
        
        if (($data = fgets($this->socket)) !== false) {
            return $data;
        }
        else {
            /*
            error handling
            */
        }
    }
    
    public function write($write_data) : bool {
        if ($this->connected === false) {
            /*
            throw error
            */
        }
        
        $write_data .= "\r\n"; //carriage return,newline
        if (fwrite($this->socket,$write_data,strlen($write_data)) != false) {
            return true;
        }
        else {
            /*
            error handling
            */
            return false;
        }
    }
}

问题

首先,似乎一切都按预期进行。客户端连接到服务器,它成功地检索到服务器发送的第一行问候语,并在调用 fwrite() 时返回它已成功写入所有字节。 (PHP 文档说函数的返回值是写入的字节数。)所以这一切似乎都很好。

但是服务器永远不会从客户端获取数据。我使用我为调试目的编写的小型 PHP 套接字服务器测试了客户端,但它也没有从客户端检索任何数据。

我不知道为什么会这样。连接正在成功建立,并且如上所述客户端可以从服务器检索数据。但是出于某种原因,fwrite() 没有成功发送数据。

没有错误或警告消息。日志级别 E_ALL

版本和信息:

  • 操作系统: Debian 10 Buster,最新版本的所有软件包。
  • PHP --version 输出 PHP 7.3.19-1~deb10u1

欲了解更多信息,请在这里提问,我会积极回答问题。

解决方法

在这种情况下,似乎 fwrite 只写入缓冲区而不是直接发送数据。 可以使用强制发送 fflush