当前位置:首页 > PHP > 正文内容

php feof使用注意,php feof socket套接字使用注意,

高老师6年前 (2020-09-02)PHP1458

服务端:

<?php
$socket = stream_socket_server('tcp://127.0.0.1:8888', $errno, $errstr);
while ($conn = stream_socket_accept($socket))
{
    fwrite($conn, "1024");
    fclose($conn);
}
fclose($socket);

客户端:

<?php
$socket = stream_socket_client('tcp://127.0.0.1:8888', $errorno, $errstr);
while (!feof($socket))
{
    echo fread($socket, 128);
}
fclose($socket);

这是一个很经典的socket的客户端和服务端,由于客户端不知道服务器端发送了多少数据,通过feof()判断是否读取完成。但是feof如果遇到一个socket套接字,并且这个套接字没有被关闭,就算读取不到数据也会一直阻塞等待不会继续执行,一直到最终超时,而超时的配置由php.ini的default_socket_timeout时间决定,也可以通过stream_set_timeout对单独的套接字设置超时时间。下面给出验证代码:

我们将服务器端代码改为如下:

<?php
$socket = stream_socket_server('tcp://127.0.0.1:8888', $errno, $errstr);
while ($conn = stream_socket_accept($socket))
{
    fwrite($conn, "1024");
}
fclose($socket);

 此时客户端获取到1024的数据后会一直阻塞不能退出进程,因为服务器端发送完数据没有关闭客户端。而服务器端关闭客户端可以用fclose或者unset或者设置为null。通常我们不建议用feof来获取socket发送的数据,建议使用指定协议或者指定发送大小来解决问题。

另外feof在传递的文件指针无效的时候为一直返回true,你很有必要使用is_resource来判断一下,不正确的处理会陷入死循环。

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/154.html

分享给朋友:

“php feof使用注意,php feof socket套接字使用注意,” 的相关文章

php 将数组键值转为变量

php 将数组键值转为变量

<?php $data=array('a'=>1,'b'=>2,'c'=>3,'d'=>4); extract($data); var_dump($a,$b,$c,$d); ?>在人人商城中捡到的...

 php xml字符串转数组,phpxml转数组,php 将xml转换成数组

php xml字符串转数组,phpxml转数组,php 将xml转换成数组

001源码:/*  * $xml_str是xml字符串  */ function  xmltoarray($xml_str) { //禁止XML实体扩展攻击 libxml_disable_entity_loader(true); //拒绝包含...

php soap 捕获异常,使用try catch 捕获Soap 异常

php soap 捕获异常,使用try catch 捕获Soap 异常

项目中使用服务来执行webservice,由于对方系统api不稳定,经常导致服务崩溃,只能重启,一个月差不多要重启一次。初期的解决办法是捕获异常,然后continue掉。<?php try {     $url = 'http...

全方位认识PHP的SESSION

全方位认识PHP的SESSION

【一】.介绍session由于HTTP是无状态的请求,创建一个会话需要保持必须需要身份标识。当用户第一次访问,PHP会为用户创建一个唯一的sessionid,并将sessionid通过cookie发送给浏览器,并在服务器的临时文件创建一个以sessionid为名的文件用来保存这个sessionid保...

cookie跨域,cookie p3p跨域

cookie跨域,cookie p3p跨域

最近在公司开发一个新的项目假设项目域名是a.com,需要接入b.com的单点登陆系统。(1).首先我们会在a.com的登陆页面用iframe引入b.com来显示登陆界面,实际上登陆验证操作都是在b.com上面(2).当b.com验证通过,会在前端ajax请求a.com的回调地址,这个回调地址目的就是...

php finally使用

php finally使用

<?php /**  * @throws Exception  */ function curl() {     throw  new \Exception('err...