PHP工程师必备知识整理

时间:2021-11-21 14:59:08

一、http/https协议,tcp/ip协议,websocket,session,cookie

二、php:oop,thinkphp5,laravel

三、mysql、memcache、redis

3.1  mysql面试题目

3.1.1 MySQL的复制原理以及流程

3.1.2 char和varchar的区别?

* char用于存放固定长度的字符串,长度最大为255,比指定长度大的值将被截断,而比指定长度小的值将会用空格进行填补。

* varchar用于保存可变长度的字符串,长度最大为65535,只存储字符串实际需要的长度,它会增加一个额外字节来保存字符串本身的长度,varchar使用额外的1~2字节来存储值的长度。如果列的最大长度小于或等于255,则使用1字节,否则使用2字节。

* char和varchar跟字符编码也有密切联系,lantin1占用1个字节,gbk占用2个字节,utf8占用3个字节。

3.1.3 mysql慢查询日志

* Mysql的慢查询日志,顾名思义就是把执行时间超过设定值(默认10s)的SQL记录到日志中。这项功能需要手动开启,但是开启后会造成一定的性能损耗。

* 查看是否开启:show variables like ‘%slow_query_log%’;

* 开启慢查询:set global slow_query_log=1;

* my.cnf设置:

slow_query_log=1

long_query_time=10

slow_query_file=/path/mysql_slow.log

* log_outpout:

指定日志的存储方式。log_output=’FILE’标识日志存入文件,默认值是‘FILE’。log_output=’TABLE’表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中。

数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output=’FILE,TABLE’。

日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需要能获得更高的系统性能,建议优先记录到文件。

* log-query-not-using-indexes:

未使用索引的查询也被记录到慢查询日志中(可选项)。如果调优的话,建议开启这个选项。另外,开启了这个参数,其实使用full index scan的sql也会被记录到慢查询日志。

* log_slow_admin_statements:

表示是否将慢管理语句例如ANALYZE TABLE和ALTER TABLE等记录慢查询日志。

* 分析工具mysqldumpslow  -- 慢查询分析工具

3.1.4 索引的类型

* 主键索引,主键自动的为主索引(类型Primary)

* 唯一索引(UNIQUE)

* 全文索引(FULLTEXT)(只在MyISAM存储引擎支持,在内容系统中用的多,在全英文网站用的多。中文数据不常用,意义不大,国内全文索引通常使用sphinx来完成,全文索引只能在char、varchar、text字段创建)

* 综合使用 => 复合索引

3.1.5 锁

https://www.cnblogs.com/chenqionghe/p/4845693.html

锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,出传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。

概述

相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。MySQL大致可归纳为以下3种锁:

* 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

* 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

* 页面锁:开销和加锁时间介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发粒度一般。

Mysql表级锁的锁模式(MyISAM),有两种:表共享锁(读锁,Table Read Lock)和表独占写锁(Table Write Lock)。

* 对MyISAM的读操作,不会阻塞其他用户对同一表请求,但会阻塞对同一表的写请求;

* 对MyISAM的写操作,则会阻塞其他用户对同一表的读和写操作;

* MyISAM表的读操作和写操作之间,以及写操作之间都是串行的。

当一个线程获得对一个表的写锁后,只有持有锁线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止。

MySQL中的表锁兼容性

当前锁模式/是否兼容/请求锁模式

None

读锁

写锁

读锁

写锁

可见,对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;

对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写请求;

MyISAM表的读和写操作之间,以及写和写操作之间是串行的。

MyISAM表不会出现死锁的原因?

不管是显式加锁还是自动加锁,mysql会一次获得SQL语句所需要的全部锁。

一个session使用LOCK TABLE命令给表film_text加了读锁,这个session可以查询锁定表中的记录,但更新或访问其他表都会提示错误;

同时,另外一个session可以查询表中的记录,但更新就会出现锁等待。

