gpt4 book ai didi

php - PHP套接字服务器挂起

转载 作者:行者123 更新时间:2023-12-03 11:52:04 25 4
gpt4 key购买 nike

我已经花了几个小时的时间,但我无法弄清楚。我浏览了这里的帖子,试图也找到解决方案,但无济于事。

我为基于浏览器的游戏安装了Socket Server。我已将其剥离以查找问题,似乎fread正在挂起,因为如果我注释掉“fread($ fp,10024);”,那么它运行正常,但当然不会读取响应。

在调试时,我将文件分解为基本内容。

我有套接字服务器:ChatServer.php

set_time_limit(0);
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_get_option($sock, SOL_SOCKET, SO_REUSEADDR);
socket_bind($sock, "127.0.0.1", "9990");
socket_listen($sock, 4);

$chatContent = "Testing, 1, 2, 3.";
do
{
$childSocket = socket_accept($sock);
$incomingData = socket_read($childSocket, 12048);

socket_write($childSocket, $chatContent, strlen($chatContent));
} while(true);

然后我有Test.php,它应该打开套接字并读取响应。
$fp = fsockopen("127.0.0.1", "9990", $errno, $errstr, 5);
echo $errstr . "<br />";
echo fread($fp, 10024);

$ errstr不会显示错误,因为当我启动ChatServer.php然后重新加载Test.php时,它永远不会重新加载。它挂了几分钟,滞后了我的整个服务器。我正在VPS上运行。之前效果不错,然后突然停止了工作,我不知道为什么。

编辑:感谢GigaWatt,我得以使其工作。如果您遇到相同的问题,这是我使用的代码。 :)
    set_time_limit(0);
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_get_option($sock, SOL_SOCKET, SO_REUSEADDR);
socket_bind($sock, "127.0.0.1", "9990");
socket_listen($sock, 4);

$chatContent = "Testing, 1, 2, 3.";
do
{
$childSocket = socket_accept($sock);
$meta = stream_get_meta_data($sock);

if($meta['unread_bytes'] > 0) {
$incomingData = socket_read($childSocket, $meta['unread_bytes']);
}

socket_write($childSocket, $chatContent, strlen($chatContent));
} while(true);

只需使用stream_get_meta_data然后使用unread_bytes。

最佳答案

socket_read的调用是一个阻塞调用,这意味着所有操作都将停止,直到已读取指定数量的字节为止。

如果需要继续处理,请考虑使用stream_get_meta_data(unread_bytes值)来检查有多少未读数据正在等待。
一旦达到所需的阈值,请调用socket_read

http://us3.php.net/manual/en/function.stream-get-meta-data.php

关于php - PHP套接字服务器挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23741634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com