php高级程序设计:模式、框架与测试算法与数据结构和B+tree排序算法工作准备的PHP进阶架构资料php测试框架
2022-03-08
算法和数据结构以及B+树排序算法
function quickSort($arr){
// 获取数组长度
$length = count($arr);
// 判断长度是否需要继续二分比较
if($length <= 1){
return $arr;
}
// 定义基准元素
$base = $arr[0];
// 定义两个空数组,用于存放和基准元素的比较后的结果
$left = [];
$right = [];
// 遍历数组
for ($i=1; $i < $length; $i++) {
// 和基准元素作比较
if ($arr[$i] > $base) {
$right[] = $arr[$i];
}else {
$left[] = $arr[$i];
}
}
// 然后递归分别处理left和right
$left = quickSort($left);
$right = quickSort($right);
// 合并
return array_merge($left,[$base],$right);
}
工作十二年准备的PHP进阶架构资料,如果你觉得有用,我会分享给你的
function bubbleSort($arr){
// 获取数组长度
$length = count($arr);
// 第一层循环控制冒泡轮次
for ($i=0; $i < $length-1; $i++) {
// 内层循环控制从第0个键值和后一个键值比较,每次冒出一个最大的数
for ($k=0; $k < $length-$i-1; $k++) {
if($arr[$k] > $arr[$k+1]){
$tmp = $arr[$k+1];
$arr[$k+1] = $arr[$k];
$arr[$k] = $tmp;
}
}
}
return $arr;
}
for ($i=0; $i < $length - 1; $i++) {
// 假设最小值的位置
$p = $i;
// 使用假设的最小值和其他值比较,找到当前的最小值
for ($j=$i+1; $j < $length; $j++) {
// $arr[$p] 是已知的当前最小值
// 判断当前循环值和已知最小值的比较,当发下更小的值时记录下键,并进行下一次比较
if ($arr[$p] > $arr[$j]) {
$p = $j; // 比假设的值更小
}
}
// 通过内部for循环找到了当前最小值的key,并保存在$p中
// 判断 日光当前$p 中的键和假设的最小值的键不一致增将其互换
if ($p != $i) {
$tmp = $arr[$p];
$arr[$p] = $arr[$i];
$arr[$i] = $tmp;
}
}
// 返回最终结果
return $arr;
}
计算机网络中TCP/UDP的区别是三向握手和四向挥手,为什么是三向握手和四向挥手
在 TCP/IP 协议中,TCP 协议提供可靠的连接服务。它使用三次握手来建立连接。三次握手完成后,客户端和服务器开始传输数据。简单来说:A和B建立TCP连接时,首先A向B发送SYN(同步请求),然后B回复SYN+ACK(同步请求响应),最后A回复ACK确认,这样就建立了TCP连接(三次握手)结束了。
在第一次握手中,客户端发送一个TCP SYN标志设置为1的数据包,表示客户端打算连接的服务器端口,以及初始化序列号,存储在序列中数据包头的编号字段。第二次握手服务器播放确认包响应,即SYN标志和ACK标志均为1,确认序号设置为客户端的ISN加1,即X+1第三次握手客户端发送再次确认包,SYN标志为0,ACK标志为1,并将服务器发送的序列号字段+1,放入确认字段发送给对方,并写入+1数据字段中的 ISN
TCP三向握手的简单解释:参考:
长连接和短连接
在真正的读写操作之前,TCP必须与TCP建立连接,需要四波,所以每次连接的建立都会消耗资源和时间。
双方收到发起连接请求的请求后,建立连接并发送消息响应读写完成。此时,双方中的任何一方都可以发起操作。一般是先发起操作,因为一般情况下,回复没有完成就会立即关闭连接。
所以短连接一般只在and之间传递一个读写操作,短连接的管理相对简单。现有的连接都是有用的连接,不需要额外的控制方法
对请求发起连接后,双方建立连接并发送消息响应一次读写完成,不关闭连接进行后续读写操作
短连接操作步骤:建立连接->数据传输->关闭连接长连接操作步骤:建立连接->数据传输->(保持连接)->数据传输->关闭连接
长连接可以节省更多的TCP建立和关闭操作,减少资源浪费,节省时间。它更适合经常请求资源进行长连接的客户端。短连接对于服务器来说管理起来相对简单。连接是有用的连接,不需要额外的控制手段
如果你看到这个,说明你是一个想要晋级的朋友,所以我准备了一个群。点击进入查看详细信息,我们为大家准备了进阶资料。希望对大家有帮助!
从在浏览器中输入域名到显示页面会发生什么设计模式
设计模式是一组重复的、众所周知的、分类的和分类的代码设计经验总结。设计模式用于可重用代码,使代码更容易被他人理解,并确保代码的可靠性。
单例模式
当您需要确保对象只有一个实例时,单例模式非常有用。它将对象的创建控制权交给了一个点网站开发,并且在任何时候都只存在一个应用程序实例。单例类不应在类外实例化。一个单例类应该有以下几个因素:
简单示例:
class Single
{
public static $_instance;
private function __construct()
{
}
private function __clone()
{
}
public static function getInstance()
{
if (!self::$_instance) {
self::$_instance = new self();
}
return self::$_instance;
}
public function sayHi()
{
echo "Hi \n";
}
}
$single = Single::getInstance();
$single->sayHi();
工厂模式
工厂模式解决了如何在没有new的情况下创建实例对象
工厂模式是一个有一些方法为你创建对象的类,你可以使用工厂类来创建对象,而无需使用new。这样,如果你想改变你创建的对象的类型,你只需要改变工厂,所有使用工厂的代码都会自动改变。
工厂模式经常和接口一起使用,这样应用程序就不需要知道这些实例化的类的具体细节,只要工厂返回一个支持某个接口的类,就可以方便地使用。
简单示例:
/**
* 抽象出一个人的接口
* Interface Person
*/
interface Person
{
public function showInfo();
}
/**
* 一个继承于抽象人接口的学生类
* Class Student
*/
class Student implements Person
{
public function showInfo()
{
echo "这是一个学生 \n";
}
}
/**
* 一个继承于抽象人接口的老师类
* Class Teacher
*/
class Teacher implements Person
{
public function showInfo()
{
echo "这是一个老师 \n";
}
}
/**
* 人类工厂
* Class PersonFactory
*/
class PersonFactory
{
public static function factory($person_type)
{
// 将传入的类型首字母大写
$class_name = ucfirst($person_type);
if(class_exists($class_name)){
return new $class_name;
}else{
throw new Exception("类:$class_name 不存在",1);
}
}
}
// 需要一个学生
$student = PersonFactory::factory('student');
echo $student->showInfo();
// 需要一个老师的时候
$teacher = PersonFactory::factory('teacher');
echo $teacher->showInfo();
缓存相关的和之间有什么区别?缓存字符串最经典的使用场景有哪些?作为缓存层,作为存储层,大部分请求的数据都是从缓存中获取的。因为它支持高并发,所以通常可以使用缓存。起到加速读写、减轻后端压力的作用。许多应用程序将计数器用作技术的基本工具。可以实现快速技术和查询缓存的功能。共享是考虑到负载均衡。分布式服务将平衡用户信息对不同服务器的访问。用户刷新访问权限后,需要重新登录。为了避免这个问题,可以集中管理用户。在这种模式下,只有保证高可用性和可扩展性,每次获取用户更新或查询登录信息时,都会直接从中获取限速。出于安全考虑,用户每次登录时都会被要求输入手机验证码。为了防止频繁访问短信界面,系统会限制用户每分钟获取验证码的频率
哈希结构比字符串序列化缓存信息更直观,更新操作更方便。
消息队列+命令的组合可以实现阻塞队列。生产者客户端从列表左侧插入元素,多个消费者客户端使用命令阻塞来抓取列表末尾的元素。多客户端保证消费负载均衡的高可用。技巧列表 +lpop=() +rpop=() += ( set) += ( )
是单线程的吗?为什么
因为 CPU 不是瓶颈,所以瓶颈很可能是机器内存或网络带宽。由于单线程易于实现且CPU不会成为瓶颈,因此长期采用单线程方案是顺理成章的。
当然单个进程不能使用多个核心,但它不是一个计算密集型的服务。如果单核性能不够,可以多开几个进程。
部署方式、主从、集群
参考文章:
哨兵模式
参考文章:
持久化策略
参考文章:
队列和栈的区别():是一个线性列表,只能在表的一端插入,在另一端删除。 ():是一个线性列表,仅限于在列表的一端进行插入和删除操作。
队列:先进先出:先进先出
队列:根据地址指针遍历,可以从头遍历,也可以从尾遍历,但不能同时遍历。没有必要开辟空间。因为在遍历过程中不影响数据结构,所以遍历速度更快。栈:数据只能从栈顶取,也就是最先进入栈底php高级程序设计:模式、框架与测试,需要遍历整个栈才能取出,遍历数据的同事需要开辟临时空间让微数据在遍历之前保持数据的一致性。
PHP基本双引号和单引号的区别
GET和POST提交方式的区别
如何获取客户端的真实ip $[''] 或('') 可以用() 转换成数字和。区别在于无条件包含php高级程序设计:模式、框架与测试,即如果添加一个进程,不管条件成立与否,都会先执行。当文件不存在或无法打开时,会提示错误,程序执行会以返回值终止,但不是(可能是速度的原因),如果包含的文件不存在网站制作,则会报错会提示,但程序会继续执行。注意:被包含的文件不存在或者语法错误是致命的,这不是AJAX的优势所在。 Ajax是一种异步传输技术,可以通过实现实现,也可以通过框架实现局部刷新,减少程序在开发中,如何提高程序的运行效率
与
的区别
和的区别
数据库三范式
主键、外键和索引的区别
堆和栈的区别 栈是编译时分配的内存空间,所以你的代码必须对栈的大小有明确的定义;堆是程序运行过程中动态分配的内存空间。运行时确定要分配的堆内存量。 PHP 包管理器和自动加载规范
学习地址:
.json 中的自动加载映射
目前 PSR-0 自动加载、PSR-4 自动加载、生成和导入都支持,PSR-4 是首选方法,因为它更易于使用。
PHP框架相关
是一套简洁优雅的PHP Web开发框架(PHP Web)。它可以让你摆脱意大利面条般的凌乱代码;它可以帮助您构建一个完美的网络应用程序,并且每一行代码都可以简洁而富有表现力。
由于底层的深度封装,你可能需要先了解什么是依赖注入,什么是服务容器。关于这两点,我整理了以下两个链接,一个是(框架作者)写的就是依赖注入,另一个是深入研究的依赖注入容器(是我翻译的国外大神)
什么是依赖注入容器深入研究依赖注入
希望以上内容对您有所帮助。很多人在进阶的时候会遇到一些问题和瓶颈。写太多业务代码没有方向感。我不知道从哪里开始改进。我整理了一些资料。 ,包括但不限于:分布式架构、高扩展性、高性能、高并发、服务器性能调优、TP6、YII2、、、、、优化、脚本、微服务等高级知识点干货你需要的都可以免费分享给大家,有需要可以点击查看。
如果你喜欢我的文章,请关注我,持续更新.....