欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP工程师必备知识整理

程序员文章站 2022-08-10 13:37:56
一、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和varc ......

一、http/https协议,tcp/ip协议,websocketsessioncookie

 

 

二、phpoop,thinkphp5,laravel

 

 

三、mysqlmemcacheredis

3.1  mysql面试题目

3.1.1 MySQL的复制原理以及流程

 

 

3.1.2 charvarchar的区别?

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

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

   * charvarchar跟字符编码也有密切联系,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=’FILETABLE’。

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

* log-query-not-using-indexes:

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

* log_slow_admin_statements:

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

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

  

 

3.1.4 索引的类型

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

* 唯一索引(UNIQUE

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

* 综合使用 => 复合索引

 

3.1.5

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

锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,出传统的计算资源(CPURAMI/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)前,会自动给涉及的所有表加读锁,在执行更新操作(updatedeleteinsert等)前,会自动给涉及的表加写锁,这个过程并不需要用于干预,因此用户一般不需要直接用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,使该连接发出的更新请求优先级降低。

* 通过指定INSERTUPDATEDELETE语句的LOW_PRIORITY属性,降低该语句的优先级。

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

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

 

 

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

Sphinx是一个基于SQL的全文检索引擎,可以结合MySQLPostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHPPythonPerlRuby等,同时为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

 

 

四、apachenginx

 

 

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