PHP面试问题与简答

问题与简答

PHP 篇

echo、print、print_r、var_dump 区别

echoprint是语言结构、print_rvar_dump是普通函数

  • echo:输出一个或多个字符串

  • print:输出字符串

  • print_r:打印关于变量的易于理解的信息

  • var_dump:打印关于变量的易于理解的信息(带类型)

拓展阅读 《echo、print、print_r、var_dump区别》

单引号和双引号的区别

双引号可以被分析器解析,单引号则不行

isset 和 empty 的区别

isset:检测变量是否已设置并且非 NULL

empty:判断变量是否为空,变量为 0/false 也会被认为是空;变量不存在,不会产生警告

static、self、$this 的区别

static:static 可以用于静态或非静态方法中,也可以访问类的静态属性、静态方法、常量和非静态方法,但不能访问非静态属性

self:可以用于访问类的静态属性、静态方法和常量,但 self 指向的是当前定义所在的类,这是 self 的限制

t h i s :指向的是实际调用时的对象,也就是说,实际运行过程中,谁调用了类的属性或方法, this:指向的是实际调用时的对象,也就是说,实际运行过程中,谁调用了类的属性或方法, this:指向的是实际调用时的对象,也就是说,实际运行过程中,谁调用了类的属性或方法,this 指向的就是哪个对象。但 $this 不能访问类的静态属性和常量,且 $this 不能存在于静态方法中

include、require、include_once、require_once 的区别

require 和 include 几乎完全一样,除了处理失败的方式不同之外。require 在出错时产生 E_COMPILE_ERROR 级别的错误。换句话说将导致脚本中止而 include 只产生警告(E_WARNING),脚本会继续运行

include_once 语句在脚本执行期间包含并运行指定文件。此行为和 include 语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含。如同此语句名字暗示的那样,只会包含一次

常见数组函数

array_count_values — 统计数组中所有的值

array_flip — 交换数组中的键和值

array_merge — 合并一个或多个数组

array_multisort — 对多个数组或多维数组进行排序

array_pad — 以指定长度将一个值填充进数组

array_pop — 弹出数组最后一个单元(出栈)

array_push — 将一个或多个单元压入数组的末尾(入栈)

array_rand — 从数组中随机(伪随机)取出一个或多个单元

array_keys — 返回数组中部分的或所有的键名

array_values — 返回数组中所有的值

count — 计算数组中的单元数目,或对象中的属性个数

sort — 对数组排序

Cookie 和 Session

Cookie:PHP 透明的支持 HTTP cookie 。cookie 是一种远程浏览器端存储数据并以此来跟踪和识别用户的机制

Session:会话机制(Session)在 PHP 中用于保持用户连续访问Web应用时的相关数据

预定义变量

对于全部脚本而言,PHP 提供了大量的预定义变量

超全局变量 — 超全局变量是在全部作用域中始终可用的内置变量

$GLOBALS — 引用全局作用域中可用的全部变量
$_SERVER — 服务器和执行环境信息
$_GET — HTTP GET 变量
$_POST — HTTP POST 变量
$_FILES — HTTP 文件上传变量
$_REQUEST — HTTP Request 变量
$_SESSION — Session 变量
$_ENV — 环境变量
$_COOKIE — HTTP Cookies
$php_errormsg — 前一个错误信息
$HTTP_RAW_POST_DATA — 原生POST数据
$http_response_header — HTTP 响应头
$argc — 传递给脚本的参数数目
$argv — 传递给脚本的参数数组
  • 超全局变量

PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们

超全局变量: G L O B A L S 、 GLOBALS、 GLOBALS_SERVER、 _ G E T 、 \_GET、 _GET_POST、 _ F I L E S 、 \_FILES、 _FILES_COOKIE、 _ S E S S I O N 、 \_SESSION、 _SESSION_REQUEST、$_ENV

传值和传引用的区别

传值导致对象生成了一个拷贝,传引用则可以用两个变量指向同一个内容

构造函数和析构函数

构造函数:PHP 5 允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作

析构函数:PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行

魔术方法

__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke() 等方法在 PHP 中被称为"魔术方法"(Magic methods)

public、protected、private、final 区别

