PHP - fwrite() 不写入套接字
PHP - fwrite() does not write to socket
我正在 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()
被称为它return它成功地写入了所有字节. (PHP 文档说函数的 return 值是写入的字节数。)所以这一切似乎工作得很好。
但是 服务器永远不会从客户端获取数据。我用我为调试目的编写的一个简单的 PHP 套接字服务器测试了客户端,但它也没有从客户端检索任何数据。
我不知道为什么会这样。连接已成功建立,如前所述,客户端可以从服务器 检索 数据。但是由于某种原因,fwrite()
没有成功发送数据。
没有错误或警告消息。日志级别 E_ALL
.
版本和信息:
- OS: Debian 10 Buster,所有软件包都是最新版本。
php --version
输出: PHP 7.3.19-1~deb10u1
更多信息请在这里提问,我会积极回答问题。
似乎在这种情况下 fwrite
只写入缓冲区而不是直接发送数据。
要强制发送 fflush
可以使用。
我正在 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()
被称为它return它成功地写入了所有字节. (PHP 文档说函数的 return 值是写入的字节数。)所以这一切似乎工作得很好。
但是 服务器永远不会从客户端获取数据。我用我为调试目的编写的一个简单的 PHP 套接字服务器测试了客户端,但它也没有从客户端检索任何数据。
我不知道为什么会这样。连接已成功建立,如前所述,客户端可以从服务器 检索 数据。但是由于某种原因,fwrite()
没有成功发送数据。
没有错误或警告消息。日志级别 E_ALL
.
版本和信息:
- OS: Debian 10 Buster,所有软件包都是最新版本。
php --version
输出: PHP 7.3.19-1~deb10u1
更多信息请在这里提问,我会积极回答问题。
似乎在这种情况下 fwrite
只写入缓冲区而不是直接发送数据。
要强制发送 fflush
可以使用。