订单号生成规则
function build_order_no() {
return date('Ymd').substr(implode(NULL,array_map('ord',str_split(substr(uniqid(),7,13),1))),0,8);
}
var_dump(build_order_no());
Linux 常用命令 https://www.cnblogs.com/hanling/p/10213865.html
1.GET和POST区别? HTTP请求方式 GET POST PUT DELETE?
-
GET在浏览器回退时是无害的,而POST会再次提交请求。
-
GET产生的URL地址可以被收藏,而POST不可以。
-
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
-
GET请求只能进行url编码,而POST支持多种编码方式。
-
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
-
GET请求在URL中传送的参数是有长度限制的,而POST么有。
-
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
-
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
-
GET参数通过URL传递,POST放在Request body中。
(以上标准答案参考自w3schools)
GET和POST都是TCP连接。
GET产生一个TCP数据包;POST产生两个TCP数据包。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。
https://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html
- GET - 从指定的资源请求数据。
- POST - 向指定的资源提交要被处理的数据
HTTP协议包含:通用头域、请求消息、响应消息和主体信息。
2.nginx和Apache区别
最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步 的,多个连接(万级别)可以对应一个进程。
Nginx本身就是一个反向代理服务器;Nginx支持7层负载均衡;其他的当然, Nginx可能会比apache支持更高的并发。
Apache在处理动态有优势,Nginx并发性比较好,CPU内存占用低,如果rewrite 频繁,那还是Apache吧
3.cookie和session区别?禁用cookie后,session还能用吗?如何共享分布式集群下的session?
https://www.cnblogs.com/hanling/p/9996934.html
cookie:存储在浏览器中,有大小限制,相对不安全,会泄露用户信息
session:存储在服务器端,无大小限制,相对安全,session_id存储在cookie中
禁用后,session可以存储在URL中. session_name(); SID;
session.save_handler 存储位置 file redis memcache
4.PHP垃圾回收机制?运行原理?PHP-FPM是什么?如何确定一台机器应该开启多少个PHP进程?
垃圾回收机制:引用计数。
每个php变量存在一个叫"zval"的变量容器中。一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息。第一个是"is_ref",是个bool值,用来标识这个变量是否是属于引用集合(reference set)。通过这个字节,php引擎才能把普通变量和引用变量区分开来,由于php允许用户通过使用&来使用自定义引用,zval变量容器中还有一个内部引用计数机制,来优化内存使用。第二个额外字节是"refcount",用以表示指向这个zval变量容器的变量(也称符号即symbol)个数。所有的符号存在一个符号表中,其中每个符号都有作用域(scope),那些主脚本(比如:通过浏览器请求的的脚本)和每个函数或者方法也都有作用域。
https://zhuanlan.zhihu.com/p/30636538
PHP-FPM是一种进程管理工具。fastcgi是web服务器与处理程序之间的通讯协议。
变量的自动回收
在php中 除了 array
和object
类型的变量,其余大部分是自动回收
php 普通变量的回收和 该变量的引用次数有关。
写时复制(Copy On Write:COW),简单描述为:如果通过赋值的方式赋值给变量时不会申请新内存来存放新变量所保存的值,而是简单的通过一个计数器来共用内存,只有在其中的一个引用指向变量的值发生变化时,才申请新空间来保存值内容以减少对内存的占用。 - TPIP 写时复制
这时候,我们unset
操作时refcount 由2变为1,因为有内部引用指向 $a,所以在外部 其所占用的空间并不会被销毁。
然后我们的外部引用已经被中断了,我们也不能使用它。它就成了一个“孤儿”,在c语言中叫做野指针。在php中叫做循环引用。内存泄漏。想要销毁变量的话,只能等 php脚本结束。
循环引用造成的内存泄漏
为了清理这些垃圾,引入了两个准则
- 如果引用计数减少到零,所在变量容器将被清除(free),不属于垃圾
- 如果一个zval 的引用计数减少后还大于0,那么它会进入垃圾周期。其次,在一个垃圾周期中,通过检查引用计数是否减1,并且检查哪些变量容器的引用次数是零,来发现哪部分是垃圾。
循环引用基本上只会出现在 数组和对象中,对象是因为它的本身就是引用
object和array的回收过程
php7的垃圾回收包含两个部分,一个是垃圾收集器,一个是垃圾回收算法。
垃圾收集器,把刚刚提到的,可能是垃圾的元素收集到回收池中 也就是把变量的 zend_refcount
的信息 放在回收池中。 当回收池的值达到一定额度了,会进行统一处理。
处理的过程呢,就比较简单。
遍历回收池中的每一个变量,根据每一个变量,再遍历每一个成员,如果成员还有嵌套的话继续遍历。然后把所有成员的 做模拟的 refcount -1。如果此时外部的变量的 引用次数为 0 。那么可以视为垃圾,清楚。如果大于0,那么恢复引用次数,并从垃圾回收池中取出。
垃圾回收的原理
如果你这个变量不是垃圾,那么它的所有成员变量的引用减一之后,必然不会是总变量的引用为0。
https://segmentfault.com/a/1190000015941080
http://www.laruence.com/2018/04/08/3170.html
https://my.oschina.net/shyl/blog/517656
5.你了解的设计模式是什么?
https://designpatternsphp.readthedocs.io/zh_CN/latest/Creational/README.html
单例模式:instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例
工厂模式:
观察者模式:
6.myisam和innodb的区别以及应用?索引结构如何实现?
https://www.cnblogs.com/hanling/p/9972747.html
myisam:表锁、不支持外键、不支持事务,支持全文检索(英文),B+树,索引存储为 物理内存地址
innodb:行锁,支持外键,支持事务,不支持全文检索,B+树,索引存储方式不同 主键ID值 以及数据
7.如何优化mysql?
数据表数据类型的优化;(字段类型和字段长度)
SQL语句的优化; (子查询用关联查询代替;limit 所需条数;group by order by null;)
索引优化;(主键索引、唯一索引、普通索引、联合索引 最左原则、外建索引、全文索引)
存储引擎的优化;(myisam innodb)
数据表结构的优化; (冗余字段,分库分表,分区)
服务器架构的优化;(读写分离;主从;负载均衡;双主热备)
8.mysql的联合索引?有什么特性?什么时候考虑建立联合索引?
多个字段 最左原则,abc => a,ab,abc,ac
9.深复制和浅复制;
变量有值传递和引用传递,其实,对象也类似如此,所以,对象有浅复制和深复制之说。
10.简述一下数据库的分表方式以及应用场景。
按时间、按主键ID取模或取余、热数据与冷数据
11.简述一下nosql以及应用场景。
redis:
mongodb:
12.设计一个短地址方案,写一个函数或思路。
网上比较流行的算法有两种 自增序列算法、 摘要算法
https://segmentfault.com/a/1190000012088345
https://blog.csdn.net/xyz_lmn/article/details/8057270
13.有一个100G的文件,如何统计某个关键词出现的次数。
substr_count() 函数计算子串在字符串中出现的次数。
grep -o 'text' text.txt | wc -l ( | wc -l是统计次数 )
strstr — 查找字符串的首次出现
stristr strstr不区分大小写的版本
strpos -查找字符串首次出现的位置
substr ( string $string , int $start [, int $length ] )
strrchr ( string $haystack , mixed $needle )
strripos -计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)
stripos -查找字符串首次出现的位置(不区分大小定)
strrpos -计算指定字符串在目标字符串中最后一次出现的位置
14.HTTP状态码? 详细的状态码解析 https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/5053660?fr=aladdin
(大部分情况都是代码 或者配置有问题 影响的)
HTTP状态码主要分为5类:以1开头的代表请求已被接受,需要继续处理;以2开头的代表请求已成功被服务器接收、理解、并接受;以3开头的代表需要客户端采取进一步的操作才能完成请求;以4开头的代表了客户端看起来可能发生了错误,妨碍了服务器的处理;以5开头的代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。
200 成功;
201;
301 永久重定向;
302 临时重定向;
304:客户端的缓存资源是最新的,要客户端使用缓存。
400
403 禁止(服务器拒绝响应);
404 找不到资源;
500 服务器内部错误;
502 cgi或fastcgi通信错误,php超时;
503:服务器目前无法为请求提供服务;
504 服务器超时 fastcgi 占满或其他原因 复杂 nginx 错误常见
(建议本地环境使用nginx 会出现的错误问题比较多 有助于以后处理服务器问题 解决问题 nginx 日志文件 以及php-fpm 日志文件 学会在linux 上查找文件 搜索文件 通常日志文件会比较大 学会使用搜索 过滤查看日志文件 很有必要)
15.简述长连接和短连接的特点以及应用场景,PHP如何选择?
16.web开发中一般有哪些安全问题并简述一下原理和处理方式。防御方式以及函数
XSS:跨站脚本攻击
SQL注入:由于服务端没有做处理 ,直接插入数据库。
CSRF:
DOOS:
17.使用过哪些PHP框架?简述一下各自的优缺点?路由机制?
18.简述一下闭包?匿名函数?
19.PHP有关的数据函数?
array_push
array_pop
array_shift
array_unshift
array_diff
array_interest
array_merge
array_splice
array_muiltysort
20.Linux 下如何把文件的权限设定成777,其中每个777代表什么?
chmod 777 文件
7 所属者 读写执行
7 所属组 读写执行
7 其他 读写执行
21.读写一个函数,实现以下功能,字符串open_door替换成OpenDoor,make_by_id替换成 MakeById.
ucfirst — 将字符串的首字母转换为大写
ucwords() - 将字符串中每个单词的首字母转换为大写
lcfirst() - 使一个字符串的第一个字符小写
strtolower() - 将字符串转化为小写
strtoupper() - 将字符串转化为大写
方法一:
function firstWords($str) {
return str_replace(' ','',ucwords(str_replace('_',' ',$str)));
}
echo firstWords('make_by_id');
方法二:
function firstWords($str) {
return str_replace(' ','',ucwords(preg_replace('/\_/i', ' ', $str)));
}
echo firstWords('make_by_id');
方法三:
function firstWords($str) {
$arr = explode('_',$str);
foreach ($arr as $key => $val) {
$arr[$key] = ucwords($val);
}
return implode('',$arr);
}
echo firstWords('make_by_id');
方法四: 数组形式
function firstWords($str) {
if(is_array($str)) {
$arr = str_replace('_',' ',$str);
foreach ($arr as $key => $val) {
$arr[$key] = str_replace(' ','',ucwords($val));
}
return $arr;
}
}
var_dump(firstWords(['make_by_id','hello_world','open_eye']));
22.字符串翻转 不用内置函数
https://www.cnblogs.com/hanling/p/9955222.html
23.写出最少5个PHP魔术函数,并说明用处。
__construct()具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。
Note: 如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用parent::__construct()。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话)。
24.简述echo 0 == "a0" ? 1 : 2; 结果 1 true
25.请简述left join ,right join ,inner join,corss join,
26.请描述数据库中事务是什么?以及事务常见的一些问题以及相应的解决方案?隔离级别?
27.写10个linux常用命令?
cd more find mkdir chmod grep less top tail header ps tar ll ls whereis which locate make make install wget su awk
28.nginx 将所有到 /api/xxx 的请求重写到 /api.php/xxx
29.用PHP打印出前一天的时间,格式是 2018-12-1 10:22:11;
date('Y-m-d H:i:s',strtotime('-1 days'));
30.echo print print_r 区别
31.写一个函数,从URL中取出文件的扩展名。例如:http://www.sina.com/abc/de/fg.php?id=1, 需要取出PHP或.php
32.PHP5的权限控制修饰符
public 公共的 任何地方都可以调用
private 私有的 只能自己调用,不能被继承也不能被重写,子类也不可以使用。
protected 受保护的 只有父类或子类可以使用。
33.哪些函数可以打开一个文件,以对文件进行读和写操作?列举出你知道的。
34.MVC的理解?
35.论坛中的无限极分类的 实现原理?
36.SVN和GIT的区别?
SVN 集中式 无网络不能提交或拉取数据
GIT 分布式 有无网络都可以commit add ,提交的数据会放在暂存区中,tag打包 标签
37.对于大流量的网站,您采用什么样的方法来解决访问量问题?
38.请写一个匹配IP地址的正则表达式。
39.描述你所使用的数据接口实现方式,以及接口校验的方法。
40.如何分析一条sql语句的性能?
41.数据表设计原则,常见的分库分表策略?
42.微信朋友圈数据结构是如何设计的?
43.如何实现负载均衡,多服务器之前如何共享session?
44.常用排序算法有哪些?时间复杂度有什么差异?写出一种排序算法的具体实现代码?
45.HTTP 三次握手 四次挥手
1、TCP/IP连接
HTTP的工作过程:当我们请求一个超链接时,HTTP就开始工作了,客户端先发送一个请求到服务器,请求内容包括:协议版本号、请求地址、请求方式、请求头和请求参数;服务器收到请求后做相应的处理,并将响应数据返回到客户端,响应内容包括:协议版本号、状态码和响应数据。前端根据响应数据做相应的处理,就是最终我们看到的内容。这些过程是HTTP自动完成的,我们只是输入或点击请求地址,然后查看前端给我们展示的内容。更多关于HTTP协议的介绍请参考:http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html 很详细的讲解
46.一个网站从前端到后端有哪些可以缓存的地方?
CSS JS 图片服务器 CDN缓存,减少HTTP请求,数据缓存,静态化页面,
47.include 和require 、require_once 区别?
include在引入不存文件时产生一个警告且脚本还会继续执行. 如果no.php文件不存在,echo '123'这句是可以继续执行的. warning
require则会导致一个致命性错误且脚本停止执行。如果no.php文件不存在,echo '123'这句是不可以继续执行的. error
48.mysql_fetch_row() 和 mysql_fetch_array()区别?
row 获取一行数据
array 获取所有数据
49.用PHP写出显示客户端IP与服务器IP的代码?
客户端:<?=$_SERVER['REMOTE_ADDR']?>
服务器端:<?=$_SERVER['SERVER_ADDR']?>
51.mysql有哪几种数据引擎,有何区别?
52.写一个函数抓取远程图片并放在本地
53.写一个函数验证电子邮箱的格式是否正确。
int
1. 占用4个字节
2. 建立索引之后,查询速度快
3. 条件范围搜索可以使用使用between
4. 不能使用mysql提供的时间函数
Int占据4个字节,以整形存储时间戳,建立索引之后,查询速度快,条件范围搜索可以使用使用between,不能使用mysql提供的时间函数。
结论:适合需要进行大量时间范围查询的数据表
datetime
1. 占用8个字节,Mysql以 YYYY-MM-DD HH:MM:SS 形式检索和显示datetime类型的数据,理论上存储的时间范围为 1000-01-01 00:00:00 到 9999-12-31 23:59:59
2. 允许为空值,可以自定义值,系统不会自动修改其值。
3. 实际格式储存(Just stores what you have stored and retrieves the same thing which you have stored.)
4. 与时区无关(It has nothing to deal with the TIMEZONE and Conversion.)
5. 可以在指定datetime字段的值的时候使用now()变量来自动插入系统的当前时间。
在创建或者修改表结构的语句中,如果我们,使用下面的语句,默认值为当前时间(更新表记录并不会修改该时间):
ALTER TABLE test
ADD created_at
DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER updated_at
;
假如,同样字段,我们修改给该字段赋予属性on update CURRENT_TIMESTAMP,则会在每次更新数据的时候自动更新修改时间:
ALTER TABLE test
CHANGE created_at
created_at
DATETIME on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
还有一个特性:与时区无关
应用场景:适合用来记录数据的原始的创建时间,因为无论你怎么更改记录中其他字段的值,datetime字段的值都不会改变,除非你手动更改它。
timestamp
1. 占用4个字节
2. 允许为空值,但是不可以自定义值,所以为空值时没有任何意义。
3. TIMESTAMP值不能早于1970或晚于2037。这说明一个日期,例如'1968-01-01',虽然对于DATETIME或DATE值是有效的,但对于TIMESTAMP值却无效,如果分配给这样一个对象将被转换为0。
4.值以UTC格式保存( it stores the number of milliseconds)
5.时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区。
6. 默认值为CURRENT_TIMESTAMP(),其实也就是当前的系统时间。
7. 数据库会自动修改其值,所以在插入记录时不需要指定timestamp字段的名称和timestamp字段的值,你只需要在设计表的时候添加一个timestamp字段即可,插入后该字段的值会自动变为当前系统时间。
8. 默认情况下以后任何时间修改表中的记录时,对应记录的timestamp值会自动被更新为当前的系统时间。
9. 如果需要可以设置timestamp不自动更新。通过设置DEFAULT CURRENT_TIMESTAMP 可以实现。
修改自动更新:
`field_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE
修改不自动更新
`field_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
结论:timestamp类型适合用来记录数据的最后修改时间,因为只要你更改了记录中其他字段的值,timestamp字段的值都会被自动更新。(如果需要可以设置timestamp不自动更新)
TIMESTAMP
新增timestamp 字段
alter table table_name add column created_at timestamp not null default CURRENT_TIMESTAMP;
TIMESTAMP占据4个字节,存储形式为 YYYYMMDDHHMMSS即以UTC形式存储 ,存储范围为1970-01-01 08:00:01到2038-01-19 11:14:07.超出这个值会被存储为0.可以设置字段的长度,设置字段的长度并不改变实际的值,但是会影响查询显示的结果。例如:
字段类型 显示格式 保存格式
TIMESTAMP(14) YYYY-MM-DD-HH-MM-SS YYYYMMDDHHMMSS
TIMESTAMP(12) YY-MM-DD-HH-MM-SS YYMMDDHHMMSS
TIMESTAMP(10) YY-MM-DD-HH-MM YYMMDDHHMM
TIMESTAMP(8) YY-MM-DD-HH YYMMDDHH
TIMESTAMP(6) YY-MM-DD YYMMDD
TIMESTAMP(4) YY-MM YYMM
TIMESTAMP(2) YY YY
如果在一张数据表中,有多个列是TIMESTAMP类型的,只有第一个会在每次更新记录的时候会自动更新时间,可以作为记录修改时间,其他的可以作为数据原始创建时间。
默认值为CURRENT_TIMESTAMP(),其实也就是当前的系统时间
应用场景:适合记录数据的最后修改时间,只要有修改记录,就可以把时间保存下来,不需要你手工去记录。由于占用字节比较小,效率上也会高点,但是时间上的限制,不能超出2038年,不能早于1970年。
比较大的缺陷:TIMESTAMP比较受时区timezone的影响以及MYSQL版本和服务器的SQL MODE的影响
虽然我们查询显示的格式类似于字符串,但是还是可以直接通过order 进行排序来实现简单的时间比较
各种场景不一样,可以选择适合的类型作为时间存储的列类型。
DATE
Date只存储日期,不存储时间,也就是说比如今天2016-03-04,并不存储时分秒。MySQL 以 'YYYY-MM-DD' 格式检索与显示 DATE 值。支持的范围是 '1000-01-01' 到 '9999-12-31'
spl_autoload_register()
如果需要多条 autoload 函数,spl_autoload_register() 满足了此类需求。 它实际上创建了 autoload 函数的队列,按定义时的顺序逐个执行。
相比之下, __autoload() 只可以定义一次。
有表如下,只有一个select语句表,不及格科目大于或等于2科的学生,的平均分(所有科目的平均分)。
select * from student
----------------------------------------
name | subject | score |
张三 | 数学 | 80
张三 | 语文 |53
张三 | 英语 | 59
李四 | 数学 | 55
李四 | 语文 | 56
李四 | 英语 | 50
要点: 1.要统计每个同学不及格科目的个数。 2.计算平均值。3.查询每个学生的最大分数的科目以及分数。
简述PHP这门编程语言的特点以及优缺点?
简述一下HTML5的新特性?是否了解响应式布局?其实现原理是什么?