深刻理解SOA架构体系
有主流内存及文件搜索引擎(ElasticSearch、Solr、Sphnix)使用和调优经验。
数组:
一、数组
count($array, $mode) 统计数组中元素的个数,model 默认为0, 当为 1 时会递归统计数组中的所有元素的个数,包括父节点
in_array($element, $array) 数组 array 中是否存在元素 element
implode($str, $array) 将数组 array 中的元素用 str 拼接
json_encode($array) 将数组转换为 JSON 串
排序
sort($arr) 以升序对数组排序
rsort($arr) 以降序对数组进行排序
asort($arr) 根据值对数组进行升序排序
arsort($arr) 根据值对数组进行降序排序
ksort($arr) 根据键对数组进行升序排序
krsort($arr) 根据键对数字进行降序排序
usort($arr, $function) 根据自定义函数对数组进行排序
uasort($arr, $function) 根据自定义函数对数组的值进行排序
uksort($arr, $function) 根据自定义函数对数组的键进行排序
array_push($array, $elem1, $elemt2...) 将多个元素添加到数组的末尾
array_pop($array) 删除数组中的最后一个元素并返回
array_unshift($array, $elem1, $elem2...) 向数组的开头插入一个或多个元素,插入多个元素时是按照排列顺序直接将多个原色放到数组开头, 例如 $a = [1, 2]; 插入多个元素array_unshift($a, 3, 4); 此时的 a 中元素顺序是 {3, 4, 1, 2}
array_shift($array) 移除数组中的第一个元素并返回
array_merge($arr1, $arr2) 合并两个数组,并返回一个新的数组
array_key_exists($key, $array) 判断键是否在数组中存在,返回True和False
array_values() 函数返回包含数组中所有的值的数组。
array_unique($array) 去除数组中的重复元素,并返回结果数组
array_search($value, $array, $strict) 返回数组 array 中 value 值的 key,strict 默认我false,匹配时 4 和 '4' 相同;为 true 时则检是否是同一类型,对象的话比较是否是同一对象
array_reverse($array, $preserve) 反转字符串,数值型的键会重新排列,字符型的键不变;preserve 默认为 false,为 true 时键不会重新排列
====================================================================
算法:
1.冒泡排序
$arr=array(1,43,54,62,21,66,32,78,36,76,39);
function bubbleSort ($arr)
{
$len = count($arr);
//该层循环控制 需要冒泡的轮数
for ($i=1; $i<$len; $i++) {
//该层循环用来控制每轮 冒出一个数 需要比较的次数
for ($k=0; $k<$len-$i; $k++) {
if($arr[$k] > $arr[$k+1]) {
$tmp = $arr[$k+1]; // 声明一个临时变量
$arr[$k+1] = $arr[$k];
$arr[$k] = $tmp;
}
}
}
return $arr;
}
二分查找:
<?php
//二分查找
function bin_search($arr,$low,$high,$k)
{
if($low <= $high)
{
$mid = intval(($low + $high)/2);
if($arr[$mid] == $k)
{
return $mid;
}
else if($k < $arr[$mid])
{
return bin_search($arr,$low,$mid-1,$k);
}
else
{
return bin_search($arr,$mid+1,$high,$k);
}
}
return -1;
}
$arr = array(1,2,3,4,5,6,7,8,9,10);
print(bin_search($arr,0,9,3));
?>
面试题目:SQL 注入、XSS 攻击、CSRF 攻击
一、SQL注入:将恶意的SQL命令通过表单提交等方式注入到后台数据库引擎进行执行,从而泄露数据库信息
1.输入验证
2.错误消息处理
3.加密处理
4.使用专业的漏洞扫描工具
二、XSS:跨站脚本攻击,指恶意攻击者往Web页面里插入恶意代码,当用户浏览该页之时代,码会被执行,从而达到恶意攻击用户 的目的。
1.trim()清空空格
2.strp_tags()过滤html标签
3.htmlspecialchars() 将字符内容转为html实体
三、CSRF: 跨站请求伪造,它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站
1.验证http_reffer字段
2.在请求中添加token并验证
面试题:把一个文件从A服务器拷贝到B服务器
拷贝文件: 如:scp install.log root@192.168.33.111:/home/ 或 scp install.log 192.168.33.111:/home/
拷贝目录: 如:scp -r apps root@192.168.33.111:/home/ 这里的apps是目录名
面试题目:CGI是什么 什么FastCGI? php-fpm, FastCGI,nginx之间什么关系?
FastCGI 是一个协议,它是应用程序和 WEB 服务器连接的桥梁。Nginx 并不能直接与 PHP-FPM 通信,而是将请求通过 FastCGI 交给 PHP-FPM 处理。
CGI:当web server收到/index.php这个请求后,会启动对应的CGI程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,
然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程。web server再把结果返回给浏览器。(CGI是个协议)
FastCGI 像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。
标准的CGI对每个请求都会执行“PHP解析器会解析php.ini文件,初始化执行环境”这个步骤,所以处理每个请求的时间会比较长。这明显不合理嘛!
那么Fastcgi是怎么做的呢?首先,Fastcgi会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求过来时,
master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,
master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。
这就是fastcgi的对进程的管理。
PHP-FPM 又是什么呢?是一个实现了Fastcgi的程序
PHP的解释器是php-cgi。php-cgi只是个CGI程序,他自己本身只能解析请求,返回结果,不会进程管理,所以就出现了一些能够调度php-cgi进程的程序,
比如说由lighthttpd分离出来的spawn-fcgi。好了PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)也是这么个东东,在长时间的发展后,
逐渐得到了大家的认可,也越来越流行。
面试题:mysql出现性能瓶颈如何优化
MySQL数据库优化可以在多个不同的层级进行,常见的有sql优化,配置参数优化,数据库架构优化等这几方面。
1. 为查询缓存优化你的查询
2. EXPLAIN 你的 SELECT 查询
3. 当只要一行数据时使用 LIMIT 1
4. 为搜索字段建索引
5. 避免 SELECT *
6. 把IP地址存成 UNSIGNED INT
---------------------------------------
1 数据库配置优化
2 系统内核优化
3 硬件配置优化
4 数据库架构扩展
5 主从复制与读写分离
面试提:支持回调处理的php函数
call_user_func_array()
面试题:php内置函数去除数组空元素,排重,按值大小排序,重新建立数字索引
数组空元素:array_filter
重新建立数字索引:array_values
排重: array_unique($aa)
按值大小排序: array_multisort(array_column($nima,'zongfen'),SORT_DESC,$nima);
面试题:创建一个数据表
CREATE TABLE `wx_tree_ad` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`appid` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
面试题:tcp如何建立通讯
TCP/IP通信过程,简单为,三次建立,四次断开。具体如下:
三次建立:
主机A发送SYN(seq=x)报文给主机B,主机A进入SYN_SEND状态 ;
主机B收到SYN报文,回应一个SYN(seq=y)ACK(ACK=x+1)报文,主机B进入SYN_RECV状态;
主机A收到主机B的SYN报文,回应一个ACK(ACK=y+1)报文,主机A进入established状态。
三次握手完成,主机A和主机B已经建立连接。
面试题:redis主从是如何同步数据的
从服务器向主服务器发送 sync 命令
收到 sync 命令后,主服务器执行 bgsave 命令,用来生成 rdb 文件,并在一个缓冲区中记录从现在开始执行的写命令。
bgsave 执行完成后,将生成的 rdb 文件发送给从服务器,用来给从服务器更新数据
主服务器再将缓冲区记录的写命令发送给从服务器,从服务器执行完这些写命令后,此时的数据库状态便和主服务器一致了。
会使用SpringBoot ,Mybatis ,SpringCloud 框架
面试题: Get与post两种方式有什么不同
(1)url可见性:get 方式url参数可见,post 不可见
(2)可缓存性:get 方式是可以缓存的,post 方式不可以缓存。
(3)传输数据大小:get一般传输数据大小不超过2k-4k(根据浏览器不同,限制不一样,但相差不大);post 请求传输数据的大小根据php.ini 配置文件设定,也可以无限大。
(4)数据传输上:get 方式通过url地址栏拼接参数进行传输,post 方式通过body体进行传输。
建议:
1、get式安全性较Post式要差些包含机密信息建议用Post数据提交式;
2、做数据查询建议用Get式;做数据添加、修改或删除建议用Post方式;
面试题 :Print、echo、print_r有什么区别?
echo:语句结构;
print:是函数,有返回值
print_r:能打印数组,对象
var_dump:能打印对象数组,并且带数据类型
(1) echo和print都可以做输出,不同的是,echo不是函数,没有返回值,而print是一个函数有返回值,所以相对而言如果只是输出echo会更快,而print_r通常用于打印变量的相关信息,通常在调试中使用。
(2) print 是打印字符串
(3)print_r 则是打印复合类型 如数组 对象
echo可以一次输出多个值,多个值之间用逗号分隔。echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用。echo是php的内部指令,不是函数,无返回值。
print():函数print()打印一个值(它的参数),如果字符串成功显示则返回true,否则返回false。只能打印出简单类型变量的值(如int,string),有返回值
printf():源于C语言中的printf()。该函数输出格式化的字符串。
print_r()和var_dump()
print_r()可以把字符串和数字简单地打印出来,而数组则以括起来的键和值得列表形式显示,并以Array开头。但print_r()输出布尔值和NULL的结果没有意义,因为都是打印"\n"。
因此用var_dump()函数更适合调试。print_r是函数,可以打印出比较复杂的变量(如数组,对象),有返回值
var_dump()判断一个变量的类型与长度,并输出变量的数值,如果变量有值输的是变量的值并回返数据类型。
此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
面试题:SESSION与COOKIE的区别?
(1)存储位置:session存储于服务器,cookie存储于浏览器
(2)安全性:session安全性比cookie高
(3)session为‘会话服务’,在使用时需要开启服务,cookie不需要开启,可以直接用
1、cookie数据存放在第三方应用的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE,进行COOKIE欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、所以个人建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE
面试题 :PHP处理数组的常用函数?(重点看函数的‘参数’和‘返回值’)
(1)array() 创建数组
(2)in_array() 判断元素是否在数组中
(3)count() 返回数组中元素的数目
(4)array_merge() 将多个数组合并成一个数组
(5)array_diff() 比较两个或两个以上数组的差异
(6)array_intersect() 获取两个或两个数组以上的交集
(7)array_keys() 获取数组的key列表
(8)array_values() 获取数组的值列表
(9)array_unique() 删除数组中的重复值
(10)array_push()将一个或多个元素插入数组的末尾(入栈)
(11)array_pop() 弹出并返回 array 数组的最后一个单元(出栈)
(12)array_walk() 使用用户自定义函数对数组中的每个元素做回调处理
面试题 :PHP处理字符串的常用函数?(重点看函数的‘参数’和‘返回值’)
(1)trim() 移除字符串两侧的空白字符和其他字符;
(2)strlen() 获取字符串的长度
(3)mb_strlen() 获取字符串长度(可指定字符编码,对中文字符串计算长度)
(4)substr()返回字符串的一部分;
(5)str_replace() 子字符串替换
(6)str_repeat () 重复一个字符串
(7)is_string() 检测变量是否是字符串;
(8)str_shuffle () 随机打乱一个字符串
(9)sprintf() 返回根据格式化字符串生成的字符串(通常用于获取分表后的数据表名)
(10)strstr() 查找字符串的首次出现
(11)addslashes 使用反斜线引用字符串
面试题 :PHP处理时间的常用函数?(重点看函数的‘参数’和‘返回值’)
(1)date() 格式化一个本地时间/日期。
(2)getdate() 取得日期/时间信息。
(3)date_default_timezone_set() 设定默认时区。
(4)date_default_timezone_get() 返回默认时区。
(5)mktime() 返回一个日期的 Unix时间戳。
(6)strtotime() 将任何字符串的日期时间描述解析为 Unix 时间戳
(7)strftime() 根据区域设置格式化本地时间/日期
面试题 :PHP操作文件的常用函数?(重点看函数的‘参数’和‘返回值’)
(1)打开文件 fopen()
(2)读取文件 fgets() ; 注:file_get_contents()也是读取文件
(3)写入文件fwrite() ; 注:file_put_contents()同样可以写入文件
(4)关闭文件句柄 fclose()
(5)移动 / 重命名文件 rename()
(6)复制文件 copy()
(7)创建文件 vim 或 touch
(8)删除文件 unlink()
(9)获取文件上次访问的时间 fileatime()
(10)获取文件上次修改的时间 filemtime()
(11)获取文件大小 filesize()
(12)获取文件类型 filetype()
(13)获取文件详细信息 state()
面试题目 : PHP操作目录(文件夹)的常用函数?(重点看函数的‘参数’和‘返回值’)
(1)打开目录 opendir()
(2)读取目录 readdir()
(3)删除目录 rmdir()
(4)关闭目录句柄 closedir()
(5)创建目录 mkdir()
(6)返回路径中的目录部分 dirname()
(7)取得当前工作目录 getcwd()
(8)列出指定路径中的文件和目录 scandir()
面试题:数据表类型有哪些
MyISAM、InnoDB、HEAP、BOB,ARCHIVE,CSV等。
MyISAM:成熟、稳定、易于管理,快速读取。一些功能不支持(事务等),表级锁
InnoDB:支持事务、外键等特性、数据行锁定。空间占用大,不支持全文索引等。
InnoDB:
支持事务处理等
不加锁读取
支持外键
支持行锁
不支持FULLTEXT类型的索引
不保存表的具体行数,扫描表来计算有多少行
DELETE 表时,是一行一行的删除
InnoDB 把数据和索引存放在表空间里面
跨平台可直接拷贝使用
InnoDB中必须包含AUTO_INCREMENT类型字段的索引
表格很难被压缩
MyISAM:
不支持事务,回滚将造成不完全回滚,不具有原子性
不支持外键
不支持外键
支持全文搜索
面试题 : MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
(1)设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。
(2) 选择合适的表字段数据类型和存储引擎,适当的添加索引。
(3) 做mysql主从复制读写分离。
(4)对数据表进行分表,减少单表中的数据量提高查询速度。
(5)添加缓存机制,比如redis,memcached等。
(6)对不经常改动的页面,生成静态页面(比如做ob缓存)。
(7)书写高效率的SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE
面试题:对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题?
(1) 确认服务器是否能支撑当前访问量。
(2) 优化数据库访问。
(3)禁止外部访问链接(盗链), 比如图片盗链。
(4)控制文件下载。
(5)做负载均衡,使用不同主机分流。
(6)使用浏览统计软件,了解访问量,有针对性的进行优化。
面试题 : 什么是面向对象?(理解着回答)
面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节。
面向对象有三大特征:封装性、继承性、多态性。
面试题 :简述 private、 protected、 public修饰符的访问权限。
private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
面试题 :堆和栈的区别?
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;
堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。
面试题 :XML 与 HTML 的主要区别
(1)在html中不区分大小写,在xml中严格区分。
(2)在HTML中,有时不严格,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略
或者之类的结束标记。在XML中,是严格的树状结构,绝对不能省略掉结束标记。
(3) 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个/ 字符作为结尾。这样分析器就知道不用查找结束标记了。
(4)在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。
(5)在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。
(6) 在XML文档中,空白部分不会被解析器自动删除;但是html是过滤掉空格的。
标记不同:
(1)html使用固有的标记;而xml没有固有的标记。
(2)Html标签是预定义的;XML标签是免费的、自定义的、可扩展的。
面试题 : 抽象类和接口的概念以及区别?
抽象类:它是一种特殊的,不能被实例化的类,只能作为其他类的父类使用。使用abstract关键字声明。
接口:它是一种特殊的抽象类,也是一个特殊的类,使用interface声明。
区别:
(1)抽象类的操作通过继承关键字extends实现,而接口的使用是通过implements关键字来实现。
(2)抽象类中有数据成员,可以实现数据的封装,但是接口没有数据成员。
(3)抽象类中可以有构造方法,但是接口没有构造方法。
(4)抽象类的方法可以通过private、protected、public关键字修饰(抽象方法不能是private),而接口中的方法只能使用public关键字修饰。
(5)一个类只能继承于一个抽象类,而一个类可以同时实现多个接口。
(6)抽象类中可以有成员方法的实现代码,而接口中不可以有成员方法的实现代码。
面试题 :smarty模板引擎
Smarty是一个使用PHP写出来的PHP模板引擎,目的是要使用PHP程序同美工分离,使的程序员改变程序的逻辑内容时不会影响到美工的页面设计,美工重新修改页面时不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。(也易于程序的多样式开发)
Smarty优点
(1)速度快:相对其他模板引擎。
(2) 编译型:采用smarty编写的程序在运行时要编译成一个非模板技术的PHP文件
(3)缓存技术:它可以将用户最终看到的HTML文件缓存成一个静态的HTML页
(4)插件技术:smarty可以自定义插件。
面试题 :HTTP 状态中302、403、 500代码含义?
一二三四五原则:(即一:消息系列;二:成功系列; 三:重定向系列;四:请求错误系列;五:服务器端错误系列。)
302:临时转移成功,请求的内容已转移到新位置
403:禁止访问
500:服务器内部错误
401:代表未授权。
面试题 :语句include和require的区别是什么?为避免多次包含同一文件,可用什么语句代替它们?
区别:
在失败的时候:
include产生一个warning,而require产生直接产生错误中断
require在运行前载入
include在运行时载入
代替:
require_once
include_once
面试题 :简述php的垃圾收集机制。
答案:php中的变量存储在变量容器zval中,zval中除了存储变量类型和值外,还有is_ref和refcount字段。refcount表示指向变量的元素个数,
is_ref表示变量是否有别名。如果refcount为0时,就回收该变量容器。
如果一个zval的refcount减1之后大于0,它就会进入垃圾缓冲区。
当缓冲区达到最大值后,回收算法会循环遍历zval,判断其是否为垃圾,并进行释放处理。
面试题 :什么是 CSRF 攻击 ?XSS 攻击?如何防范?
CSRF,跨站请求伪造,攻击方伪装用户身份发送请求从而窃取信息或者破坏系统。
讲述基本原理:用户访问A网站登陆并生成了cookie,再访问B网站,如果A网站存在CSRF漏洞,此时B网站给A网站的请求(此时相当于是用户访问),
A网站会认为是用户发的请求,从而B网站就成功伪装了你的身份,因此叫跨站脚本攻击。
CSRF防范:
A、合理规范api请求方式,GET,POST
B、对POST请求加token令牌验证,生成一个随机码并存入session,表单中带上这个随机码,提交的时候服务端进行验证随机码是否相同。
XSS,跨站脚本攻击。
防范:不相信任何输入,过滤输入。
面试题 :安全对一套程序来说至关重要,请说说在开发中应该注意哪些安全机制?
A、防远程提交;
B、防SQL注入,对特殊代码进行过滤;
C、防止注册机灌水,使用验证码。
面试题: PHP 获取url地址中文件的扩展名
parse_url($url);
parse_url() 该函数解析url、返回其组成部分;
返回关联数组
scheme 方案;如 http
host 域名
port
user 用户
pass
path 路径
query 在问号?之后
fragment 在散列符号#之后
Array(
[scheme] = >http
[host] => ABC Home Page - ABC.com
[path] => /ab/cd/e.php
[query] => id=1&data=2
[fragment] => laowen
)
返回关联数组
dirname 文件路径
basename 文件名+扩展名
extension 最后一个扩展名
filename 文件名
eg: print_r( pathinfo('/ab/cd/e.php') );
Array(
[dirname] => /ab/cd
[basename] => e.php
[extension] => php
[filename] => e
)
面试题:mysql主从复制的原理(重中之重,面试必问)
1.数据库有个bin-log二进制文件,记录了所有sql语句。
2.我们的目标就是把主数据库的bin-log文件的sql语句复制过来。
3.让其在从数据的relay-log重做日志文件中再执行一次这些sql语句即可。
具体需要三个线程来操作:
1.binlog输出线程:每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。在从库里,当复制开始的时候,从库就会创建两个线程进行处理:
2.从库I/O线程:当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。
从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。
3.从库的SQL线程:从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。
熟悉mysql,掌握mysql分区、分表、集群等相关设计方案,具备mysql优化经验;
掌握Scrapy、Pyspider、ThinkPHP5等开源框架
面试题:php 内存溢出,解决方案
1 增加PHP可用内存大小,另一方面,只要我们想办法对数组进行分批处理,分而治之,将用过的变量及时销毁(unset)
2 为了节省PHP程序内存损耗,我们应当尽可能减少静态变量的使用,在需要数据重用时,可以考虑使用引用(&)。
再一点就是:数据库操作完成后,要马上关闭连接;一个对象使用完,要及时调用析构函数(__destruct())。
(注意)unset()函数只能在变量值占用内存空间超过256字节时才会释放内存空间。
只有当指向该变量的所有变量(如引用变量)都被销毁后,才会释放内存。
面试题:php 连接数据库方式
PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)
1.PHP与Mysql扩展(本扩展自 PHP 5.5.0 起已废弃,并在将来会被移除),PHP原生的方式去连接数据库,是面向过程的
2.PHP与Mysqli扩展,面向过程、对象
2.PHP与PDO扩展,面向过程、对象
面试题:thinkphp3.2 M 和D有什么区别
在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,
如果D方法没有找到定义的模型类,则会自动调用M方法。通俗一点说:M实例化参数是数据库的表名。
D实例化的是你自己在Model文件夹下面建立的模型文件
例如:$user = new UserModel();
等价于$user = D('user');
如果实例化的是一个空模型
例如 $Demo = new Model();
那么它等价于 $Demo = M();
D和M的区别主要在于:M方法不需要创建模型类文件,M方法不会读取模型类,所以默认情况下自动验证是无效的,
但是可以通过动态赋值的方式实现而D方法必须有创建模型类。
我们可以用下面两种方法去创建一个数据表的映射对象第一种:$Test = D('Test')第二种:$Test = new Model('Test')虽然这两种都可以对数据进行select,insert,delete,udpate操作,
在数据验证上有很大的不同,用第一种方式实例一个模型就会有数据检查功能,
如果 title 没有填写的话就会提示 “请输入标题” (这个是tp提供的一个自动验证功能,当然也需要在相应的model中定义好验证条件);
如果用第二种就没有了·····还有1个区别就是当用了$trueTableName后,必须用$test=d('test'),表示查询的是test表,
如果用的是$test=m('test'),那么都表示查询的数据边是think_test。thinkphp2.0版本测试有如此上面的问题
-----------------------------------------------------------------------------------------------
通俗点说:D就是实例化一个基于Model文件的Model。M则是通过直接实例化Model方法(ThinkPHP基类)来动态的实例化一个Model对象,即使这个对应的Model文件不存在
面试题 :Nginx负载均衡策略
在upstream模块配置完成后,要让指定的访问反向代理到服务器列表:
目前Nginx服务器的upstream模块支持6种方式的分配:
负载均衡策略
轮询 默认方式
weight 权重方式
ip_hash 依据ip分配方式
least_conn 最少连接方式
fair(第三方) 响应时间方式
url_hash(第三方) 依据URL分配方式
面试题: svn git分支和使用原理
在一台服务器上建立一个源代码库,库里可以存放许多不同项目的源程序。
有源代码库管理员统一管理这些源程序。每个用户在使用源代码库之前,
首先要把源代码库里德项目文件下载到本地,然后开发人员可以在本地修改,
左后用svn命令进行提交,游源代码库统一管理修改。
git 在工作目录添加文件到暂存区,然后再提交到本地仓库,最后提交到远程仓库
git工作原理
面试题:服务器/DB集群
面试题目:docker
是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,
然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,
相互之间不会有任何接
面试题:熟悉TCP、HTTP、PRC
1 TCP是什么,工作原理
是一种面向连接的、可靠的、基于字节流的传输层通信协议
TCP连接建立和断开的过程,也就是三次握手和四次挥手
2 HTTP是什么,工作原理
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。
HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS
次HTTP操作称为一个事务,其工作过程可分为四步:
1)首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。
2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
3 PRC是什么,工作原理
远程过程调用协议
它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
面试题目:OOP程序设计思想
是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。
核心思想:封装,继承,多态.
OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。
面试提:单工,半双工和全双工有何区别和联系?
1 单工数据传输只支持数据在一个方向上传输;在同一时间只有一方能接受或发送信息,不能实现双向通信,举例:电视,广播。
2 半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,
它实际上是一种切换方向的单工通信;在同一时间只可以有一方接受或发送信息,可以实现双向通信。举例:对讲机。
3.全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,
它要求发送设备和接收设备都有独立的接收和发送能力;在同一时间可以同时接受和发送信息,实现双向通信,举例:电话通信。
面试题:mysql主从原理,优缺点,热备份
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。
MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,
数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
主从操作:
1.数据库有个bin-log二进制文件,记录了所有sql语句。
2.我们的目标就是把主数据库的bin-log文件的sql语句复制过来。
3.让其在从数据的relay-log重做日志文件中再执行一次这些sql语句即可。
优点:
1、做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
2、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
3、读写分离,使数据库能支撑更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,
报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。
利用XtraBackup完成主数据库不停机、不锁表进行热备份