当使用LOCK TABLE时,不仅需要一次锁定用到的所有表,而且,同一个表在SQL语句中出现多少次,就要通过与SQL语句中相同的别名锁多少次,否则也会出错。

如何加表锁?

MyISAM在执行查询语句(select)前,会自动给涉及的所有表加读锁,在执行更新操作(update、delete、insert等)前,会自动给涉及的表加写锁,这个过程并不需要用于干预,因此用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁。

并发锁

在一定条件下,MyISAM也支持查询和操作的并发进行。

MyISAM存储引擎有一个系统变量current_insert,专门用以控制其并发插入的行为,其值分别为0/1/2。

* 当concurrent_insert设置为0时,无论MyISAM的表数据文件中间是否存在因为删除而留下的空闲空间,不允许并发插入;

* 当concurrent_insert设置为1时,如果MyISAM允许在一个读表的同时,另一个进程从表尾插入记录。这也是MySQL的默认配置。

* 当concurrent_insert设置为2时,无论MyISAM表中有没有空闲空间,都允许在数据文件尾部并发插入记录。

可以利用MyISAM存储引擎的并发插入特性,来解决应用中对同一表查询和插入锁争用。例如,将concurrent_insert系统变量为2,总是允许并发插入;同时,通过定期在系统空闲时段执行OPTIONMIZE TABLE语句来整理空闲碎片,收到因删除记录而产生的中间空间。

MyISAM的锁调度

前面讲过,MyISAM存储引擎的读和写锁是互斥的,读操作是串行的。那么,一个进程请求某个MyISAM表的读锁,同时另一个进程也请求同一表的写锁,MySQL如何处理?

答案是写进程先获得锁。不仅如此,即使读进程先请求到锁等待队列,写请求后到,写锁也会插入到读请求之前!这事因为MySQL认为写请求一般比读请求重要。这也正式MyISAM表不太适合于有大量更新操作和查询操作应用的原因。因为,大量的更新操作会造成查询操作很难获得读锁,从而可能用于阻塞。这种情况有时可能会变得非常糟糕!幸好我们可以通过一些设置来调节MyISAM的调度行为。

* 通过指定启动参数low-priority-updates,使MyISAM引擎默认给予读请求以优先的权利。

* 通过执行命令SET LOW_PRIORITY_UPDATE=1,使该连接发出的更新请求优先级降低。

* 通过指定INSERT、UPDATE、DELETE语句的LOW_PRIORITY属性,降低该语句的优先级。

虽然上面3中方法都是要么更新优先,要么查询优先的方法,但是还是可以用其来解决查询相对重要的应用(如用户登录系统)中,读锁等待严重的问题。

另外,MySQL也提供了一种折中的办法来调节读写冲突。即给系统参数max_write_lock_count设置一个合适的值,当一个表的读锁达到这个值后,mysql便暂时将写请求的优先级降低,给读进程一定获得锁的机会。

3.1.6 Sphinx(斯芬克司,全文检索引擎)

Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP、Python、Perl、Ruby等,同时为MySQL也设计了一个存储引擎插件。

Sphinx单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建索引的速度为:创建100万条记录的索引只需3~4分钟,创建1000万记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需要几十秒。

Sphinx的主要特性包括:

高速索引(在新款CPU上,近10MB/秒);

高速搜索(2-4G的文本量中平均查询速度不到0.1秒);

高可用性(单CPU上最大支持100GB的文本,100M文档);

提供良好的相关性排名,支持分布式搜索;

提供文档摘要生成;

提供从MySQL内部的插件式存储引擎上搜索,支持布尔、短语、和近义词查询;

支持每个文档多个全文检索域(默认最大32个);

支持每个文档多属性;

支持断词;

支持单字节编码与UTF-8编码。

3.1.7

3.1.8

3.1.9

3.1.10

四、apache、nginx

五、shell脚本,常用linux服务器维护命令