PHP中,我用pfsockopen和服务器建立了一个连接,然后用fwrite对连接进行发送,最后用fread等待服务器返回的数据。
但服务器那边如果没进行数据返回时,fread阻塞在那里,中间过程中服务器那边打印显示会再次accept到一个连接(服务器当前只会有这一个设备对其连接)。
各位大神指导这个为什么吗,求解答呀,困惑好多天了?
PHP中fread在等待时为什么会再建两次连接?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
你知我知皆知 2024-08-03 23:31关注以下回答参考 皆我百晓生、券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。
这个问题是由于PHP的资源管理器(Resource Manager)在等待服务器响应的时候可能会重新创建新的资源连接。这通常是出于安全考虑,防止资源被意外地滥用或浪费。
例如,在使用
socket函数来建立TCP连接时,PHP的resource_id变量可能在每次调用resource_close()方法后都会自动关闭。然而,当服务器没有返回任何数据时,resource_id变量可能会被错误地认为已经关闭,并且不会被正确地释放。要解决这个问题,你可以尝试以下几种方式:
- 使用
resource_id变量: 在PHP中,resource_id是一个整数,用于跟踪正在使用的资源。你可以通过检查它是否为0来确定资源是否已被正确关闭。
$resource_id = socket_resource(0); if ($resource_id === 0) { // 资源已关闭,无需再创建新连接 }- 使用
@运算符: PHP还提供了一个名为@的特殊运算符,可以用来代替资源管理器。当你在使用@运算符时,它将自动确保所有打开的资源都已经被正确关闭。
$resource_id = @socket_connect('server_ip', 'port');请注意,这些操作应该与你的服务器环境保持一致,因为不同的服务器可能有不同的资源管理器实现。
-
使用
socket_shutdown和socket_close: 如果你仍然遇到问题,你也可以尝试直接关闭和重连,但这通常不是一个好主意,因为它可能导致服务器重启或者导致服务中断。 -
防止重复连接: 对于一些特定的应用场景,你可能还需要采取额外的措施来防止重复连接,比如在服务器端设置一个计数器来记录每个客户端的连接数量,只有当计数器为零时才允许新的连接。
解决 无用评论 打赏 举报- 使用