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

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

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

服务端:

<?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生成cookie数组,PHP删除cookie数组

PHP生成cookie数组,PHP删除cookie数组

<?php   //设置Cookies数组 setcookie('Datatype[a]', '1');  setcookie('Datatype[b]', '2');  set...

php异步执行,php后台运行,如何在windows下让php后台运行

php异步执行,php后台运行,如何在windows下让php后台运行

如果想在windows中执行php,并且让php脚本在后台运行,可以用下面的cmd命令start /b php  D:\wwwroot\default\demo1\run.php例如上面的命令意思后台运行run.php,如果想用php编写异步代码: ...

 php监听事件,php触发事件

php监听事件,php触发事件

逛公众号文章看到文章"php实现事件监听与触发的方法,你用过吗?",我就好奇了,php又不是asp.net的webform,哪里来的服务端事件监听。于是学习了一波。先看下监听类:class Event {     /** &nbs...

PHP getenv函数和putenv函数的学习

PHP getenv函数和putenv函数的学习

(1).在PHP中可以查看的环境变量包括: (1.1).电脑环境变量 (2.1).服务器环境变量(2).getenv()函数获取一个环境变量的值.参数1是环境变量的key,参数2值为true的时候仅从你的电脑环境变量中查找,参数2值为false会从两种变量中全部查询//获取我电脑登录的用户名,输出A...

php finally使用

php finally使用

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

PHP Warning:  ftok(): Project identifier is invalid

PHP Warning: ftok(): Project identifier is invalid

在使用ftok生成ipc进程通信key尝试将第二个参数项目标识符传入字符串报错:PHP Warning:  ftok(): Project identifier is invalid,查阅资料发现第二个字符串只能是1个字符串,长度为1....