我按照demo写了代码,并且启动运行了,问题就是我推送udp没接收到也没任何log或者日志被保存
,再start.php同级新增了一个udp.php
<?php
use app\common\mq\producer\DeviceMq;
use Workerman\Worker;
use Workerman\Connection\UdpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// 创建一个Worker监听2347端口,纯UDP协议,不使用任何应用层协议
$udp_worker = new Worker("udp://0.0.0.0:12349");
// 启动4个进程对外提供服务,和你原来的一致
$udp_worker->count = 4;
// 当客户端发来UDP数据时触发(核心业务逻辑区)
$udp_worker->onMessage = function( UdpConnection $connection, $data)
{
// 处理接收到的 UDP 多播数据
// ==================== 这里开始写你的所有业务逻辑 ====================
try {
// 1. 接收到的UDP原始数据,可先做清洗/解析(比如JSON解析、参数过滤)
// $data = trim($data);
echo "接收到多播数据: $data\n";
(new \app\api\controller\TestController())->deal_test($data);
\support\Log::info('收到数据');
\support\Log::info('消息'.$data);
$outputPath = __DIR__ . '/logs/output.txt'; // 保存在当前脚本同目录
file_put_contents($outputPath, $data);
// $format = json_decode($data, true);
// if (!is_array($format)) {
// throw new \InvalidArgumentException('JSON格式错误');
// }
// if (empty($format['account'])) {
// throw new \InvalidArgumentException('缺少account');
// }
// echo '43444';
// $time = time();
// //组装数据
// $insert = [
// 'account' => (string)$format['account'],
// 'time' => $time,
// 'create_time' => $time
// ];
// //写入mq
// (new DeviceMq())->logInsert($insert);
// echo '5555';
// 4. ✅ 组装返回给UDP客户端的数据
$reply_data = [
'code' => 200,
'msg' => '处理成功,数据已入队',
// 'log_id' => $log_id,
// 'data' => $user_info
];
$connection->send(json_encode($reply_data, JSON_UNESCAPED_UNICODE));
} catch (\Exception $e) {
// 异常捕获,防止单个请求报错导致整个UDP进程挂掉
$error_msg = "处理失败:{$e->getMessage()},行号:{$e->getLine()}";
echo $error_msg . "\n";
$code = ($e instanceof \InvalidArgumentException) ? 400 : 500;
$connection->send(json_encode([
'code' => $code,
'msg' => $error_msg
], JSON_UNESCAPED_UNICODE));
}
};
// 运行UDP服务,和你原来的代码一致
Worker::runAll();
Input "php udp.php stop" to stop. Start success.
就是别的推送过来不行,再当前服务器使用命令
nc -ul 12349
以及echo '{"account": "6256595"}' | nc -u 127.0.0.1 12349 这个也可以收到,就很奇怪是我哪里写的有问题吗,我是本地模拟用py去推送类型的udp脚本信息php的udp段始终收不到
后续是解决了,但是是聚合解决的,还有个小的疑问,麻烦大佬回复下不
我单独写了一个udp的文件业务

但是这个时候我之前默认的项目也有这个

,我的代码层要去掉这个tcp里面的业务层代码 但是我拆分开去触发udp去掉代码的时候就失效了 没法使用了 ,解决的办法是聚合了

,但是为什么会这样呢
已经处理,这个使用的时候不要去注入这个指定的UdpConnection $connection,
这样即可
我的业务数据只涉及存储和分析不涉及后续的指令一块,要求不丢失和实时性的话还是走tcp,mqtt一类的吧;记得开服务器和云服务器的udp端口
但是这样如果业务只在udp的这个那么就可以 但是如果你是使用的webman的话就有点问题简单来说就是你先启动的start.php,再去执行的udp.php这个时候问题就来了 你的udp的业务假设和start的业务代码交汇在代码层感觉没问题但是就是调用请求都不行这个时候的解决方式我弄得是合并就是把这个udp的业务集成到之前的进程里面去由start一个入口去处理;
再进程里面
这样即可