对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问

PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承

客户端/服务端 IP 获取,了解代理透传 实际IP 的概念

客户端IP: $_SERVER[‘REMOTE_ADDR’]

服务端IP: $_SERVER[‘SERVER_ADDR’]

客户端IP(代理透传): $_SERVER[‘HTTP_X_FORWARDED_FOR’]

类的静态调用和实例化调用

  • 占用内存

静态方法在内存中只有一份,无论调用多少次,都是共用的

实例化不一样,每一个实例化是一个对象,在内存中是多个的

  • 不同点

静态调用不需要实例化即可调用

静态方法不能调用非静态属性,因为非静态属性需要实例化后,存放在对象里

静态方法可以调用非静态方法,使用 self 关键字。php 里,一个方法被 self:: 后,自动转变为静态方法

调用类的静态函数时不会自动调用类的构造函数

PHP 不实例化调用方法

静态调用、使用 PHP 反射方式

php.ini 配置选项

  • 配置选项
名字默认备注
short_open_tag“1”是否开启缩写形式(<? ?>)
precision“14”浮点数中显示有效数字的位数
disable_functions“”禁止某些函数
disable_classes“”禁用某些类
expose_php“”是否暴露 PHP 被安装在服务器上
max_execution_time30最大执行时间
memory_limit128M每个脚本执行的内存限制
error_reportingNULL设置错误报告的级别 E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
display_errors“1”显示错误
log_errors“0”设置是否将错误日志记录到 error_log 中
error_logNULL设置脚本错误将被记录到的文件
upload_max_filesize“2M”最大上传文件大小
post_max_size“8M”设置POST最大数据限制
php -ini | grep short_open_tag //查看 php.ini 配置
  • 动态设置
ini_set(string $varname , string $newvalue);ini_set('date.timezone', 'Asia/Shanghai'); //设置时区
ini_set('display_errors', '1'); //设置显示错误
ini_set('memory_limit', '256M'); //设置最大内存限制

php-fpm.conf 配置

名称默认备注
pidPID文件的位置
error_log错误日志的位置
log_levelnotice错误级别 alert:必须立即处理、error:错误情况、warning:警告情况、notice:一般重要信息、debug:调试信息
daemonizeyes设置 FPM 在后台运行
listenip:port、port、/path/to/unix/socket设置接受 FastCGI 请求的地址
pmstatic、ondemand、dynamic设置进程管理器如何管理子进程
request_slowlog_timeout‘0’慢日志记录阀值
slowlog慢请求的记录日志

502、504 错误产生原因及解决方式

502

502 表示网关错误,当 PHP-CGI 得到一个无效响应,网关就会输出这个错误

  • php.ini 的 memory_limit 过小
  • php-fpm.conf 中 max_children、max_requests 设置不合理
  • php-fpm.conf 中 request_terminate_timeout、max_execution_time 设置不合理
  • php-fpm 进程处理不过来,进程数不足、脚本存在性能问题
504

504 表示网关超时,PHP-CGI 没有在指定时间响应请求,网关将输出这个错误

  • Nginx+PHP 架构,可以调整 FastCGI 超时时间,fastcgi_connect_timeout、fastcgi_send_timeout、fastcgi_read_timeout
500

php 代码问题,文件权限问题,资源问题

503

超载或者停机维护

如何返回一个301重定向

header('HTTP/1.1 301 Moved Permanently');
header('Location: https://blog.maplemark.cn');

PHP 与 MySQL 连接方式

