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

探索 Symfony 框架:工作原理、特点及技术选型

目录

1. 概述

2. Symfony 的工作原理

2.1 MVC 架构

2.2 前端控制器模式

2.3 路由机制

2.4 依赖注入容器

2.5 事件驱动架构

3. Symfony 的特点

3.1 高度可扩展性

3.2 强大的社区支持和生态系统

3.3 优秀的性能和可伸缩性

3.4 严格的代码规范和最佳实践

4. Symfony 的技术选型

4.1 适用场景

4.2 技术选型考虑因素

5. 深入解析 Symfony 核心组件

5.1 控制器和操作

5.2 请求和响应

5.3 服务和依赖注入

5.4 模板和视图

6. Symfony 的性能优化

6.1 HTTP 缓存

6.2 OPCache 和 JIT 编译

6.3 数据库优化

7. 安全性

7.1 用户认证和授权

7.2 数据验证和过滤

8. 测试和调试

8.1 单元测试和功能测试

8.2 调试工具

9. 部署和运维

9.1 部署工具

9.2 监控和日志

10. 总结


Symfony 是 PHP 生态系统中最强大且被广泛使用的框架之一,作为一个高性能的开源框架,Symfony 以其模块化、灵活性和强大的功能赢得了开发者的青睐。本文将深入探讨 Symfony 框架的工作原理、独特的特点及其在技术选型中的适用性,帮助开发者更好地理解并应用这一框架。

1. 概述

Symfony 是一个用于构建复杂 web 应用程序的 PHP 框架,它采用 MVC(Model-View-Controller)架构,提供了一组用于开发、测试和部署应用程序的工具和库。Symfony 的设计理念是复用代码和通用设计模式,以减少开发时间和提高代码质量。

2. Symfony 的工作原理

2.1 MVC 架构

Symfony 采用了经典的 MVC 架构,将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。

  • 模型(Model):负责处理与业务逻辑和数据相关的操作。模型与数据库交互,管理应用程序的数据。
  • 视图(View):负责生成用户界面。视图从模型中获取数据并以适当的格式展示给用户。
  • 控制器(Controller):负责处理用户输入并将其转换为模型的操作。控制器协调模型和视图之间的交互。

通过将应用程序分为这三个部分,Symfony 实现了关注点分离,使得代码更易于管理和维护。

2.2 前端控制器模式

Symfony 使用前端控制器模式,所有的请求都由单一入口文件(通常是 index.php)处理。这个入口文件初始化框架并将请求路由到适当的控制器进行处理。

这种模式的优点在于集中管理所有的请求逻辑,简化了应用程序的结构,提高了代码的可维护性和可测试性。通过集中处理请求,Symfony 可以更有效地实现全局功能,如用户认证、日志记录和错误处理等。

2.3 路由机制

Symfony 的路由系统非常灵活且功能强大。开发者可以在路由配置文件中定义 URL 模式,并将其映射到相应的控制器操作。Symfony 的路由器会解析请求的 URL 并匹配到相应的路由,进而调用对应的控制器方法。

路由配置通常在 YAML、XML 或 PHP 文件中完成。例如,一个简单的路由配置可能如下所示:

# config/routes.yaml
blog_list:path: /blogcontroller: App\Controller\BlogController::list

这个配置定义了一个路径 /blog,并将其映射到 BlogControllerlist 方法。当用户访问 /blog 时,Symfony 会调用相应的控制器方法来处理请求。

2.4 依赖注入容器

Symfony 的依赖注入容器是其核心组件之一。它管理应用程序中的所有服务和依赖关系,使得代码更加模块化和可测试。开发者可以在配置文件中定义服务,并通过依赖注入容器将其注入到需要使用这些服务的类中。

依赖注入容器的一个简单示例如下:

# config/services.yaml
services:App\Service\Mailer:arguments:$transport: '%mailer_transport%'

在这个示例中,Mailer 服务被定义,并将一个参数 transport 注入到该服务中。通过依赖注入,开发者可以轻松管理和替换服务的依赖,从而提高代码的灵活性和可测试性。

2.5 事件驱动架构

Symfony 采用了事件驱动架构,允许开发者在特定的生命周期事件中挂钩自定义逻辑。事件调度器会在应用程序的特定时刻触发事件,监听这些事件的订阅者会相应地执行预定义的操作。

例如,当用户注册时,可以触发一个 UserRegistered 事件,然后有一个监听器可以发送欢迎邮件:

// src/Event/UserRegisteredEvent.php
namespace App\Event;use Symfony\Contracts\EventDispatcher\Event;class UserRegisteredEvent extends Event
{private $user;public function __construct(User $user){$this->user = $user;}public function getUser(): User{return $this->user;}
}
 
// src/EventListener/SendWelcomeEmailListener.php
namespace App\EventListener;use App\Event\UserRegisteredEvent;
use App\Service\Mailer;class SendWelcomeEmailListener
{private $mailer;public function __construct(Mailer $mailer){$this->mailer = $mailer;}public function onUserRegistered(UserRegisteredEvent $event){$this->mailer->sendWelcomeEmail($event->getUser());}
}

