订单号生成规则
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 经常使用命令 http://www.javashuo.com/article/p-sawqjgwr-bb.html
1.GET和POST区别? HTTP请求方式 GET POST PUT DELETE?php
GET在浏览器回退时是无害的,而POST会再次提交请求。html
GET产生的URL地址能够被收藏,而POST不能够。前端
GET请求会被浏览器主动cache,而POST不会,除非手动设置。mysql
GET请求只能进行url编码,而POST支持多种编码方式。linux
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。nginx
GET请求在URL中传送的参数是有长度限制的,而POST么有。web
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。正则表达式
GET比POST更不安全,由于参数直接暴露在URL上,因此不能用来传递敏感信息。redis
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
HTTP协议包含:通用头域、请求消息、响应消息和主体信息。
2.nginx和Apache区别
最核心的区别在于apache是同步多进程模型,一个链接对应一个进程;nginx是异步 的,多个链接(万级别)能够对应一个进程。
Nginx自己就是一个反向代理服务器;Nginx支持7层负载均衡;其余的固然, Nginx可能会比apache支持更高的并发。
Apache在处理动态有优点,Nginx并发性比较好,CPU内存占用低,若是rewrite 频繁,那仍是Apache吧
3.cookie和session区别?禁用cookie后,session还能用吗?如何共享分布式集群下的session?
http://www.javashuo.com/article/p-ospdgarp-ba.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脚本结束。
为了清理这些垃圾,引入了两个准则
循环引用基本上只会出如今 数组和对象中,对象是由于它的自己就是引用
php7的垃圾回收包含两个部分,一个是垃圾收集器,一个是垃圾回收算法。
垃圾收集器,把刚刚提到的,多是垃圾的元素收集到回收池中 也就是把变量的 zend_refcount
的信息 放在回收池中。 当回收池的值达到必定额度了,会进行统一处理。
处理的过程呢,就比较简单。
遍历回收池中的每个变量,根据每个变量,再遍历每个成员,若是成员还有嵌套的话继续遍历。而后把全部成员的 作模拟的 refcount -1。若是此时外部的变量的 引用次数为 0 。那么能够视为垃圾,清楚。若是大于0,那么恢复引用次数,并从垃圾回收池中取出。
若是你这个变量不是垃圾,那么它的全部成员变量的引用减一以后,必然不会是总变量的引用为0。
http://www.javashuo.com/article/p-emmbacpf-d.html
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的区别以及应用?索引结构如何实现?
http://www.javashuo.com/article/p-bfbqamtm-k.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.设计一个短地址方案,写一个函数或思路。
网上比较流行的算法有两种 自增序列算法、 摘要算法
http://www.javashuo.com/article/p-wefkleed-o.html
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.字符串翻转 不用内置函数
http://www.javashuo.com/article/p-ctfyzlii-ba.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 三次握手 四次挥手
一、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的新特性?是否了解响应式布局?其实现原理是什么?