当前位置: 首页 > news >正文

PHP异步非阻塞MySQL客户端连接池

文章精选推荐

1 JetBrains Ai assistant 编程工具让你的工作效率翻倍
2 Extra Icons:JetBrains IDE的图标增强神器
3 IDEA插件推荐-SequenceDiagram,自动生成时序图
4 BashSupport Pro 这个ides插件主要是用来干嘛的 ?
5 IDEA必装的插件:Spring Boot Helper的使用与功能特点
6 Ai assistant ,又是一个写代码神器
7 Cursor 设备ID修改器,你的Cursor又可以继续试用了

文章正文

PHP 异步非阻塞 MySQL 客户端连接池的概念,可以使用 AMPHP 库实现,它允许 PHP 开发者通过协程方式执行异步的 MySQL 查询操作,并且无需依赖 ext/mysqliext/pdo 等传统扩展。

AMPHP 提供的 amphp/mysql 库使用事件驱动模型,允许在单线程内并发地执行多个 MySQL 查询,从而大大提高了 I/O 密集型操作的效率。

1. 什么是 AMPHP?

AMPHP 是一个事件驱动的异步 PHP 库,旨在使 PHP 开发者能够轻松编写高并发、异步、非阻塞的代码。

它基于协程,通过用户态的 PHP 实现了并发执行。AMPHP 的优势在于它不依赖于 PHP 的多线程支持或扩展,所有异步操作都基于事件循环和协程。

  • 事件循环:事件循环机制(如 ReactPHP)用于管理异步 I/O 操作。
  • 协程:利用 Fiber(PHP 8.1 及以上)或其他协程库,在不阻塞当前线程的情况下异步执行任务。
  • 连接池:通过 amphp/mysql 库的连接池技术,能够管理多个 MySQL 连接,避免频繁创建和销毁连接的性能开销。

2. 安装 AMPHP 和 amphp/mysql

首先,你需要安装 AMPHP 和 amphp/mysql。可以通过 Composer 安装这两个依赖:

composer require amphp/amp amphp/mysql

3. 基本用法:创建异步 MySQL 客户端

3.1 初始化数据库连接

使用 amphp/mysql 库创建一个异步的 MySQL 客户端和连接池。连接池会管理 MySQL 连接,并且通过协程处理查询请求。

<?phprequire 'vendor/autoload.php';use Amp\Loop;
use Amp\MySQL;Loop::run(function () {// 数据库连接配置$dsn = "mysql:host=127.0.0.1;port=3306;dbname=testdb";$user = "root";$password = "password";// 创建数据库连接池$pool = yield MySQL\pool($dsn, $user, $password);// 执行查询操作$result = yield $pool->query("SELECT * FROM users LIMIT 10");// 输出查询结果while ($row = yield $result->advance()) {var_dump($row);}// 关闭连接池yield $pool->close();
});

解释

  • MySQL\pool() 创建一个连接池。连接池会管理一组连接,在需要时可以从池中获取连接,执行查询后再将连接返回池中。
  • query() 是执行 SQL 查询的方法,返回的是一个 Result 对象。
  • advance() 是一个异步操作,它返回数据库查询结果的下一行数据。
3.2 异步查询操作

你可以利用 AMPHP 的协程特性,在多个查询之间不会互相阻塞,这使得 MySQL 查询在高并发情况下非常高效。

<?phprequire 'vendor/autoload.php';use Amp\Loop;
use Amp\MySQL;Loop::run(function () {// 创建数据库连接池$pool = yield MySQL\pool("mysql:host=127.0.0.1;dbname=testdb", "root", "password");// 执行多个并发查询$queries = ["SELECT * FROM users LIMIT 5","SELECT * FROM products LIMIT 5","SELECT * FROM orders LIMIT 5"];$promises = [];foreach ($queries as $query) {$promises[] = $pool->query($query);}// 等待所有查询完成$results = yield $promises;foreach ($results as $result) {while ($row = yield $result->advance()) {var_dump($row);}}// 关闭连接池yield $pool->close();
});

解释

  • yield 用来等待异步查询完成。这里使用了多个查询,并且利用 yield 让 PHP 在查询执行过程中不会阻塞主进程。
  • promises 数组保存了多个查询的异步请求,当所有查询都执行完毕后,结果将被收集并处理。
3.3 连接池的使用和管理

连接池用于优化数据库连接的管理。在高并发的环境中,创建和销毁数据库连接是非常消耗资源的,而连接池则能有效避免这种开销。