3. Symfony 的特点

3.1 高度可扩展性

Symfony 提供了许多可扩展的机制,允许开发者根据需要扩展框架的功能。Bundle 是 Symfony 的核心扩展机制,类似于插件或模块。开发者可以创建和使用第三方 Bundle 来添加新功能或集成外部服务。

例如,Symfony 官方提供了许多开箱即用的 Bundle,如 DoctrineBundle 用于数据库操作,SecurityBundle 用于用户认证和授权等。开发者还可以创建自定义 Bundle 来实现特定功能,并通过配置文件将其集成到应用程序中。

3.2 强大的社区支持和生态系统

Symfony 拥有一个活跃且不断增长的社区,提供了大量的文档、教程和第三方扩展。Symfony 生态系统包括了许多高质量的 Bundle 和组件,开发者可以轻松地找到并使用这些资源来加速开发过程。

例如,Symfony 有一个官方市场 Symfony Flex,开发者可以通过它搜索和安装各种 Bundle 和组件。社区还经常举办会议和黑客马拉松,促进开发者之间的交流和合作。

3.3 优秀的性能和可伸缩性

Symfony 通过优化其核心组件和使用现代技术,如 HTTP 缓存和代码优化,提供了出色的性能。其模块化设计和可配置性使得应用程序能够轻松地横向扩展,以应对高并发的需求。

例如,Symfony 的 HTTP 缓存机制允许开发者轻松地缓存整个页面或部分内容,从而大大提高响应速度。Symfony 还支持使用高性能的 PHP 加速器,如 OPCache 和 JIT 编译器,以进一步提高执行速度。

3.4 严格的代码规范和最佳实践

Symfony 遵循严格的代码规范和最佳实践,如 SOLID 原则和 PSR 标准。这些规范和实践有助于提高代码质量和可维护性,使团队协作更加高效。

Symfony 强调代码的一致性和可读性,官方提供了详细的编码标准和指南。开发者可以使用 Symfony 的代码分析工具,如 PHP-CS-Fixer 和 PHPStan,来自动检查和修复代码中的问题。

4. Symfony 的技术选型

4.1 适用场景
  • 企业级应用:Symfony 非常适合开发复杂的企业级应用程序,如 ERP 系统、CRM 系统等。其强大的功能和灵活的架构使得开发和维护大型应用变得更加容易。
  • API 服务:Symfony 的高度可配置性和优秀的性能使其成为构建高性能 API 服务的理想选择。其内置的 API Platform 组件简化了 API 的开发和管理。
  • 内容管理系统(CMS):Symfony 可以用于构建高度定制化的 CMS。许多流行的 CMS(如 Drupal 8 及以上版本)都是基于 Symfony 构建的,充分利用了其强大的功能和灵活性。
4.2 技术选型考虑因素
  • 开发团队经验:如果团队中有成员熟悉 Symfony 或类似的 MVC 框架,那么选择 Symfony 会大大减少学习成本和开发时间。
  • 项目复杂度:对于复杂度较高的项目,Symfony 提供的模块化架构和丰富的功能可以帮助开发团队更好地管理代码和资源。
  • 性能要求:Symfony 的性能优化特性,如 HTTP 缓存、代码优化和事件驱动架构,使其在高性能需求的项目中表现出色。
  • 社区支持和资源:Symfony 拥有强大的社区支持和丰富的第三方资源,如果项目需要使用许多现成的组件或扩展,那么 Symfony 是一个理想的选择。

5. 深入解析 Symfony 核心组件

5.1 控制器和操作

在 Symfony 中,控制器是一个 PHP 类,其中的方法被称为操作。这些方法负责处理请求并生成响应。控制器方法通常通过路由配置与特定的 URL 关联。当用户访问这些 URL 时,Symfony 会调用相应的控制器方法来处理请求。

一个简单的控制器示例:

