肉排vs排骨 2015-06-11 07:09 采纳率: 0%
浏览 588

PHP中fread在等待时为什么会再建两次连接?

PHP中,我用pfsockopen和服务器建立了一个连接,然后用fwrite对连接进行发送,最后用fread等待服务器返回的数据。
但服务器那边如果没进行数据返回时,fread阻塞在那里,中间过程中服务器那边打印显示会再次accept到一个连接(服务器当前只会有这一个设备对其连接)。
各位大神指导这个为什么吗,求解答呀,困惑好多天了?

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-03 23:31
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这个问题是由于PHP的资源管理器(Resource Manager)在等待服务器响应的时候可能会重新创建新的资源连接。这通常是出于安全考虑,防止资源被意外地滥用或浪费。

    例如,在使用socket函数来建立TCP连接时,PHP的resource_id变量可能在每次调用resource_close()方法后都会自动关闭。然而,当服务器没有返回任何数据时,resource_id变量可能会被错误地认为已经关闭,并且不会被正确地释放。

    要解决这个问题,你可以尝试以下几种方式:

    1. 使用resource_id变量: 在PHP中,resource_id是一个整数,用于跟踪正在使用的资源。你可以通过检查它是否为0来确定资源是否已被正确关闭。
    $resource_id = socket_resource(0);
    if ($resource_id === 0) {
        // 资源已关闭,无需再创建新连接
    }
    
    1. 使用@运算符: PHP还提供了一个名为@的特殊运算符,可以用来代替资源管理器。当你在使用@运算符时,它将自动确保所有打开的资源都已经被正确关闭。
    $resource_id = @socket_connect('server_ip', 'port');
    

    请注意,这些操作应该与你的服务器环境保持一致,因为不同的服务器可能有不同的资源管理器实现。

    1. 使用socket_shutdownsocket_close: 如果你仍然遇到问题,你也可以尝试直接关闭和重连,但这通常不是一个好主意,因为它可能导致服务器重启或者导致服务中断。

    2. 防止重复连接: 对于一些特定的应用场景,你可能还需要采取额外的措施来防止重复连接,比如在服务器端设置一个计数器来记录每个客户端的连接数量,只有当计数器为零时才允许新的连接。

    评论

报告相同问题?