MySQL
$conn = mysql_connect('127.0.0.1:3306', 'root', '123456');
if (!$conn) {die(mysql_error() . "\n");
}
mysql_query("SET NAMES 'utf8'");
$select_db = mysql_select_db('app');
if (!$select_db) {die(mysql_error() . "\n");
}
$sql = "SELECT * FROM `user` LIMIT 1";
$res = mysql_query($sql);
if (!$res) {die(mysql_error() . "\n");
}
while ($row = mysql_fetch_assoc($res)) {var_dump($row);
}
mysql_close($conn);
MySQLi
$conn = @new mysqli('127.0.0.1:3306', 'root', '123456');
if ($conn->connect_errno) {die($conn->connect_error . "\n");
}
$conn->query("set names 'utf8';");
$select_db = $conn->select_db('user');
if (!$select_db) {die($conn->error . "\n");
}
$sql = "SELECT * FROM `user` LIMIT 1";
$res = $conn->query($sql);
if (!$res) {die($conn->error . "\n");
}
while ($row = $res->fetch_assoc()) {var_dump($row);
}
$res->free();
$conn->close();
PDO
$pdo = new PDO('mysql:host=127.0.0.1:3306;dbname=user', 'root', '123456');
$pdo->exec("set names 'utf8'");
$sql = "SELECT * FROM `user` LIMIT 1";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(1, 1, PDO::PARAM_STR);
$rs = $stmt->execute();
if ($rs) {while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {var_dump($row);}
}
$pdo = null;

MySQL、MySQLi、PDO 区别

MySQL
  • 允许 PHP 应用与 MySQL 数据库交互的早期扩展
  • 提供了一个面向过程的接口,不支持后期的一些特性
MySQLi
  • 面向对象接口
  • prepared 语句支持
  • 多语句执行支持
  • 事务支持
  • 增强的调试能力
PDO
  • PHP 应用中的一个数据库抽象层规范
  • PDO 提供一个统一的 API 接口,无须关心数据库类型
  • 使用标准的 PDO API,可以快速无缝切换数据库

数据库持久连接

把 PHP 用作多进程 web 服务器的一个模块,这种方法目前只适用于 Apache。

对于一个多进程的服务器,其典型特征是有一个父进程和一组子进程协调运行,其中实际生成 web 页面的是子进程。每当客户端向父进程提出请求时,该请求会被传递给还没有被其它的客户端请求占用的子进程。这也就是说当相同的客户端第二次向服务端提出请求时,它将有可能被一个不同的子进程来处理。在开启了一个持久连接后,所有请求 SQL 服务的后继页面都能够重用这个已经建立的 SQL Server 连接。

代码执行过程

PHP 代码 => 启动 php 及 zend 引擎,加载注册拓展模块 => 对代码进行词法/语法分析 => 编译成opcode(opcache) => 执行 opcode

PHP7 新增了抽象语法树(AST),在语法分析阶段生成 AST,然后再生成 opcode 数组

base64 编码原理

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ip2long 实现

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

124.205.30.150=2093817494list($p1,$p2,$p3,$p4) = explode(',','124.205.30.150');$realNum = $p1<<24+$p2<<16+$p3<<8+$p4;

MVC 的理解

MVC 包括三类对象。模型 Model 是应用对象,视图 View 是它在屏幕上的表示,控制器 Controller 定义用户界面对用户输入的响应方式。不使用 MVC,用户界面设计往往将这些对象混在一起,而 MVC 则将它们分离以提高灵活性和复用性

主流 PHP 框架特点

Laravel

易于访问,功能强大,并提供大型,强大的应用程序所需的工具

  • 简单快速的路由引擎
  • 强大的依赖注入容器
  • 富有表现力,直观的数据库 ORM
  • 提供数据库迁移功能
  • 灵活的任务调度器
  • 实时事件广播
Symfony
  • Database engine-independent
  • Simple to use, in most cases, but still flexible enough to adapt to complex cases
  • Based on the premise of convention over configuration–the developer needs to configure only the unconventional
  • Compliant with most web best practices and design patterns
  • Enterprise-ready–adaptable to existing information technology (IT) policies and architectures, and stable enough for long-term projects
  • Very readable code, with phpDocumentor comments, for easy maintenance
  • Easy to extend, allowing for integration with other vendor libraries
CodeIgniter
  • 基于模型-视图-控制器的系统
  • 框架比较轻量
  • 全功能数据库类,支持多个平台
  • Query Builder 数据库支持
  • 表单和数据验证
  • 安全性和 XSS 过滤
  • 全页面缓存
ThinkPHP
  • 采用容器统一管理对象
  • 支持 Facade
  • 更易用的路由
  • 注解路由支持
  • 路由跨域请求支持
  • 验证类增强
  • 配置和路由目录独立
  • 取消系统常量
  • 类库别名机制
  • 模型和数据库增强
  • 依赖注入完善
  • 支持 PSR-3 日志规范
  • 中间件支持
  • 支持 Swoole/Workerman 运行