// src/Controller/BlogController.php
namespace App\Controller;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;class BlogController extends AbstractController
{/*** @Route("/blog", name="blog_list")*/public function list(): Response{// Fetch blog posts from the database// Render a template with the blog postsreturn $this->render('blog/list.html.twig', ['posts' => $posts,]);}
}

在这个示例中,BlogController 中的 list 方法被映射到 /blog 路径,并使用 @Route 注解来定义路由。

5.2 请求和响应

Symfony 使用 HttpFoundation 组件来处理 HTTP 请求和响应。每个请求由一个 Request 对象表示,响应由一个 Response 对象表示。控制器方法通常接受一个 Request 对象作为参数,并返回一个 Response 对象。

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;public function list(Request $request): Response
{$page = $request->query->get('page', 1);// Fetch blog posts for the given page// ...return new Response($content);
}
5.3 服务和依赖注入

服务是 Symfony 应用程序的核心组成部分,表示应用程序中执行特定任务的对象。Symfony 使用依赖注入容器来管理服务,并通过依赖注入将服务注入到需要使用它们的类中。

例如,假设有一个 Mailer 服务,用于发送电子邮件:

namespace App\Service;class Mailer
{private $transport;public function __construct(string $transport){$this->transport = $transport;}public function send(string $to, string $subject, string $body): void{// Send email logic}
}

可以在控制器中通过依赖注入使用这个服务:

namespace App\Controller;use App\Service\Mailer;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;class BlogController extends AbstractController
{private $mailer;public function __construct(Mailer $mailer){$this->mailer = $mailer;}/*** @Route("/blog", name="blog_list")*/public function list(): Response{// Use mailer service to send an email$this->mailer->send('example@example.com', 'New blog post', 'Check out our latest blog post!');return new Response('Email sent!');}
}
5.4 模板和视图

Symfony 使用 Twig 作为默认的模板引擎。Twig 是一个快速、灵活且安全的模板引擎,提供了强大的功能和简洁的语法。开发者可以使用 Twig 模板来生成 HTML、XML 或其他文本格式的输出。

一个简单的 Twig 模板示例:

{# templates/blog/list.html.twig #}
<!DOCTYPE html>
<html>
<head><title>Blog List</title>
</head>
<body><h1>Blog Posts</h1><ul>{% for post in posts %}<li>{{ post.title }}</li>{% endfor %}</ul>
</body>
</html>

在控制器中,可以使用 render 方法来渲染模板并生成响应:

return $this->render('blog/list.html.twig', ['posts' => $posts,
]);

6. Symfony 的性能优化

6.1 HTTP 缓存

Symfony 提供了强大的 HTTP 缓存功能,可以显著提高应用程序的性能。通过缓存整个页面或部分内容,可以减少服务器负载和响应时间。

例如,可以在控制器中设置缓存响应:

use Symfony\Component\HttpFoundation\Response;public function list(): Response
{$response = new Response($content);$response->setSharedMaxAge(3600); // Cache for 1 hourreturn $response;
}
6.2 OPCache 和 JIT 编译

PHP 的 OPCache 扩展可以显著提高脚本的执行速度。Symfony 默认支持 OPCache,通过配置 PHP 以启用 OPCache,可以减少代码的解析和编译时间。

此外,PHP 8 引入了 JIT 编译(即时编译),进一步提高了执行性能。Symfony 兼容 PHP 8,并能够利用 JIT 编译带来的性能提升。

6.3 数据库优化

对于数据库密集型应用程序,优化数据库查询和结构是提高性能的关键。Symfony 提供了许多工具和最佳实践来优化数据库操作,例如使用 Doctrine ORM 的缓存、查询优化和索引等。

7. 安全性

7.1 用户认证和授权

Symfony 提供了强大的安全组件,简化了用户认证和授权的实现。开发者可以使用 SecurityBundle 来配置和管理用户登录、权限和角色等。

例如,可以使用安全配置文件定义访问控制规则:

# config/packages/security.yaml
security:firewalls:main:anonymous: trueform_login:login_path: logincheck_path: loginlogout:path: logoutaccess_control:- { path: ^/admin, roles: ROLE_ADMIN }
7.2 数据验证和过滤

Symfony 的验证组件提供了强大的数据验证和过滤功能。开发者可以定义验证规则,并在表单提交或 API 请求时自动验证输入数据。

例如,可以使用注解定义实体类的验证规则:

use Symfony\Component\Validator\Constraints as Assert;class User
{/*** @Assert\NotBlank* @Assert\Email*/private $email;/*** @Assert\NotBlank* @Assert\Length(min=6)*/private $password;
}

8. 测试和调试

8.1 单元测试和功能测试

Symfony 提供了强大的测试支持,允许开发者编写单元测试和功能测试,以确保应用程序的质量和可靠性。开发者可以使用 PHPUnit 编写和运行测试,并利用 Symfony 的测试工具和方法来简化测试过程。

例如,一个简单的控制器测试:

namespace App\Tests\Controller;use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;class BlogControllerTest extends WebTestCase
{public function testList(){$client = static::createClient();$crawler = $client->request('GET', '/blog');$this->assertResponseIsSuccessful();$this->assertSelectorTextContains('h1', 'Blog Posts');}
}
8.2 调试工具

Symfony 提供了丰富的调试工具和集成,帮助开发者在开发过程中快速定位和解决问题。Symfony Profiler 是一个强大的调试工具,可以提供有关请求、响应、数据库查询和其他性能数据的详细信息。

开发者可以在开发环境中启用 Symfony Profiler,并通过浏览器访问调试信息:

# config/packages/dev/web_profiler.yaml
web_profiler:toolbar: trueintercept_redirects: false

9. 部署和运维

9.1 部署工具

Symfony 提供了多种部署工具和方法,简化了应用程序的部署和更新过程。开发者可以使用 Deployer 等工具自动化部署任务,确保部署过程的高效和可靠。

一个简单的 Deployer 配置示例:

namespace Deployer;require 'recipe/symfony.php';host('example.com')->set('deploy_path', '~/example.com');task('deploy', ['deploy:prepare','deploy:vendors','deploy:cache:clear','deploy:publish',
]);after('deploy:failed', 'deploy:unlock');
9.2 监控和日志

Symfony 提供了强大的日志记录和监控功能,帮助开发者实时监控应用程序的运行状态和性能。开发者可以使用 Monolog 组件配置和管理日志记录,将日志信息发送到文件、数据库或外部服务。

一个简单的日志配置示例:

# config/packages/prod/monolog.yaml
monolog:handlers:main:type: streampath: '%kernel.logs_dir%/%kernel.environment%.log'level: error

10. 总结

Symfony 作为一个功能强大且灵活的 PHP 框架,在现代 web 开发中扮演着重要角色。其 MVC 架构、前端控制器模式、灵活的路由机制、依赖注入容器和事件驱动架构等特点,使得 Symfony 在构建复杂 web 应用程序时表现出色。对于企业级应用、API 服务和高度定制化的 CMS,Symfony 提供了强大的支持和丰富的功能。通过合理的技术选型和最佳实践,开发者可以充分利用 Symfony 的优势,快速高效地交付高质量的 web 应用程序。

相关文章:

探索 Symfony 框架:工作原理、特点及技术选型

目录 1. 概述 2. Symfony 的工作原理 2.1 MVC 架构 2.2 前端控制器模式 2.3 路由机制 2.4 依赖注入容器 2.5 事件驱动架构 3. Symfony 的特点 3.1 高度可扩展性 3.2 强大的社区支持和生态系统 3.3 优秀的性能和可伸缩性 3.4 严格的代码规范和最佳实践 4. Symfony …...

从万里长城防御体系看软件安全体系建设@安全历史03

长城&#xff0c;是中华民族的一张重要名片&#xff0c;是中华民族坚韧不屈、自强不息的精神象征&#xff0c;被联合国教科文组织列入世界文化遗产名录。那么在古代&#xff0c;长城是如何以其复杂的防御体系&#xff0c;一次次抵御外族入侵&#xff0c;而这些防御体系又能给软…...

ISO 19110操作要求类中的/req/operation/formal-definition详细解释

/req/operation/formal-definition 要求: 每个要素操作实体必须具有一个形式定义&#xff08;formal definition&#xff09;&#xff0c;该定义应明确描述操作的行为和影响。 具体解释 定义 要素操作实体&#xff08;feature operation entity&#xff09;&#xff1a;这…...

豆包大语言模型API调用错误码一览表

本文介绍了您可能从 API 和官方 SDK 中看到的错误代码。 http code说明 400 原因&#xff1a;错误的请求&#xff0c;例如缺少必要参数&#xff0c;或者参数不符合规范等 解决方法&#xff1a;检查请求后重试 401 原因&#xff1a;认证错误&#xff0c;代表服务无法对请求进…...

AI辅助设计:如何通过机器学习革新创意工作流程

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法&#xff0c;大数据&#xff0c;深度学习 &#x1f492; 公众号…...

轻松解锁电脑强悍性能,4000MHz的玖合星舞 DDR4 内存很能打

轻松解锁电脑强悍性能&#xff0c;4000MHz的玖合星舞 DDR4 内存很能打 哈喽小伙伴们好&#xff0c;我是Stark-C~ 很多有经验的电脑玩家在自己DIY电脑选购内存条的时候&#xff0c;除了内存总容量&#xff0c;最看重的参数那就是频率了。内存频率和我们常说的CPU主频一样&…...

SpringBoot | 使用jwt令牌实现登录认证,使用Md5加密实现注册

对于登录认证中的令牌&#xff0c;其实就是一段字符串&#xff0c;那为什么要那么麻烦去用jwt令牌&#xff1f;其实对于登录这个业务&#xff0c;在平常我们实现这个功能时&#xff0c;可能大部分都是通过比对用户名和密码&#xff0c;只要正确&#xff0c;就登录成功&#xff…...

Springboot基于Redis的高性能分布式缓存数据库的实现与实例

一、引言 在现代的分布式系统和高并发应用中&#xff0c;缓存机制显得尤为重要。Redis作为一种开源&#xff08;BSD许可&#xff09;的内存键值存储&#xff0c;因其高性能、丰富的数据结构和多样化的应用场景&#xff0c;成为开发者们的首选。在这篇博客中&#xff0c;我们将…...

防止多次点击,vue的按钮上做简易的防抖节流处理

话不多说,上个视频,看看是不是你要的效果 防抖节流 1.创建一个directive.js // directive.js export default {install(Vue) {// 防重复点击(指令实现)Vue.directive(repeatClick, {inserted(el, binding) {el.addEventListener(click, () > {if (!el.disabled) {el.disabl…...

云计算【第一阶段(21)】Linux引导过程与服务控制

目录 一、linux操作系统引导过程 1.1、开机自检 1.2、MBR引导 1.3、GRUB菜单 1.4、加载 Linux 内核 1.5、init进程初始化 1.6、简述总结 1.7、初始化进程centos 6和7的区别 二、排除启动类故障 2.1、修复MBR扇区故障 2.1.1、 实验 2.2、修复grub引导故障 2.2.1、实…...

Google 发布最新开放大语言模型 Gemma 2,现已登陆 Hugging Face Hub

Google 发布了最新的开放大语言模型 Gemma 2&#xff0c;我们非常高兴与 Google 合作&#xff0c;确保其在 Hugging Face 生态系统中的最佳集成。你可以在 Hub 上找到 4 个开源模型 (2 个基础模型和 2 个微调模型) 。发布的功能和集成包括&#xff1a; Hub 上的模型https://hf.…...

智能分析赋能等保:大数据技术在安全审计记录中的应用

随着信息技术的飞速发展&#xff0c;大数据技术在各行各业中的应用愈发广泛&#xff0c;特别是在网络安全领域&#xff0c;大数据技术为安全审计记录提供了强有力的支撑。本文将深入探讨智能分析如何赋能等保&#xff08;等级保护&#xff09;&#xff0c;以及大数据技术在安全…...

Django中,update_or_create()

在Django中&#xff0c;可以使用update_or_create()方法来更新现有记录或创建新记录。该方法接受一个字典作为参数&#xff0c;用于指定要更新或创建的字段和对应的值。 update_or_create()方法的语法如下&#xff1a; 代码语言&#xff1a;python obj, created Model.obje…...

每日一学(1)

目录 1、ConCurrentHashMap为什么不允许key为null&#xff1f; 2、ThreadLocal会出现内存泄露吗&#xff1f; 3、AQS理解 4、lock 和 synchronized的区别 1、ConCurrentHashMap为什么不允许key为null&#xff1f; 底层 putVal方法 中 如果key || value为空 抛出…...

SpringMVC(1)——入门程序+流程分析

MVC都是哪三层&#xff1f;在Spring里面分别对应什么&#xff1f;SpringMVC的架构是什么&#xff1f; 我们使用Spring开发JavaWeb项目&#xff0c;一般都是BS架构&#xff0c;也就是Browser&#xff08;浏览器&#xff09;-Server&#xff08;服务器&#xff09;架构 这种架构…...

成绩发布背后:老师的无奈与痛点

在教育的广阔天地里&#xff0c;教师这一角色承载着无数的期望与责任。他们不仅是知识的传播者&#xff0c;更是学生心灵的引路人。而对于班主任老师来说&#xff0c;他们的角色更加多元&#xff0c;他们不仅是老师&#xff0c;还必须是“妈妈”。除了像其他老师一样备课、上课…...

MySQL 索引之外的相关查询优化总结

在这之前先说明几个概念&#xff1a; 1、驱动表和被驱动表&#xff1a;驱动表是主表&#xff0c;被驱动表是从表、非驱动表。驱动表和被驱动表并非根据 from 后面表名的先后顺序而确定&#xff0c;而是根据 explain 语句查询得到的顺序确定&#xff1b;展示在前面的是驱动表&am…...

EE trade:贵金属投资的优点及缺点

贵金属(如黄金、白银、铂金和钯金)一直以来都是重要的投资和避险工具。它们具有独特的物理和化学特性&#xff0c;广泛应用于各种行业&#xff0c;同时也被视为财富储备。在进行贵金属投资时&#xff0c;了解其优点和缺点对于做出明智的投资决策至关重要。 一、贵金属投资的优…...

python工作目录与文件目录

工作目录 文件目录&#xff1a;文件所在的目录 工作目录&#xff1a;执行python命令所在的目录 D:. | main.py | ---data | data.txt | ---model | | model.py | | train.py | | __init__.py | | | ---nlp | | | bert.py | …...

可信和可解释的大语言模型推理-RoG

大型语言模型&#xff08;LLM&#xff09;在复杂任务中表现出令人印象深刻的推理能力。然而&#xff0c;LLM在推理过程中缺乏最新的知识和经验&#xff0c;这可能导致不正确的推理过程&#xff0c;降低他们的表现和可信度。知识图谱(Knowledge graphs, KGs)以结构化的形式存储了…...

秋招季的策略与行动指南:提前布局,高效备战,精准出击

6月即将进入尾声&#xff0c;一年一度的秋季招聘季正在热火进行中。对于即将毕业的学生和寻求职业发展的职场人士来说&#xff0c;秋招是一个不容错过的黄金时期。 秋招的序幕通常在6月至9月间拉开&#xff0c;名企们纷纷开启网申的大门。在此期间&#xff0c;求职备战是一个系…...

Java并发编程-wait与notify详解及案例实战

文章目录 概述wait()notify()作用注意事项用wait与notify手写一个内存队列wait与notify的底层原理:monitor以及wait_setMonitor(监视器)Wait Set(等待集合)Wait() 原理Notify() / NotifyAll() 原理注意事项wait与notify在代码中使用时的注意事项总结案例实战:基于wait与not…...

204.贪心算法:分发饼干(力扣)

以下来源于代码随想录 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {// 对孩子的胃口进行排序sort(g.begin(), g.end());// 对饼干的尺寸进行排序sort(s.begin(), s.end());int index s.size() - 1; // 从最大的饼…...

AI奥林匹克竞赛:Claude-3.5-Sonnet对决GPT-4o,谁是最聪明的AI?

目录 实验设置 评估对象 评估方法 结果与分析 针对学科的细粒度分析 GPT-4o vs. Claude-3.5-Sonnet GPT-4V vs. Gemini-1.5-Pro 结论 AI技术日新月异&#xff0c;Anthropic公司最新发布的Claude-3.5-Sonnet因在知识型推理、数学推理、编程任务及视觉推理等任务上设立新…...

【C++】const修饰成员函数

const修饰成员函数 常函数&#xff1a; 成员函数后加const后我们称为这个函数为常函数 常函数内不可以修改成员属性 成员属性声明时加关键字mutable后&#xff0c;在常函数中依然可以修改 class Animal { public:void fun1(){//这是一个普通的成员函数 }void fun2…...

基于模糊神经网络的时间序列预测(以hopkinsirandeath数据集为例,MATLAB)

模糊神经网络从提出发展到今天,主要有三种形式&#xff1a;算术神经网络、逻辑模糊神经网络和混合模糊神经网络。算术神经网络是最基本的&#xff0c;它主要是对输入量进行模糊化&#xff0c;且网络结构中的权重也是模糊权重&#xff1b;逻辑模糊神经网络的主要特点是模糊权值可…...

Java web应用性能分析之【prometheus监控K8s指标说明】

常规k8s的监控指标 单独 1、集群维度 集群状态集群节点数节点状态&#xff08;正常、不可达、未知&#xff09;节点的资源使用率&#xff08;CPU、内存、IO等&#xff09; 2、应用维度 应用响应时间 应用的错误率 应用的请求量 3、系统和集群组件维度 API服务器状态控…...

Spring Boot中的应用配置文件管理

Spring Boot中的应用配置文件管理 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨Spring Boot中的应用配置文件管理。在现代的软件开发中&am…...

SCCB协议介绍,以及与IIC协议对比

在之前的文章里已经介绍了IIC协议&#xff1a;iic通信协议 这篇内容主要介绍一下SCCB协议。 文章目录 SCCB协议&#xff1a;SCCB时序图iic时序图SCCB时序 VS IIC时序 总&#xff1a;SCCB协议常用在摄像头配置上面&#xff0c;例如OV5640摄像头&#xff0c;和IIC协议很相似&…...

K8S基础简介

用于自动部署&#xff0c;扩展和管理容器化应用程序的开源系统。 功能&#xff1a; 服务发现和负载均衡&#xff1b; 存储编排&#xff1b; 自动部署和回滚&#xff1b; 自动二进制打包&#xff1b; 自我修复&#xff1b; 密钥与配置管理&#xff1b; 1. K8S组件 主从方式架…...

Studying-代码随想录训练营day24| 93.复原IP地址、78.子集、90.子集II

第24天&#xff0c;回溯算法part03&#xff0c;牢记回溯三部曲&#xff0c;掌握树形结构结题方法&#x1f4aa; 目录 93.复原IP地址 78.子集 90.子集II 总结 93.复原IP地址 文档讲解&#xff1a;代码随想录复原IP地址 视频讲解&#xff1a;手撕复原IP地址 题目&#xff1…...

2024《汽车出海全产业数据安全合规发展白皮书》下载

随着中国制造向中国智造目标的迈进&#xff0c;中国汽车正以前所未有的速度和质量&#xff0c;在全球市场上开疆拓土。不过&#xff0c;在中国汽车加快出海步伐的过程中&#xff0c;数据安全合规风险管理成为车企不容忽视的课题。 6月25日&#xff0c;在中国&#xff08;上海&…...

nvm安装以及idea下vue启动项目过程和注意事项

注意1&#xff1a;nvm版本不要太低&#xff0c;1.1.7会出现下面这个问题&#xff0c;建议1.1.10及其以上版本 然后安装这个教程安装nvm和node.js 链接: nvm安装教程&#xff08;一篇文章所有问题全搞定&#xff0c;非常详细&#xff09; 注意2&#xff1a;上面的教程有一步骤…...

Java SPI服务发现与扩展的利器

Java中&#xff0c;为了实现模块之间的解耦和可扩展性&#xff0c;我们常常需要一种机制来动态加载和替换实现。Java SPI就是这样一种机制&#xff0c;它允许我们在不修改原有代码的情况下&#xff0c;为接口添加新的实现&#xff0c;并在运行时动态加载它们。 SPI&#xff0c…...

Ansible的Playbook

Playbook 特点 playbook 剧本是由一个或多个"play"组成的列表play的主要功能在于将预定义的一组主机&#xff0c;装扮成事先通过ansible中的task定义好的任务角色。Task实际是调用ansible的一个module&#xff0c;将多个play组织在一个playbook中&#xff0c;即可以让…...

多平台自动养号【开心版】偷偷使用就行了!

大家好&#xff0c;今天我无意间发现了一款【多平台自动养号工具】&#xff0c;看了一下里面的功能还是挺全面的&#xff0c;包含了【抖音&#xff0c;快手&#xff0c;小红薯】还有一些截流功能 虽然这款工具功能强大&#xff0c;但美中不足的是需要付费的。但别担心&#xf…...

Android与JavaScript的交互,以实现从WebView中打开原生页面并传递参数

在Android应用中&#xff0c;实现Android与JavaScript的交互&#xff0c;以实现从WebView中打开原生页面并传递参数&#xff0c;可以通过以下详细步骤完成&#xff1a; 1. 准备工作 添加WebView至布局&#xff1a;在你的Activity或Fragment的XML布局文件中加入WebView控件。 …...

信息(文字、图像、音频、视频等)在计算机中是如何存储及显示的

信息&#xff08;文字、图像、音频、视频等&#xff09;在计算机中是如何存储及显示的 图片的存储图片的文件格式像素数据的二进制表示存储和处理显示总结 图片的显示4. 像素点控制具体的像素控制过程示例总结 如题&#xff0c;这里以图片为例。 图片的存储 计算机桌面上的一…...

【考研408计算机组成原理】微程序设计重要考点指令流水线考研真题+考点分析

苏泽 “弃工从研”的路上很孤独&#xff0c;于是我记下了些许笔记相伴&#xff0c;希望能够帮助到大家 目录 微指令的形成方式 微指令的地址形成方式 对应考题 题目&#xff1a;微指令的地址形成方式 - 断定方式 解题思路&#xff1a; 答题&#xff1a; 分析考点&…...

查看哪个docker环境在占用gpu

前言 有时候发现某些docker占用gpu资源却没有训练&#xff0c;需要查清楚是哪个并且把它stop掉。 方法 在docker里面用nvidia-smi命令&#xff0c;没有pid显示&#xff0c;需要在外面使用。得到pid信息后&#xff0c;使用命令 docker top 15766f6eeaf7(容器ID) | grep 551…...

JVM相关总结

JVM的些许问题 1.JVM内存区域划分 2.JVM类加载过程 3.JVM的垃圾回收机制 1.JVM的内存区域划分 一个运行起来的Java进程就是一个JVM虚拟机,需要从操作系统申请一大片内存,就会把内存划分成几个区域,每个区域都有不同的作用 常见的面试题 2.JVM类加载过程 熟练背诵 ! ! !…...

Python 面试【初级】

欢迎莅临我的博客 &#x1f49d;&#x1f49d;&#x1f49d;&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

机器学习SVR 随机森林 RBF神经网络做回归预测的MATLAB代码

SVR 参考这篇文章 Libsvm使用笔记【matlab】 close all; clc clear %% 下载数据 load(p_train.mat); load(p_test.mat); load(t_train.mat); load(t_test.mat); %% 数据归一化 %输入样本归一化 [pn_train,ps1] mapminmax(p_train); pn_train pn_train; pn_test mapminma…...

Spring Boot中配置Swagger用于API文档

Spring Boot中配置Swagger用于API文档 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Spring Boot应用中配置Swagger&#xff0c;以便于快…...

学习java第一百一十六天

Spring Framework有哪些不同的功能&#xff1f; 答&#xff1a; 轻量级-Spring 在代码量和透明度方面都很轻便。 IOC-控制反转AOP-面向切面编程可以将应用业务逻辑和系统服务分离&#xff0c;以实现高内聚。容器-Spring 负责创建和管理对象&#xff08;Bean&#xff09;的生命周…...

SQL Server的隐私盾牌:动态数据屏蔽(DMS)全面解析

&#x1f6e1;️ SQL Server的隐私盾牌&#xff1a;动态数据屏蔽(DMS)全面解析 在数据驱动的商业世界中&#xff0c;保护敏感信息至关重要。SQL Server提供了一种强大的安全特性——动态数据屏蔽&#xff08;Dynamic Data Masking&#xff0c;简称DMS&#xff09;&#xff0c;…...

Android中常见的线程池

日常开发中我们常常使用到线程池&#xff0c;其能有效管理线程资源&#xff0c;避免过多线程导致系统资源浪费、又能复用线程资源&#xff0c;避免频繁的创建/销毁线程。在Android中线程池的实现为ThreadPoolExecutor类&#xff0c;本文主要记录该类相关的知识点。 线程池的六…...

C# YoloV8 模型效果验证工具(OnnxRuntime+ByteTrack推理)

C# YoloV8 模型效果验证工具(OnnxRuntimeByteTrack推理) 目录 效果 项目 代码 下载 效果 模型效果验证工具 项目 代码 using ByteTrack; using OpenCvSharp; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using Sys…...

什么是Cookie?有什么用?如何清除浏览器中的Cookie?

互联网上的每一次点击和每一个选择都可能被一种名为Cookie的技术记录下来。但Cookie是什么&#xff1f;我们在网站上登录时&#xff0c;为什么经常会被问及是否接受Cookie&#xff1f;接受Cookie登录会不会影响我们的在线隐私&#xff1f; Cookie是什么&#xff1f; Cookie是一…...

数据库基本管理

数据完整性&#xff1a; 实体完整性&#xff1a;每一行必须是唯一的实体域完整性&#xff1a;检查每一列是否有效引用完整性&#xff1a;确保所有表中数据的一致性&#xff0c;不允许引用不存在的值用户定义的完整性&#xff1a;制定特定的业务规则 主键&#xff1a; 用于唯…...

Spring Cloud中的服务熔断与降级

Spring Cloud中的服务熔断与降级 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨在Spring Cloud中的服务熔断与降级策略。 一、什么是服务熔…...

手机数据恢复篇:恢复出厂设置后从iPhone快速恢复数据

如今&#xff0c;恢复出厂设置后从iPhone恢复数据的需求变得越来越普遍。无论是由于意外重置、软件问题&#xff0c;还是希望恢复以前拥有的设备&#xff0c;丢失数据都可能令人痛苦。值得庆幸的是&#xff0c;随着技术的进步&#xff0c;可以快速安全地检索丢失的信息。本指南…...

Java数组

声明数组变量 dataType[] arrRefVar; 或者 dataType arrRefVar[]; 创建数组变量 使用new字符创建数组 arrayRefVar new dataType[arraySize]; 也可以和声明放在一起 dataType[] arrayRefVar new dataType[arraySize]; 或者 dataType[] arrayRefVar {value0, value1, …, …...

【第三版 系统集成项目管理工程师】第5 章 软件工程

持续更新。。。。。。。。。。。。。。。 【第三版】第五章 软件工程 5.1软件工程定义练习 5.2软件需求5.2.1雾求的层次1.业务需求-P2032.用户需求-P2033.系统需求-P203 5.2.2质量功能部署 P2035.2.3需求获取 P2045.2.4需求分析1.结构化分析-P2042.面向对象分析-P207 5.2.5号求…...

【C语言】typedef 关键字

在C语言中&#xff0c;typedef关键字用于给现有的数据类型起一个新的名字。它在提高代码可读性、简化复杂类型声明、增强可维护性方面非常有用。typedef通常用于定义结构体、指针、函数指针以及其他复杂类型。 基本用法 typedef int MyInt; MyInt x 10;在这个例子中&#xf…...

小白学Frp+Proxifier | 网隧道搭建

一、什么是Frp和Proxifier Frp&#xff08;Fast Reverse Proxy&#xff09;&#xff1a;是一款高性能的反向代理应用&#xff0c;可以帮助你将内网服务暴露到外网。 Proxifier&#xff1a;是一款网络代理软件&#xff0c;允许网络应用通过HTTP、SOCKS代理连接互联网。 二、准…...

宾利发布“Edition8”限量版庆祝“V8”时代的结束!

Hello,大家好,我是Fighting小马。宾利声称自2012年推出最新一代V8发动机以来,已将超过53,000台纯手工制造的V8发动机应用于各种车型。但一则最新消息让人略有伤感,这家英国汽车制造商表示,在非插电式混合动力的某些宾利车型上V8发动机很快将会消失。也许喜欢宾利的你听到这…...

订单超13000台,配激光雷达+空悬+CDC,增程/纯电

前不久,星途星纪元ET开启预售,新车提供增程和纯电两种动力,官方给出的预售价格区间为:增程版19.9万-23.9万元,纯电动版为23.9-32.9万元,作为一台长度接近5米,轴距为3米的大5座车型,它的目标竞品为理想L7/L6以及问界M7等车型,星纪元ET的优势是动力组合丰富,价格便宜,另…...

自定义注解+AOP切面实现日志记录

自定义注解&#xff1a; Target(ElementType.METHOD)// 作用在方法上 Retention(RetentionPolicy.RUNTIME) Documented Inherited // 子类可以继承此注解 public interface OperationLog { } aop切面&#xff1a; Slf4j Aspect Component public class OperationAspect {Au…...

低代码开发难吗?

在软件开发的多样化浪潮中&#xff0c;低代码开发平台以其简化的编程模型&#xff0c;为IT行业带来了新的活力。作为一位资深的IT技术员&#xff0c;我对低代码开发平台的易用性和强大功能有着深刻的认识。今天&#xff0c;我将分享我对YDUIbuilder这一免费开源低代码平台的使用…...

qq音乐sign逆向

qq音乐sign参数逆向 1.概览 参数sign长度40 多次调试发现&#xff0c;前缀zzb不变 2.打日志 跟站发现是vpm&#xff0c;在apply调用打上日志断点&#xff1a; 连蒙带猜知道&#xff0c;最终字符串四部分构成&#xff0c;zzb 24DC2798 HI0TvE4tOMqzN4w88oZCjQ EE0A88FE 1.把…...

项目成功的关键要素:进度管理

在项目管理中&#xff0c;进度管理是决定项目成败的关键因素之一。它关乎项目能否在预定的时间范围内高效、准确地完成既定目标。 一、进度管理的重要性 1、时间控制&#xff1a;项目的成功往往与时间的把握息息相关。进度管理能够确保项目在既定的时间框架内有序进行&#x…...