前网易架构师-高司机
曾在IBM的Platform Computing,淘米网,网易搬砖。资深游戏服务器架构师,合作+v(gao_ke104)可付费咨询服务器架构设计,网络问题,深度学习和训练数据集等问题,提供商业化的视觉人工智能检测和预警系统(煤矿,工厂,制造业,消防等领域的工业化产品),合作开发商业性游戏。
展开
-
关于长连接服务器和客户端之间要加入心跳的一些讨论
所以,对于用于保活的心跳包,我们最佳做法是,设置一个上次包时间,每次收数据和发数据时,都更新一下这个包时间,而心跳检测计时器每次检测时,将这个包时间与当前系统时间做一个对比,如果时间间隔大于允许的最大时间间隔(实际开发中根据需求设置成 15 ~ 45 秒不等),则发送一次心跳包。因此这个时候我们就要借助心跳包了,如果你设置了socket的SO_KEEPALIVE选项,则如果没有数据发送时,会发送心跳包,如果网不通,则收不到对心跳包的应答,则关闭本端,对端仍旧保持连接;原创 2023-03-10 15:59:53 · 57252 阅读 · 0 评论 -
剖析KCP以及KCP在游戏中是如何使用的
亲爱的各位读者你们好,由于前段时间忙于部分项目的重构和优化,未能及时更新文章,不少读者催更,哈哈,我还是很开心能抽出时间给大家再来分享下kcp的相关技术内幕,以及之前完善自己的网络库增加了KCP的客户端服务器收发支持(结尾会分享封装的客户端服务器C++源码)。KCP概述对于游戏开发,尤其是MOBA游戏,或者全球唯一服架构类型的游戏,对于网络的要求比一般游戏要高。...原创 2022-11-07 18:06:10 · 58032 阅读 · 0 评论 -
游戏服务器缓存系统如何设计
前言不管是在业界开源领域,还是内部分享中,很少会有专门针对游戏业务特征进行专门设计的组件、类库或者框架。我们从游戏的客户端方面来看,一款专业的游戏客户端引擎,已经是游戏开发的标配,flash,Cocos,Unity,Unreal等,但是服务器端,我们几乎找不到同样重量级的产品(当然有针对海外开发者快捷开发的服务器平台,比如GAE,GameSparks,PlayFab等能满.........原创 2022-06-29 18:00:47 · 57556 阅读 · 8 评论 -
大型游戏后台实践浅谈
国家新闻出版署8月30日下发切实防止未成年人沉迷网络游戏的通知,要求从今天(9月1日)起,所有网络游戏企业仅可在周五、周六、周日和法定节假日每日20时至21时向未成年人提供...原创 2021-09-03 00:00:00 · 57119 阅读 · 0 评论 -
如何使用弱网环境来验证游戏中的一些延迟问题
关于弱网在当今移动互联网盛行的时代,网络的形态除了有线连接,还2G/3G/Edge/4G/Wifi等多种手机网络连接方式。不同的协议、不同的制式、不同的速率,使移动应用运行的场景更加丰富。...原创 2021-10-26 18:02:00 · 58610 阅读 · 0 评论 -
redis数据库备份,回档,迁移工具使用
相信很多服务器开发者或者运维同学都遇到过这样的场景,比如我要从阿里云的redis集群把数据迁移到另外一个账号下的或者另外一个云服务商的redis集群,或者单机,或者哨兵模式redis实例,那么这种情况下我推荐给大家一款非常好用的工具,可以无缝的从A集群/单机/哨兵/已有的数据库rdb文件 迁移到 B集群/单机/哨兵模式下的实例中。原创 2024-06-24 00:15:00 · 154 阅读 · 0 评论 -
游戏服务器架构:游戏服务端如何支持百万玩家同时在线
用通俗的方法来描述一个好的服务端架构,最基础也是最重要的就两点: 支持百万玩家同时在线,不出问题。这两点也就分别对应了高并发和高可用。这篇文章系统的介绍游戏服务端中的高并发和高可用。高并发和高可用是一个相辅相成的工作,当我们支持百万玩家同时在线时却无法保证服务器的稳定可用,那高并发支持就无从谈起;而如果当玩家数量较多时服务器就常常出问题,那也不能称为高可用。原创 2024-04-12 00:30:00 · 17587 阅读 · 4 评论 -
系统设计理念:满足设计要求
因此,如果我们的 SLA 保证 99.99% 的可用性,但我们的可用性低于这一水平,我们可能必须向客户提供退款或其他补偿。这可能意味着实施冗余系统,并确保始终有一个备份准备好在发生故障时接管,或者可能意味着将我们的系统设计为优雅地降级,因此即使某些功能不可用,核心功能也保持不变。如果我们的 SLO 过于宽松,我们可能会始终满足它们,但仍然违反我们的 SLA,从而导致客户不满意和潜在的经济处罚。例如,我们可能会设置一个 SLO,规定我们的 Web 服务应在 300 毫秒内(99.9% 的时间)响应请求。原创 2024-04-02 09:57:56 · 37551 阅读 · 1 评论 -
代理服务器:转发代理和反向代理是如何工作的?
这意味着如果多个用户请求相同的内容,代理可以从其缓存中提供该内容,而不是每次都从外部服务器获取内容,从而缩短加载时间并减少带宽。客户端向特定网址发送请求,反向代理将该请求转发到其背后的适当服务器。:关心隐私的个人可能会使用转发代理来隐藏他们访问的网站的 IP 地址和其他识别信息,从而难以跟踪他们的 Web 浏览活动。:它们将传入的网络流量分布在多个服务器上,确保没有任何一台服务器获得过多的负载,并防止任何服务器成为瓶颈。本质上,它接收来自客户端的请求,将其转发到相关服务器,然后将服务器的响应返回给客户端。原创 2024-04-02 00:15:00 · 37614 阅读 · 0 评论 -
Meta 如何将缓存一致性提高到 99.99999999
鲍勃、玛丽和爱丽丝。在这种情况下,当 TAO 副本查询 BOB 和 Mary 所在的区域时,它们的数据不一致,它会将消息发送到没有 Alice 消息的区域。绕过缓存的查询可能是计算密集型的,并且还可能使数据库面临风险,因为保护数据库和扩展读取繁重的工作负载是缓存的两个最常见的用例。根据定义,缓存不保存数据的真实来源,因此当真实来源中的数据发生更改时,应该有一个主动使过时缓存条目失效的过程。从元的角度来看,缓存不一致几乎与数据库中的数据丢失一样糟糕,从用户的角度来看,它们可能会导致非常糟糕的用户体验。原创 2024-04-01 11:00:42 · 37574 阅读 · 0 评论 -
负载均衡策略和技术的基本指南
CLB可以根据请求的内容进行流量分发,支持HTTP、HTTPS和TCP协议,适用于Web应用、移动应用和API服务等。:经典负载均衡、应用负载均衡和网络负载均衡。腾讯云和阿里云的负载均衡器都提供自动扩展、健康检查、会话保持、监控报警等功能,可以根据应用的需求选择合适的负载均衡器类型。负载均衡器的一个基本功能是对服务器进行持续的运行状况检查,以确保流量仅定向到在线且响应良好的服务器。在某些配置中,DNS 故障转移可以将流量从不再接受连接(例如发生故障的负载均衡器)的 IP 地址重新路由到预配置的备用 IP。原创 2024-04-01 00:15:00 · 37713 阅读 · 0 评论 -
缓存和缓存的常用使用场景
通过使用缓存,可以将这些数据存储在共享的缓存中,实现数据的共享和一致性,减少不必要的数据传输和同步操作。通过使用缓存,可以将一部分读取频率较高的数据存放在内存中,从而减少对数据库的访问压力,提高服务器的并发处理能力。通过使用缓存,可以将一部分需要频繁计算的结果存放在内存中,使得服务器能够快速响应玩家的请求,提供更好的游戏体验。一种常见的策略是 LRU(最近最少使用)。实际上在我们的游戏服务器开发过程中,经常使用缓存,主要是提升服务器的吞吐,减少DB的读写压力,最大可能的提升游戏服务器的性能和玩家用户体验。原创 2024-03-29 15:50:13 · 37883 阅读 · 2 评论 -
变形记---容灾恢复(一),异常崩溃引发服务器丢档或无法正常运行
接着,我一直想写一些对年轻人有帮助的文档来,刚好最近有空就零零碎碎写了一些,罗列了一些提纲然后改再删,花了一个礼拜的时间。写这一系列的 “变形记”,也是因为最近我给M部门面试服务器主程序开发的职位,我只问他们的架构设计经验,我发现相当一部分5-12年“本应该有足够开发经验。原创 2024-04-20 00:15:00 · 11232 阅读 · 0 评论 -
Unity多人游戏基础知识总结
开发多人游戏涉及很多网络概念。以下是开发前必须了解的一些关键概念:1.服务器和客户端:在多人游戏的背景下,“服务器”和“客户端”的概念是基本的。这种服务器-客户端关系确保所有玩家都在同一页面上,并且一致地遵循游戏规则。它还有助于防止作弊,因为服务器对游戏中发生的情况拥有最终决定权。总而言之,服务器就像多人游戏中的中央机构,而客户端是连接到服务器以一起玩游戏的各个玩家的设备。服务器管理游戏世界并执行规则,而客户端则为玩家提供与该世界交互的界面。2. 带宽:将带宽视为互联网连接的容量或“管道大小”原创 2024-03-22 07:30:00 · 56876 阅读 · 4 评论 -
如何在 Unity 中使用 PlayFab 制作大厅
总的来说,PlayFab的大厅功能实现相对简单,通过使用PlayFab的服务和工具,你可以快速创建和管理多人游戏的大厅,并为玩家提供良好的游戏体验。玩家可以创建自己的大厅或加入现有的大厅。上述方法的结果是,创建了一个新的大厅实例。让我们打开克隆的 Unity 项目,并在标题下查找现有的大厅。它通常与匹配配合使用,匹配根据玩家的经验水平等自动将玩家引导到特定的大厅。这些对大厅中的所有其他成员也可见,但只有所有者玩家可以更改它们。之前,我们在大厅的配置中定义了一个搜索属性 (2vs2)。原创 2024-03-14 07:45:00 · 56928 阅读 · 4 评论 -
PlayFab 中的匹配功能
不幸的是,匹配功能目前仅在“预览”模式下可用,但通过我的经验,我可以证明它工作可靠。PlayFab 创建比赛后,对客户端的回调将包含游戏服务器的地址、端口和有关其他玩家的信息。要在成功匹配后分配服务器,请选择“启用服务器分配”并设置将用于游戏服务器的“构建”。在我之前的文章中,我解释了如何使用 Unity 和 PlayFab 构建在线多人游戏。我们的玩家点击“开始多人游戏”,打算找人一起玩。在开始匹配过程之前,玩家需要先登录。PlayFab 检查属性是否符合预定义的规则,并通过将票证组合在一起来创建匹配。原创 2024-03-14 04:15:00 · 56649 阅读 · 0 评论 -
9个免费游戏后端平台
在这篇文章中,您将看到 九个免费的游戏服务平台提供商,这可以帮助您开始在线多人游戏,而无需预先投入大量资金。每个提供商都有非常独特的功能,因此成本应该只是决定时要考虑的方面之一。我还从低预算项目的角度对免费提供商进行了星级评级。让我们看看免费提供商以及他们提供的服务。原创 2024-03-11 13:38:23 · 1401 阅读 · 0 评论 -
服务器面试必备-网络知识点整理
epoll的实现知道么?在内核当中是什么样的数据结构进行存储,每个操作的时间复杂度是多少?epoll是Linux系统中提供的一种高效的I/O多路复用机制。其基于事件驱动的模型,可以有效地管理大量的并发连接。在内核中,epoll使用一个红黑树(RB Tree)来存储所有的事件。这个红黑树是通过一个特殊的数据结构epoll_event来表示的,每个epoll_event对应一个文件描述符和其上感兴趣的事件。每次调用epoll_wait函数,内核都会检查红黑树中的所有事件,并返回已经就绪(满足条件)原创 2024-03-08 00:15:00 · 56959 阅读 · 4 评论 -
使用 PlayFab 服务器托管的 5 个步骤
中找到详细的状态转换图。此步骤不是强制性的,但如果在服务器中的 API 调用未 100% 符合 PlayFab 的要求,PlayFab 将不会运行它,并且不会说明 PlayFab 不运行它的原因。在 PlayFab 仪表板上,选择我们的游戏,然后单击“多人游戏”并启用它。对于模拟,你可以设置任何你想要的值,稍后客户端将需要它。要构建游戏服务器,请在 Unity 编辑器中进入“文件”>“构建设置...”,将“目标平台”设置为“Windows”,将“架构”设置为“x86_64”,然后选中“服务器构建”复选框。原创 2024-03-13 00:30:00 · 87 阅读 · 8 评论 -
服务器面试必备-redis面试题总结
Redis 本质上是一个 Key-Value 类型的内存数据库,很像 memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据 flush 到硬盘上进行保存。因为是纯内存操作,Redis 的性能非常出色,每秒可以处理超过 10 万次读写操作,是已知性能最快的 Key-Value DB。原创 2024-03-07 00:30:00 · 56815 阅读 · 2 评论 -
服务器面试必备--nginx面试题总结
NGINX是一个轻量级、高性能的HTTP和反向代理服务器,也是一个通用代理服务器(TCP/UDP/IMAP/POP3/SMTP),其特点是内存占用低、并发能力强。实际上,NGINX的并发能力比同类型的Web服务器要好。据悉,NGINX最多可支持50000个并发连接。因此nginx受到了很多企业的青睐,Nginx是服务器开发和运维人员必备技能之一,下面为大家整理了一些比较常见的Nginx相关面试题,仅供参考:原创 2024-03-07 00:15:00 · 56754 阅读 · 0 评论 -
lua与C++粘合层框架
lua_State的栈中. 偶们通常的做法是做一个wrapper, 把所有需要调用的函数都wrap一下, 这样就可以调用任意的函数了.原创 2024-03-05 09:54:39 · 222 阅读 · 0 评论 -
lua __index __newindex upvalue 示例
项目中有个公会对象,数据大部分存在data中,之前都是 u.data.point这样访问,太麻烦了。于是通过设置__index 使之可以直接访问属性,u.point。但是还是不能直接改属性,u.point = 4,所以再设置了__newindex。在设置了setmetatable之后,不能直接给u添加新属性,因为设置了__newindex,新的属性将直接加到u.data中的。原创 2024-02-29 10:23:52 · 1665 阅读 · 1 评论 -
Redis 消息队列:构建消息代理的 4 个简单步骤
Redis 消息队列包括流行的解决方案和客户端,例如 Ruby、Python、PHP、Java、Objective-C、Node.js、Clojure、C++、C# 等。与其他技术相比,我们需要更少的集成线来存储、访问和使用我们的应用程序中的数据。Redis消息队列Pub/Sub系统中的订阅者可以订阅任意数量的通道,Redis消息队列的发布者可以将消息发布到任意通道。Redis 的高性能使其成为最受欢迎的数据存储、缓存,甚至通过使用 Redis 消息队列等工具成为轻量级消息代理。队列提供细粒度的可扩展性。原创 2024-02-28 11:18:18 · 375 阅读 · 0 评论 -
epoll的内核实现
epoll是由一组系统调用组成。 int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event *events,int maxevents, in原创 2024-02-27 16:05:52 · 7328 阅读 · 0 评论 -
Lua 协程
Lua里的协程是一个原来没见过的东西,Python的Gevent也是一个基于coroutine的python网络开发框架。性能据说很不错。协同的一个关键特征是它可以不断颠倒调用者与被调用者之间的关系协程和一般多线程的区别是,一般多线程由系统决定该哪个线程执行,是抢占式的,而协程是由每个线程自己决定自己什么时候不执行,并把执行权主动交给下一个线程。 协程是用户空间线程,操作系统其存在一无所知原创 2024-02-26 18:17:35 · 6605 阅读 · 2 评论 -
SOLID 原则:增强面向对象编程 (OOP)
SOLID 原则是增强面向对象编程的设计和结构的基本准则。通过遵守这些原则——单一职责、开放/封闭、里氏替换、接口隔离和依赖倒置——开发人员可以创建更加模块化、可扩展和可维护的代码。在本文中,我们将深入研究 SOLID 原则——单一职责、开放/封闭、里氏替换、接口隔离和依赖反转——并探讨它们如何通过实际代码示例提升 OOP 代码的设计和结构。它促进创建小型的、特定于客户端的接口,而不是大型的、单一的接口。通过遵守 ISP,我们可以防止不必要的方法和依赖项对客户端代码的污染,从而实现更干净、更集中的界面。原创 2024-02-22 09:38:35 · 55 阅读 · 0 评论 -
微服务设计模式
我认为这是与微服务相关的大多数重要模式的综合列表。然而,该列表永远不会是完整的列表,因为随着微服务用例的不断发展,一些模式仍在不断发展。我将在以后的文章中更详细地介绍这些模式。微服务在过去十年中已经发展到现在非常成熟的水平。许多模式被演变以适应不同的需求。原创 2024-02-22 09:37:20 · 508 阅读 · 0 评论 -
面向对象编程(OOP)中的重构和代码维护
然而,随着项目的发展,OOP 代码库可能变得越来越复杂,这使得它们的维护变得困难。重构,即在不改变其外部行为的情况下重构现有代码的过程,是 OOP 的基本实践。在本文中,我们将探讨重构和维护 OOP 代码库的技巧和技术,以保持它们的健壮性、可读性和适应性。俗话说,“阅读代码的次数比编写代码的次数多得多”,维护干净、结构良好的 OOP 代码将在未来带来好处,确保软件项目的寿命和成功。通过遵循这些技巧和技术,开发人员可以确保他们的 OOP 代码保持可读性、可维护性并能够响应不断变化的需求。原创 2024-02-21 09:47:43 · 102 阅读 · 2 评论 -
错误处理和日志记录:构建弹性服务
随着数字环境的不断发展,通过强大的错误处理和日志记录实践来强化您的软件系统是打造经得起时间考验的可靠且有弹性的应用程序的最终途径。在软件开发领域,错综复杂的系统和复杂的代码库占据主导地位,有效的错误管理和建立全面的日志记录机制是构建健壮、可靠和用户友好的服务的基本要素。在本文中,我们对错误处理和日志记录进行了广泛的探索,包括错误处理策略的开发、日志记录机制的实施、警报系统对于主动问题解决的重要性,以及构成错误处理基石的其他考虑因素。配置关键事件和异常的警报,例如服务器故障、异常高的错误率或意外的流量峰值。原创 2024-02-20 10:59:26 · 59 阅读 · 0 评论 -
可扩展性和性能:数字化成功的支柱
在这个时代,用户对无缝、快速的数字体验的期望比以往任何时候都更高,优先考虑可扩展性和性能的组织才能脱颖而出。通过遵循这些原则,您可以为卓越的数字化奠定基础,确保您的系统不仅能够满足当今的需求,还能在面对未来的挑战时适应并蓬勃发展。水平扩展可确保您的系统能够无缝满足增加的需求,而垂直扩展可优化单个实例内的资源使用情况。性能优化可对您的系统进行微调,以实现极快的响应时间和高效的资源利用。在动态的数字技术世界中,用户的期望和对数字系统的需求不断增加,可扩展性和性能已成为孪生要素。这增强了系统的整体可靠性和性能。原创 2024-02-19 09:14:33 · 65 阅读 · 0 评论 -
设计健壮且可扩展的软件系统
系统设计是定义系统的架构、组件、模块、接口和数据以满足特定需求的过程。在本文中,我们将深入探讨系统设计的各个方面,涵盖 25 个关键主题,以帮助您了解设计健壮且可扩展的软件系统的复杂性。通过采用最佳实践、利用正确的技术并遵循此处概述的原则,您将为构建健壮、可扩展、安全和高性能的系统做好充分准备。深入了解系统设计中的这 25 个关键主题,您将有能力应对构建健壮、可扩展且可靠的软件系统的挑战。通过不断磨练您的技能并跟上行业趋势,您可以确保您的系统不仅满足当前的要求,而且还能适应未来的需求。原创 2024-02-19 09:13:42 · 163 阅读 · 0 评论 -
软件设计和软件架构之间的区别
两者有时听起来很令人困惑,现在很多的软件开发者仍然对于软件设计和软件架构之间的差异化,以及他们各自在软件开发过程中承担的角色和任务感到困惑,那么这篇文章我们来看看二者有什么区别?软件设计是定义软件方法、功能、对象以及代码的整体结构和交互的过程,以便最终的功能能够满足用户的需求。高层结构 - 描述可用性、规模、性能、可靠性、容错、监控、维护等。软件设计是关于单个软件组件和模块的。设计规范文档、流程图、图表、已知限制、设计模型、线框图、UML 图等。建筑物的结构包括房间结构、楼梯、水、供暖、通风等基本服务。原创 2024-02-18 15:20:36 · 225 阅读 · 0 评论 -
您应该使用哪个库?jsoniter、easyjson 还是 go-json?为什么?
JSON是一种流行的数据交换格式,广泛应用于各种平台和语言。Golang当然不会错过对JSON的支持。并且通过自己的标准库,例如Kubernetes中API Service的REST API等接口,它可以轻松处理JSON。虽然 Go 的库效果很好,但我们仍然可以在 Github 中寻找那些开源的 JSON 库,以最大限度地提高我们的效率。那么这些库的特性、性能、适用性才是我们应该考虑的。Go 中的 JSON使用 Go 的独立包操作 JSON 时有两个步骤。定义映射。原创 2024-02-03 16:24:21 · 522 阅读 · 0 评论 -
go使用gopprof分析内存泄露
go tool pprof http://127.0.0.1:8099/debug/pprof/heap 或者直接在浏览器里输入 http://127.0.0.1:8099/debug/pprof/heap。-diff_base:提供两个 profile 文件比较,显示的百分比是基于第一个 profile 统计的数量。这里先说第一种方式,命令行很方便,假设我的服务是8099端口的一个本地服务,我就直接使用。然后运行你的服务,这样你有两种方式来获取你的堆栈申请释放信息,一种是在命令行里输入。原创 2024-02-03 15:44:09 · 592 阅读 · 0 评论 -
Ddos攻击防御之使用nginx
如果你想一段时间内被限制超过了5次,就拉黑几分钟, 为什么要拉黑呢,因为nginx也是有压力的,比如这里的10m存储区域,另外,nginx返回503,请求不是没成功,只是没有转发给你的业务应用,nginx的压力依旧存在,大量请求过来,完全可能导致nginx瘫痪,这种限制只是保护了nginx后面的应用而已,当然nginx的并发性能很屌,这样处理也是OK的,但不代表nginx就不能被弄瘫痪,最好的办法是发现是明显攻击后将ip拉黑,可以动态的处理,比如拉黑几分钟、几十分钟、几小时等等。原创 2024-01-09 20:34:39 · 920 阅读 · 0 评论 -
什么是 DDoS 攻击
最简单的形式是,当在没有特定限制标准的情况下实施黑洞过滤时,合法和恶意的网络流量都会被路由到空路由或黑洞,并从网络中丢弃。然后,工作人员会收到更多未经确认的包裹请求,直到他们无法携带更多包裹,变得不知所措,并且请求开始得不到答复。涉及不加区别地丢弃或限制流量的缓解尝试可能会将好的流量与坏的流量一起丢弃,并且攻击也可能会修改和适应规避对策。当受害者的服务器或网络成为僵尸网络的目标时,每个僵尸程序都会向目标的IP 地址发送请求,可能会导致服务器或网络不堪重负,从而导致对正常流量的拒绝服务。原创 2024-01-09 13:44:35 · 893 阅读 · 0 评论 -
Kafka:本地设置
这是设置 Kafka 将数据从 Elasticsearch 发布到 Kafka 主题的三部分系列的第一部分;该主题将被 Neo4j 使用。第一部分帮助您在本地设置 Kafka。第二部分将讨论如何设置Elasticsearch将数据发布到Kafka主题。最后将详细介绍如何使用连接器订阅主题并使用数据。原创 2023-12-29 15:39:35 · 1624 阅读 · 0 评论 -
使用JAVA & Zookeeper构建分布式键值存储
副本 A 和 B 都有序列号 X,但按字典顺序,A 在 B 之前,因此 A 认为它是获胜者,但是当 A 尝试创建领导者 znode 时,B 的序列已更新为 X+1,但 A 被延迟了,它仍然X. 现在B会发现自己是leader并尝试创建leader znode。请注意,前 3 个 znode 对于给定分区中的所有副本来说都是通用的,因此只有其中一个会成功创建这些 znode,其他副本将看到这些 znode 已经存在,因此除了创建最后一个 znode 之外不会执行任何操作znode 是特定于服务器的。原创 2023-12-29 15:14:41 · 1678 阅读 · 0 评论 -
php代码根据ip地址免费获取省份城市
其实这个主题吧,一直想写,主要是因为有一些粉丝在后台留言问我下载了geoip库怎么使用它根据ip地址获取国家地区信息,再加上接着上面一篇文章我就刚好有时间来写这篇文章。原创 2023-12-21 17:34:35 · 1436 阅读 · 1 评论