对象关系映射/ORM

优点
  • 缩短编码时间、减少甚至免除对 model 的编码,降低数据库学习成本
  • 动态的数据表映射,在表结构发生改变时,减少代码修改
  • 可以很方便的引入附加功能(cache 层)
缺点
  • 映射消耗性能、ORM 对象消耗内存
  • SQL 语句较为复杂时,ORM 语法可读性不高(使用原生 SQL)

链式调用实现

类定义一个内置变量,让类中其他定义方法可访问到

异常处理

set_exception_handler — 设置用户自定义的异常处理函数

使用 try / catch 捕获

如何实现异步调用

$fp = fsockopen("blog.maplemark.cn", 80, $errno, $errstr, 30);
if (!$fp) {echo "$errstr ($errno)<br />\n";
} else {$out = "GET /backend.php  / HTTP/1.1\r\n";$out .= "Host: blog.maplemark.cn\r\n";$out .= "Connection: Close\r\n\r\n";fwrite($fp, $out);/*忽略执行结果while (!feof($fp)) {echo fgets($fp, 128);}*/fclose($fp);
}

多进程同时写一个文件

加锁、队列

PHP 进程模型,进程通讯方式,进程线程区别

消息队列、socket、信号量、共享内存、信号、管道

PHP 支持回调的函数,实现一个

array_map、array_filter、array_walk、usort

is_callable + callbacks + 匿名函数实现

发起 HTTP 请求有哪几种方式,它们有何区别

cURL、file_get_contents、fopen、fsockopen

php for while foreach 迭代数组时候,哪个效率最高

弱类型变量如何实现

PHP 中声明的变量,在 zend 引擎中都是用结构体 zval 来保存,通过共同体实现弱类型变量声明

PHP 拓展初始化

  • 初始化拓展
$ php /php-src/ext/ext_skel.php --ext
  • 定义拓展函数

zend_module_entry 定义 Extension name 编写 PHP_FUNCTION 函数

  • 编译安装
$ phpize $ ./configure $ make && make install

如何获取扩展安装路径

垃圾回收机制

引用计数器

Trait

自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait

yield 是什么,说个使用场景 yield、yield 核心原理是什么

一个生成器函数看起来像一个普通的函数,不同的是普通函数返回一个值,而一个生成器可以yield生成许多它所需要的值

traits 与 interfaces 区别 及 traits 解决了什么痛点

如何 foreach 迭代对象、如何数组化操作对象 $obj[key]、如何函数化对象 $obj(123);

Swoole 适用场景,协程实现方式

那你知道swoole的进程模型

PHP 数组底层实现 (HashTable + Linked list)

Copy on write 原理,何时 GC

如何解决 PHP 内存溢出问题

ZVAL

HashTable

PHP7 新特性

标量类型声明、返回值类型声明、通过 define() 定义常量数组、匿名类、相同命名空间类一次性导入

PHP7 底层优化

ZVAL 结构体优化,占用由24字节降低为16字节

内部类型 zend_string,结构体成员变量采用 char 数组,不是用 char*

PHP 数组实现由 hashtable 变为 zend array

函数调用机制,改进函数调用机制,通过优化参数传递环节,减少了一些指令

PSR 介绍,PSR-1, 2, 4, 7

Xhprof 、Xdebug 性能调试工具使用

字符串、数字比较大小的原理,注意 0 开头的8进制、0x 开头16进制

BOM 头是什么,怎么除去

3);

Swoole 适用场景,协程实现方式

那你知道swoole的进程模型

PHP 数组底层实现 (HashTable + Linked list)

Copy on write 原理,何时 GC

如何解决 PHP 内存溢出问题

ZVAL

HashTable

PHP7 新特性

标量类型声明、返回值类型声明、通过 define() 定义常量数组、匿名类、相同命名空间类一次性导入

PHP7 底层优化

ZVAL 结构体优化,占用由24字节降低为16字节

内部类型 zend_string,结构体成员变量采用 char 数组,不是用 char*