<?phprequire 'vendor/autoload.php';use Amp\Loop;
use Amp\MySQL;Loop::run(function () {// 创建连接池$pool = yield MySQL\pool("mysql:host=127.0.0.1;dbname=testdb", "root", "password");// 启动一个协程执行查询$result = yield $pool->query("SELECT * FROM users LIMIT 10");// 处理查询结果while ($row = yield $result->advance()) {var_dump($row);}// 使用完连接后关闭池yield $pool->close();
});

解释

  • 在使用连接池时,pool 会管理多个连接实例,避免频繁的连接和断开,提升了查询性能。
  • close() 用来关闭连接池并释放资源。

4. 异步 MySQL 的优势

4.1 高并发查询

在传统的同步查询中,PHP 在执行一个查询时会阻塞,直到查询完成才会继续执行后续操作。对于大量的数据库查询请求,这种阻塞会导致性能瓶颈。而异步查询通过事件循环和协程机制,可以并发执行多个查询,在等待数据库响应时不阻塞主进程,从而提高了并发能力和性能。

4.2 非阻塞 I/O

AMPHP 使用事件循环机制来处理非阻塞 I/O 操作。当一个查询操作在等待数据库返回数据时,PHP 不会停止工作,而是通过事件循环继续处理其他任务。这种方式极大地提升了 PHP 在处理高并发 I/O 操作时的效率。

4.3 轻量级的连接池

连接池避免了频繁创建和销毁数据库连接的开销。AMPHP 提供的连接池是高效的,可以根据需要动态分配和回收数据库连接,使得应用在高并发场景下依然能够保持高性能。

5. 错误处理和调试

在使用 AMPHP 进行异步操作时,错误处理需要注意一些细节。例如,查询可能会出错,连接池也可能会因为各种原因关闭或失效。可以通过 try-catch 块来捕获这些异常并进行适当处理。