PHP 数组实现由 hashtable 变为 zend array

函数调用机制,改进函数调用机制,通过优化参数传递环节,减少了一些指令

PSR 介绍,PSR-1, 2, 4, 7

Xhprof 、Xdebug 性能调试工具使用

字符串、数字比较大小的原理,注意 0 开头的8进制、0x 开头16进制

BOM 头是什么,怎么除去

模板引擎是什么,解决什么问题、实现原理(Smarty、Twig、Blade)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/666745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

适合大学英语搜题的软件?如何选择一款好用的大学搜题工具? #职场发展#微信#学习方法

大学生必备的搜题工具&#xff0c;专业课本习题、电子版教材、考研资料、英语四六级等考试题目也能一并搜索&#xff0c;每道题目都有详细的讲解&#xff0c;每个都堪称大学神器。 1.颐博咨询 这是一个网站 找题好用的在线搜题站,快考不限次搜题助手,问题截图搜题软件,练题通…

【文本到上下文 #8】NLP中的变形金刚:解码游戏规则改变者

一、说明 欢迎来到我们对不断发展的自然语言处理 &#xff08;NLP&#xff09; 领域的探索的第 8 章。在本期中&#xff0c;我们将重点介绍一项重塑 NLP 格局的突破性创新&#xff1a;Transformers。在我们之前对 seq2seq 模型、编码器-解码器框架和注意力机制的讨论之后&#…

17.Golang channel的基本定义及使用

目录 概述实践无缓冲 channel代码结果 缓冲 channel代码结果 channel的关闭特点代码结果range代码结果 select channel代码结果 结束 概述 此篇文章介绍 channel 的用法 无缓冲 channel缓冲 channelchannel的关闭特点range channelselect channel 每一种&#xff0c;配上完整…

Macbook 安装金铲铲之战等 IOS 游戏

前言 Macbook 现在可以玩一下 IOS 系统上的游戏啦&#xff0c;以笔者的 M1 Pro 芯片为例 步骤 一、安装 PlayCover 推荐 Sonama 安装 Nightly 版本 官网地址&#xff1a; https://playcover.io/ Nightly: https://nightly.link/playcover/playcover/workflows/2.nightly_re…

c++入门学习⑤——对象模型和this指针

目录 前言&#xff1a; 成员变量和成员函数分开储存 ⭐ 注意&#xff1a; 案例&#xff1a; this指针的概念 介绍&#xff1a; 用途&#xff1a; 错误案例&#xff1a; 解决方案&#xff1a; 注意函数为什么用引用返回呢&#xff0c;如果用值返回&#xff0c;结果会产…

老师翻学生书包违法吗

作为一位老师&#xff0c;我们的职责是教育和引导学生&#xff0c;让他们成为有道德、有知识、有能力的人才。但是&#xff0c;我们有时会遇到一些问题&#xff0c;比如是否可以翻学生的书包。这个问题一直备受争议。 学生的个人隐私权是受到法律保护的。学生享有个人隐私权&a…

【漏洞复现】EduSoho教培系统 任意文件读取

该文章由掌控安全学院——1782814368投稿 【产品介绍】 EduSoho企培系统&#xff0c;基于EduSoho教育云PaaS平台的底层技术打造&#xff0c;专门为快速发展的企业提供一体化企业培训、企业内训组织解决方案&#xff0c;专注人才培养、专注组织建设&#xff0c;帮助企业构建学…

NIO Selector简介

1.Selector和Channel关系 Selector一般称为选择器&#xff0c;也叫多路复用器&#xff0c;NIO的核心组件&#xff0c;用于检查一个或多个Channel的状态是否处于可读、可写的状态。 2.可选择通道 &#xff08;1&#xff09;不是所有的channel都能被selector复用&#xff0c;…

LDRA Testbed软件静态分析_Jenkins持续集成_(2)配置邮件自动发送静态分析结果

系列文章目录 LDRA Testbed软件静态分析_操作指南 LDRA Testbed软件静态分析_自动提取静态分析数据生成文档 LDRA Testbed软件静态分析_Jenkins持续集成_(1)自动进行静态分析的环境搭建 LDRA Testbed软件静态分析_Jenkins持续集成_(2)配置邮件自动发送静态分析结果 LDRA Testb…

【劳德巴赫 Trace32 高阶系列 5 -- Trace32 JTAG Data.Load 与 Data.Save】

请阅读【Trace32 高阶系列 专栏导读】 文章目录 Data.Load.binaryData.SAVE.BinaryData.Load.binary 用于将二进制文件加载到目标系统的内存中。 Format: Data.LOAD.Binary <file> <address> | <range> [/<option>] <option>: SKIP <of…

基于python+控制台输出的学生信息管理系统

基于python控制台输出的学生信息管理系统 一、系统介绍二、效果展示三、其他系统实现四、获取源码 一、系统介绍 打印功能菜单、添加学生信息、删除学生信息、修改学生信息、显示学生信息、退出系统&#xff0c;并且需要接收用户的输入&#xff0c;在根据输入内容调用相应函数…

理解进程的一些知识准备

1. 认识冯诺依曼体系结构 计算机有很多的体系结构&#xff0c;但到如今&#xff0c;冯诺依曼体系结构变成了主流。 输入设备&#xff1a;话筒、键盘、摄像头、鼠标、磁盘、网卡… 输出设备&#xff1a;声卡、显示器、打印机、显卡、网卡、磁盘… 有的设备既能作为输入设备又能…

多播路由选择

目录 1 多播路由选择 1.1 转发多播数据报时使用三种方法 (1) 洪泛与剪除 RPB 的要点&#xff1a; 1.检查&#xff0c;转发 2.形成以源为根节点的多播转发树 3.剪枝与嫁接 (2) 隧道技术 (tunneling) (3) 基于核心的发现技术 1.2 几种多播路由选择协议 1 多播路由选择 …

docker 构建个人博客网站

1、项目地址 https://gitee.com/hhll/blog-hangliang.git 2、打包docker镜像并上传docker hub 【1】注册docker hub账号https://hub.docker.com/ 【2】在docker hub建对应的仓库 【3】登录docker hub并打包上传前后端镜像 sudo docker login -u xxxx 密码 xxxxxx 后端&am…

视频业务像素、带宽、存储空间计算

一、像素和分辨率 分辨率的单位通常是像素&#xff08;或点&#xff09;&#xff0c;用水平像素数乘以垂直像素数来表示。例如&#xff0c;一个分辨率为1920 x 1080的屏幕有1920个水平像素和1080个垂直像素。 总像素分辨率公式运算 例如 1920 x 10802073600总约200万 500W≈…

Makefile学习

C语言的编译过程 预处理&#xff08;Preprocessing&#xff09; -E是让编译器在预处理之后就退出&#xff0c;不进行后续编译过程&#xff1b;-o是指定输出文件名。 gcc -E hello.c -o hello.i编译&#xff08;Compilation&#xff09; 这里的编译不是指程序从源文件到二进制…

XUbuntu22.04之如何创建、切换多个工作区(二百零九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Android简单支持项目符号的EditText

一、背景及样式效果 因项目需要&#xff0c;需要文本编辑时&#xff0c;支持项目符号&#xff08;无序列表&#xff09;尝试了BulletSpan&#xff0c;但不是很理想&#xff0c;并且考虑到影响老版本回显等因素&#xff0c;最终决定自定义一个BulletEditText。 先看效果&…

异步解耦之RabbitMQ(二)_RabbitMQ架构及交换机

异步解耦之RabbitMQ(一)-CSDN博客 RabbitMQ架构 RabbitMQ是一个基于AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议的消息代理中间件&#xff0c;它通过交换机和队列实现消息的路由和分发。以下是RabbitMQ的架构图&#xff1a; Producer&#xff08;生产…

NAS系统折腾记 – Emby搭建家庭多媒体服务器

Emby简介 Emby是一款优秀的媒体服务器软件&#xff0c;致力于为用户提供丰富的多媒体体验。通过Emby&#xff0c;您可以方便地在家庭内的各种设备上观看您喜爱的电影、电视剧和其他视频内容。而且&#xff0c;Emby还具备强大的媒体管理功能&#xff0c;让您的影视资源井然有序…