<?phprequire 'vendor/autoload.php';use Amp\Loop;
use Amp\MySQL;
use Amp\Failure;Loop::run(function () {try {// 创建数据库连接池$pool = yield MySQL\pool("mysql:host=127.0.0.1;dbname=testdb", "root", "password");// 执行查询$result = yield $pool->query("SELECT * FROM non_existing_table");// 处理查询结果while ($row = yield $result->advance()) {var_dump($row);}yield $pool->close();} catch (\Throwable $e) {echo "Error: " . $e->getMessage();}
});

解释

  • 使用 try-catch 结构来捕获可能发生的错误,确保即使出现问题时,程序仍能正常工作。

6. 总结

AMPHP 提供了一个强大的异步 MySQL 客户端,通过事件驱动模型和协程,可以高效地管理并发查询,避免传统同步方式带来的性能瓶颈。通过使用连接池、非阻塞 I/O 和协程,你可以轻松处理高并发的数据库请求,提升系统的响应速度和吞吐量。

  • 安装和配置简单:只需通过 Composer 安装 amphp/mysql
  • 无外部扩展依赖:不需要安装额外的 PHP 扩展,完全基于用户态的 PHP 实现。
  • 高并发支持:通过异步查询和事件循环,能够支持高并发的数据库操作。
  • 连接池管理:自动管理数据库连接,避免了创建和销毁连接的性能开销。

相关文章:

PHP异步非阻塞MySQL客户端连接池

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…...

【Linux 源码】内核态到用户态

文章目录 1. 由来2. 流程图3. 中断3.1 概念3.2 8259A芯片3.4 中断时的栈处理3.4.1 相同特权级3.4.2 不同特权级 3.5 中断流程3.6 定位中断程序3.7 中断流程步骤总结 4. 源码4.1 move_to_user_mode4.2 0号进程4.3 TSS和LDT在GDT表排布4.4 ldt中的0x17栈段 5. 总结 1. 由来 ​ 首…...

goland map学习-实践使用练习:判断存在及遍历

对于数据&#xff1a; type Person struct {Address stringAge intJob stringName string }type People map[string]Personvar per People{"1": Person{Address: "1",Age: 1,Job: "1",Name: "1",},"2&quo…...

【威联通】FTP服务提示:服务器回应不可路由的地址。被动模式失败。

FTP服务器提示&#xff1a;服务器回应不可路由的地址。被动模式失败。 问题原因网络结构安全管理配置服务器配置网关![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/1500d9c0801247ec8c89db7a44907e4f.png) 问题 FTP服务器提示&#xff1a;服务器回应不可路由的地址…...

两份PDF文档,如何比对差异,快速定位不同之处?

PDF文档比对是通过专门的工具或软件&#xff0c;自动检测两个PDF文件之间的差异&#xff0c;并以可视化的方式展示出来。这些差异可能包括文本内容的修改、图像的变化、表格数据的调整、格式的改变等。比对工具通常会标记出新增、删除或修改的部分&#xff0c;帮助用户快速定位…...

Vue.js 组件之间的通信模式

Vue.js 组件之间的通信模式 组件之间的通信模式 在 Vue.js 中&#xff0c;组件之间的通信是构建复杂应用的关键。根据组件之间的关系和需求&#xff0c;Vue 提供了多种通信方式。本文介绍了常见的通信模式及其详细示例。 一、父子组件通信 1. 父组件向子组件传递数据&#…...

【Linux 重装】Ubuntu 启动盘 U盘无法被识别,如何处理?

背景 U盘烧录了 Ubuntu 系统作为启动盘&#xff0c;再次插入电脑后无法被识别 解决方案&#xff08;Mac 适用&#xff09; &#xff08;1&#xff09;查找 USB&#xff0c;&#xff08;2&#xff09;格式化&#xff08;1&#xff09;在 terminal 中通过 diskutil list 查看是…...

.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…...

pyautogui自动化鼠标键盘操作

pyautogui&#xff0c;用来写自动化脚本&#xff0c;比按键精灵更方便。pyautogui.position()可以获取当前鼠标位置。pyautogui不支持中文输入&#xff0c;利用 pyperclip从剪切板粘贴输入。 # -*- coding: utf-8 -*- import time import os import traceback import logging …...

2024年AI大模型技术年度总结与应用实战:创新与突破并进

前言 回顾2024年&#xff0c;我一共发布了286篇博文&#xff0c;粉丝数也达到了43000多。这一年里&#xff0c;我收获颇丰&#xff0c;始终坚持AI大模型的研究方向&#xff0c;并且积极开展大模型的实战应用&#xff0c;也取得了一系列令人振奋的突破。 在286篇博文中&#…...

HTML中相对路径和绝对路径详解

文章目录 HTML中相对路径和绝对路径详解一、引言二、绝对路径1、定义2、使用场景3、代码示例 三、相对路径1、定义2、使用方法3、代码示例 四、使用示例1、图片路径2、CSS和JavaScript文件路径3、页面内部链接 五、总结 HTML中相对路径和绝对路径详解 一、引言 在HTML开发中&a…...

联通用户管理系统(一)

#联通用户管理系统&#xff08;一&#xff09; 1.新建项目 如果你是windows的话&#xff0c;界面应该是如下的&#xff1a; 2.创建app python manage.py startapp app01一般情况下&#xff1a;我们是在pycharm的终端中运行上述指令&#xff0c;但是pychrm中为我们提供了工具…...

STM32-CAN总线

1.CAN总线简介 CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线 2.CAN总线特征 两根通信线&#xff08;CAN_H、CAN_L&#xff09;&#xff0c;线路少&#xff0c;无需共地差分信号通信&#xff08;相对的是单端信号&#xff09;&#…...

mac m1下载maven安装并配置环境变量

下载地址&#xff1a;Download Apache Maven – Maven 解压到一个没有中文和空格的文件夹 输入pwd查看安装路径 输入cd返回根目录再输入 code .zshrc 若显示 command not found: code你可以通过以下步骤来安装和配置 code 命令&#xff1a; 1. 确保你已经安装了 Visual Studio…...

Linux -- HTTP 请求 与 响应 报文

目录 请求报文&#xff1a; 请求方法 响应报文&#xff1a; 状态码 与 状态码描述 共性 常见的报头 请求报文&#xff1a; 请求方法 方法说明GET获取资源POST传输实体主体PUT传输文件HEAD获得报文首部DELETE删除文件OPTIONS询问支持的方法TRACE追踪路径CONNECT要求用…...

oneplus3t-lineage-14编译-android7

lineageOS-14.1-oneplus3t-build.md lineageOS-14(android7)的开发者模式/usb调试(adb)有root功能, 而lineageOS-16(android9)无 oneplus3t-lineage-14编译-android7 1 清华linageos镜像 x lineage-14.1-20180223-nightly-oneplus3-signed.zip ntfs分区挂载为普通用户目录…...

Spring Boot与Spring的区别

在当今的Java开发领域&#xff0c;Spring框架无疑是最为重要且广泛应用的框架之一。而随着技术的不断发展和开发者对效率与便捷性的追求&#xff0c;基于Spring框架的Spring Boot应运而生。接下来&#xff0c;将详细阐述Spring Boot与Spring的主要区别&#xff0c;并通过实际的…...

阿九的python 爬虫进阶课18.3 学习笔记

文章目录 前言1. 爬取大标题2. 爬取小标题3. 证券栏下的标题4. 某篇文章里的具体内容 前言 网课链接&#xff1a;https://www.bilibili.com/video/BV1kV4y1576b/新浪财经网址&#xff1a;https://finance.sina.com.cn/需先下载库&#xff1a; conda install lxml布置爬取的一…...

对人型机器人的研究和展望

目录 概述 1 核心软硬件部件 1.1 运动控制部分 1.1.1 减速机 1.1.2 编码器 1.1.3 直流无刷电机 1.2 智能仿生手 1.3 控制板卡 2 人型机器人的应用 3 未来展望 概述 如果现在有人问&#xff1a;当前那个行业最火&#xff1f;毫无疑问答案肯定是人型机器人了。当前各类机…...

docker 使用远程镜像启动一个容器

使用前提&#xff1a; 首先你得安装docker,其次你得拥有一个远程镜像 docker run --name io_11281009 --rm -it -p 2233:22 -v .:/root/py -e ed25519_rootAAAAC3NzaC1lZDI1********Oy7zR7l7aUniR2rul ghcr.lizzie.fun/fj0r/io srv对上述命令解释&#xff1a; 1.docker run:…...

VTK知识学习(37)-频域处理

1、前言 在图像处理和分析中&#xff0c;经常会将图像从图像空间转换到其他空间中&#xff0c;并利用这些空间的性质对转换后的数据进行分析处理。图像频域处理借助空间变换将图像从图像空间转换到频域空间&#xff0c;根据频域空间的性质对数据进行处理(如滤波)&#xff0c;最…...

什么是软件架构

什么是软件架构 程序员说&#xff0c;软件架构是要决定编写哪些C程序或OO类、使用哪些库和框架 程序经理说&#xff0c;软件架构就是模块的划分和接口的定义 系统分析员说&#xff0c;软件架构就是为业务领域对象的关系建模 配置管理员说&#xff0c;软件架构就是开发出来的…...

RoCE网络及其协议栈详解(没有中间商赚差价的网络)

引言 随着数据中心对高性能、低延迟通信需求的不断增长&#xff0c;传统的TCP/IP以太网连接已经难以满足现代应用的要求。为了解决这些问题&#xff0c;RDMA&#xff08;Remote Direct Memory Access&#xff09;技术应运而生。RDMA是一种允许网络中的不同计算机直接访问对方内…...

el-dialog弹窗的@open方法中,第一次引用ref发现undefined问题,第二次后面又正常了

解决方法 直接不用这个open方法&#xff0c;转而用opened&#xff0c;代码例子&#xff1a; <el-dialog title"单个新增" :visible.sync"PlacardShowSingle" opened"openpbSingle()" width"1100px" top"1%" :close-on-c…...

基于阿里云视觉智能平台实现换脸程序

简介 阿里云视觉智能平台提供了一种强大的换脸功能&#xff0c;能够将视频中的人脸替换成其他图片中的脸。这种功能广泛应用于视频编辑、特效制作等领域。本文将介绍如何使用阿里云视觉智能平台进行视频换脸。 核心工作流程 整个换脸程序的实现可分为以下几个主要步骤&#…...

【2024年华为OD机试】(A卷,100分)- 完美走位 (Java JS PythonC/C++)

一、问题描述 题目解析 题目描述 在第一人称射击游戏中,玩家通过键盘的 A、S、D、W 四个按键控制游戏人物分别向左、向后、向右、向前进行移动。假设玩家每按动一次键盘,游戏人物会向某个方向移动一步。如果玩家在操作一定次数的键盘并且各个方向的步数相同时,此时游戏人…...

一文夯实垃圾收集的理论基础

如何判断一个引用是否存活 引用计数法 给对象中添加一个引用计数器&#xff0c;每当有一个地方引用它&#xff0c;计数器就加 1&#xff1b;当引用失效&#xff0c;计数器就减 1&#xff1b;任何时候计数器为 0 的对象就是不可能再被使用的。 优点&#xff1a;可即刻回收垃圾&a…...

jenkins-api操作

一. 简述&#xff1a; 在一个比较复杂的环境中&#xff0c; 往往会有自己开发的运维管理平台。在代码发布这块&#xff0c;尽管jenkins有一个比较方便的UI&#xff0c; 但很多团队还是喜欢集中式管理&#xff0c; 将发布功能(仅仅把jenkins作为一个发布组件使用)嵌入运维管理平…...

SpringBoot3+Vue3学习

什么是Spring Boot? Spring Boot 是Spring 提供的一个子项目&#xff0c;用于快速构建Spring应用程序 传统方式弊端&#xff1a;之前的项目都用Spring FrameWork构建&#xff0c;需要手动引入依赖&#xff0c;依赖之间有可能存在冲突&#xff0c;较为麻烦&#xff1b;在配置…...

SQL刷题快速入门(三)

其他章节&#xff1a; SQL刷题快速入门&#xff08;一&#xff09; SQL刷题快速入门&#xff08;二&#xff09; 承接前两个章节&#xff0c;本系列第三章节主要讲SQL中where和having的作用和区别、 GROUP BY和ORDER BY作用和区别、表与表之间的连接操作&#xff08;重点&…...

Flutter鸿蒙化中的Plugin

Flutter鸿蒙化中的Plugin 前言鸿蒙项目内PluginFlutter端实现鸿蒙端实现创建Plugin的插件类注册Plugin 开发纯Dart的package为现有插件项目添加ohos平台支持创建插件配置插件编写插件内容 参考资料 前言 大家知道Flutter和鸿蒙通信方式和Flutter和其他平台通信方式都是一样的&…...

Ubuntu 22.04.5 修改IP

Ubuntu22.04.5使用的是netplan管理网络&#xff0c;因此需要在文件夹/etc/netplan下的01-network-manager-all.yaml中修改&#xff0c;需要权限&#xff0c;使用sudo vim或者其他编辑器&#xff0c;修改后的内容如下&#xff1a; # Let NetworkManager manage all devices on …...

后端:MyBatis

文章目录 1. MyBatis1-1. Mybatis 工具类的封装1-2. Mybatis 通过集合或实体类传递参数-实现插入数据(增)1-3. MyBatis 实现删除数据(删)1-4. MyBatis 实现修改数据(改)1-5. MyBatis 实现查询数据(查) 2. MyBatis 配置文件中的一些标签和属性2-1.environments标签2-2. dataSour…...

CBAM-2018学习笔记

名称&#xff1a; Convolutional Block Attention Module (CBAM) 来源&#xff1a; CBAM: Convolutional Block Attention Module 相关工作&#xff1a; #ResNet #GoogleNet #ResNeXt #Network-engineering #Attention-mechanism 创新点&#xff1a; 贡献&#xff1a; 提…...

HTML根元素<html>的语言属性lang:<html lang=“en“>

诸神缄默不语-个人CSDN博文目录 在编写HTML页面时&#xff0c;通常会看到<html lang"en">这行代码&#xff0c;特别是在网页的开头部分&#xff0c;就在<!DOCTYPE html>后面。许多开发者可能对这个属性的含义不太了解&#xff0c;它到底有什么作用&…...

解决github无法clone的问题

问题背景 (base) ~$ git clone https://github.com/isaac-sim/IsaacLab.git 正克隆到 IsaacLab... fatal: 无法访问 https://github.com/isaac-sim/IsaacLab.git/&#xff1a;gnutls_handshake() failed: Error in the pull function.解决办法 我使用了代理&#xff0c;需要配…...

第1章:Python TDD基础与乘法功能测试

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...

【华为路由/交换机的ftp文件操作】

华为路由/交换机的ftp文件操作 PC&#xff1a;10.0.1.1 R1&#xff1a;10.0.1.254 / 10.0.2.254 FTP&#xff1a;10.0.2.1 S1&#xff1a;无配置 在桌面创建FTP-Huawei文件夹&#xff0c;里面创建config/test.txt。 点击上图中的“启动”按钮。 然后ftp到server&#xff0c;…...

【HBuilderX 中 Git 的使用】

目录&#xff1a; 一&#xff1a;安装必要的版本控制工具二&#xff1a;把Github上的项目克隆到本地三&#xff1a;将本地的项目上传到Github上 一&#xff1a;安装必要的版本控制工具 1️⃣ 安装 TortoiseGit 工具&#xff0c;下载地址&#xff1a;https://tortoisegit.org/do…...

语言模型的价值定位与技术突破:从信息处理到创新认知

标题&#xff1a;语言模型的价值定位与技术突破&#xff1a;从信息处理到创新认知 文章信息摘要&#xff1a; 当前语言模型的核心价值主要体现在信息综合与处理能力上&#xff0c;用户友好的交互界面是其成功关键。在模型计算机制方面&#xff0c;推理能力的实现包括chain-of-…...

使用Websocket进行前后端实时通信

1、引入jar&#xff0c;spring-websocket-starter <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency> 2、配置websocket config import org.springframe…...

【Leetcode 热题 100】70. 爬楼梯

问题背景 假设你正在爬楼梯。需要 n n n 阶你才能到达楼顶。 每次你可以爬 1 1 1 或 2 2 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 数据约束 1 ≤ n ≤ 45 1 \le n \le 45 1≤n≤45 解题过程 昨天刚刚当成扩展题做过&#xff0c;今天遇到了再写一次。…...

STM32更新程序OTA

STM32的OTA&#xff08;Over-The-Air&#xff09;更新程序是一种通过无线通信方式&#xff0c;为设备分发新软件、配置甚至更新加密密钥的技术。以下是关于STM32 OTA更新程序的详细介绍&#xff1a; 一、OTA升级流程 STM32的OTA升级流程通常包括以下几个关键步骤&#xff1a;…...

【海贼王航海日志:前端技术探索】一篇文章带你走进JavaScript(三)

目录 1 -> WebAPI背景知识 1.1 -> 什么是WebAPI 1.2 -> 什么是API 1.3 -> 什么是DOM 1.3.1 -> DOM树 2 -> 获取元素 2.1 -> querySelector 2.2 -> querySelectorAll 3 -> 事件初识 3.1 -> 基本概念 3.2 -> 事件三要素 4 -> 操…...

计算机创造的奇迹——C语言

一.简介 C语言是一种较早的程序设计语言&#xff0c;诞生于1972年的贝尔实验室。1972 年&#xff0c;Dennis Ritchie 设计了C语言&#xff0c;它继承了B语言的许多思想&#xff0c;并加入了数据类型的概念及其他特性。 尽管C 语言是与 UNIX 操作系统一起被开发出来的&#xff…...

TypeScript - 利用GPT辅助学习

TypeScript 一、基础1. 安装 TypeScript2. 创建你的第一个 TypeScript 文件3. 编译 TypeScript 代码4. 变量声明与类型注解5. 函数与类型注解6. 总结 二、进阶常用类型1. 类型别名2. 对象类型3. 类型断言4.typeof 操作符 高级类型1. 类2. 交叉类型3. 泛型与 keyof4. 索引签名类…...

Node.js 与 JavaScript 是什么关系

JavaScript 是一种编程语言&#xff0c;而 Node.js 是 JavaScript 的一个运行环境&#xff0c;它们在不同的环境中使用&#xff0c;具有一些共同的语言基础&#xff0c;但也有各自独特的 API 和模块&#xff0c;共同推动着 JavaScript 在前后端开发中的广泛应用。 一、基础语言…...

Spring MVC:设置响应

目录 引言 1. 返回静态页面 1.1 Spring 默认扫描路径 1.2 RestController 1.2.1 Controller > 返回页面 1.2.2 ResponseBody 2. 返回 HTML 2.1 RequestMapping 2.1.1 produces(修改响应的 Content-Type) 2.1.2 其他属性 3. 返回 JSON 4. 设置状态码 4.1 HttpSer…...

c#实现当捕获异常时自动重启程序

首先&#xff0c;需要说明这并不是一个推荐的做法&#xff0c;只有在你确实有这样的需求时才考虑这么做。 以下是AI的回答&#xff0c;为什么不推荐这么做&#xff0c;供参考。 在C#中&#xff0c;如果你在catch语句中尝试重启程序自身&#xff0c;可能会遇到以下几个问题&…...

游戏引擎学习第84天

仓库:https://gitee.com/mrxiao_com/2d_game_2 我们正在试图弄清楚如何完成我们的世界构建 上周做了一些偏离计划的工作&#xff0c;开发了一个小型的背景位图合成工具&#xff0c;这个工具做得还不错&#xff0c;虽然是临时拼凑的&#xff0c;但验证了背景构建的思路。这个过…...