8.30
SEO优化:搜索引擎优化
1.数据库优化
答:
1、选取最适用的字段属性(字段大小、非空)
2、使用连接(JOIN)来代替子查询(Sub-Queries)
3、使用联合(UNION)来代替手动创建的临时表
4、事务(事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。)
5、锁定表(lock)
6、使用外键InnoDB
7、使用索引(尽量不要对数据库中某个含有大量重复的值的字段建立索引。)
8、优化的查询语句
CONCAT()函数用于将多个字符串连接成一个字符串。
栈(Stack)和队列(Queue)是两种操作受限的线性表。
栈与队列的相同点:
1.都是线性结构。
2.插入操作都是限定在表尾进行。
3.都可以通过顺序结构和链式结构实现。
4.插入与删除的时间复杂度都是O(1),在空间复杂度上两者也一样。
5.多链栈和多链队列的管理模式可以相同。
栈与队列的不同点:
1.删除数据元素的位置不同,栈的删除操作在表尾进行,队列的删除操作在表头进行。
2.应用场景不同;常见栈的应用场景包括括号问题的求解,表达式的转换和求值,函数调用和递归实现,深度优先搜索遍历等;常见的队列的应用场景包括计算机系统中各种资源的管理,消息缓冲器的管理和广度优先搜索遍历等。
3.顺序栈能够实现多栈空间共享,而顺序队列不能。
实现网站高并发高负载的解决方案
1、HTML静态化(信息发布系统CMS)
2、图片服务器分离
3、数据库集群、库表散列 数据库缓存层的优化
4、缓存
5、镜像
6、web服务器负载均衡、请求分发
7、最新:CDN加速技术
PHP数组操作函数都有哪些?可以列举出来几个吗?
array_push 末尾插入
sort 排序
array_pop 删除最后一个元素
array_values($arr); 获得数组的值
array_keys($arr); 获得数组的键名
array_flip($arr); 数组中的值与键名互换(如果有重复前面的会被后面的覆盖)
in_array("apple",$arr); 在数组中检索apple
array_search("apple",$arr); 在数组中检索apple ,如果存在返回键名
array_key_exists("apple",$arr); 检索给定的键名是否存在数组中
isset($arr[apple]): 检索给定的键名是否存在数组中
数组的内部指针
current($arr); 返回数组中的当前单元
pos($arr); 返回数组中的当前单元
key($arr); 返回数组中当前单元的键名
prev($arr); 将数组中的内部指针倒回一位
next($arr); 将数组中的内部指针向前移动一位
end($arr); 将数组中的内部指针指向最后一个单元
2、WEB开发中数据提交方式有几种?有什么区别?百度使用哪种方式?
Get与post两种方式
区别:
1. Get从服务器获取数据,post向服务器传送数据
2. Get传值在url中可见,post在url中不可见
3. Get传值一般在2KB以内,post传值大小可以在php.ini中进行设置
4. get安全性非低,post安全性较高,执行效率却比Post高
建议:
1、get式安全性较Post式要差些包含机密信息建议用Post数据提交式;
2、做数据查询建议用Get式;做数据添加、修改或删除建议用Post方式;
百度使用的get方式,因为可以从它的URL中看出
4、说一下你所掌握的网页前端技术有哪些?
熟练掌握DIV+CSS网页布局,JavaScript,jQuery框架、photoshop图片处理
5、AJAX的优势是什么?
ajax是异步传输技术,可以通过javascript实现,也可以通过JQuery框架实现,实现局部刷新,减轻了服务器的压力,也提高了用户体验
6、安全对一套程序来说至关重要,请说说在开发中应该注意哪些安全机制?
①防远程提交;②防SQL注入,对特殊代码进行过滤;③防止注册机灌水,使用验证码;
MVC三层分别指:业务模型、视图、控制器,由控制器层调用模型处理数据,然后将数据映射到视图层进行显示,优点是:①可以实现代码的重用性,避免产生代码冗余;②M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式
redis和memcached的区别
1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等;
2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储;
3、虚拟内存--Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘;
4、过期策略--memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire 设定,例如expire name 10;
5、分布式--设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从;
6、存储数据安全--memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化);
7、灾难恢复--memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复;
8、Redis支持数据的备份,即master-slave模式的数据备份;
9、应用场景不一样:Redis出来作为NoSQL数据库使用外,还能用做消息队列、数据堆栈和数据缓存等;Memcached适合于缓存SQL语句、数据集、用户临时性数据、延迟查询数据和session等。
tcp:TCP是传输层的一个协议,基于IP协议,用来传输类似HTTP的信息。如果把IP协议类比为一个“公路”的话,那TCP协议可以看成是在公路上行驶的“卡车”。TCP协议是面向连接的协议,通过三次握手机制,尽量保证连接的可靠性。
UDP也是传输层的一个协议。但是与TCP不同的是,UDP不是面向连接的,并不保证传输的可靠性,没有TCP的建立连接的三次握手机制,对于传输效率上面有了提升。
HTTP是在应用层的一个协议,本身就是一个协议,是从Web服务器传输超文本到本地浏览器的传输协议。
HTTP协议基于请求\响应模型的,并且是基于TCP协议的。
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
进程的五种基本状态

进程通信:


阻塞就是干不完不准回来,
非阻塞就是你先干,我现看看有其他事没有,完了告诉我一声
问:一个数组中某数字大于一半 求该数字
思路1:数组排序后,如果符合条件的数存在,则一定是数组中间那个数
思路2: 如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多。 在遍历数组时保存两个值:一是数组中一个数字,一是次数。遍历下一个数字时,若它与之前保存的数字相同,则次数加1,否则次数减1;若次数为0,则保存下一个数字,并将次数置为1。遍历结束后,所保存的数字即为所求。然后再判断它是否符合条件即可。
思路3:超过数组长度的一半,对数组同时去掉两个不同的数字,到最后剩下的一个数就是该数字。如果剩下两个,那么这两个也是一样的,就是结果。
数组排序后,如果符合条件的数存在,则一定是数组中间那个数。(比如:1,2,2,2,3;或2,2,2,3,4;或2,3,4,4,4等等)
这种方法虽然容易理解,但由于涉及到快排sort,其时间复杂度为O(NlogN)并非最优;
2、Linux命令:netstat -ano 查看所有端口的占用情况 netstat -anp|grep 80
查看端口占用情况的命令:lsof -i
重启,关机: reboot, halt,poweroff shutdown
14、PHP处理字符串的常用函数?(重点看函数的‘参数’和‘返回值’)
①trim()移除字符串两侧的空白字符和其他字符;
②substr_replace()把字符串的一部分替换为另一个字符串;
③substr_count()计算子串在字符串中出现的次数;
④substr()返回字符串的一部分;
⑤strtolower()把字符串转换为小写字母;
⑥strtoupper()把字符串转换为大写字母;
⑦strtr()转换字符串中特定的字符;
⑧strrchr()查找字符串在另一个字符串中最后一次出现;
⑨strstr()查找字符串在另一字符串中的第一次出现(对大小写敏感);strrev()反转字符串;strlen()返回字符串的长度;str_replace()替换字符串中的一些字符(对大小写敏感);print()输出一个或多个字符串;explode()把字符串打散为数组;is_string()检测变量是否是字符串;strip_tags()从一个字符串中去除HTML标签;mb_substr()用来截中文与英文的函数
15、PHP处理时间的常用函数?(重点看函数的‘参数’和‘返回值’)
date_default_timezone_get()返回默认时区。
date_default_timezone_set()设置默认时区。
date()格式化本地时间/日期。
getdate()返回日期/时间信息。
gettimeofday()返回当前时间信息。
microtime()返回当前时间的微秒数。
mktime()返回一个日期的 Unix时间戳。
strtotime()将任何英文文本的日期或时间描述解析为 Unix时间戳。
time()返回当前时间的 Unix时间戳。
12、SESSION与COOKIE的区别?
①存储位置:session存储于服务器,cookie存储于浏览器
②安全性:session安全性比cookie高
③session为‘会话服务’,在使用时需要开启服务,cookie不需要开启,可以直接用
HTTP状态码分类:
- 1** - 信息,服务器收到的请求,需要请求者继续执行操作
- 2** - 成功,操作被成功接收并处理
- 3** - 重定向,需要进一步的操作以完成请求
- 4** - 客户端错误,请求包含语法错误或者无法完成请求
- 5** 服务器错误,服务器在处理请求的过程 中发生了错误
常见的HTTP状态码:
- 200 - 请求成功
- 301 - 资源(网页等)被永久转义到其他URL
- 404 - 请求的资源(网页等)不存在
- 505 - 内部服务器错误
3.1表单中get和post提交方式的区别
- get是把参数数据队列加到提交表单的action属性所指的url中,值和表单内各个字段一一对应,从url中可以看到;post是通过HTTPPOST机制,将表单内各个字段与其内容防止在HTML的head中一起传送到action属性所指的url地址,用户看不到这个过程
- 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据
- get传送的数据量较小,post传送的数据量较大,一般被默认不受限制,但在理论上,IIS4中最大量为80kb,IIS5中为1000k,get安全性非常低,post安全性较高
正则
排序算法: 具体说明
-
- 外排序:需要在内外存之间多次交换数据才能进行
- 内排序:
- 插入类排序
- 直接插入排序
- 希尔排序
- 选择类排序
- 简单选择排序
- 堆排序
- 交换类排序
- 冒泡排序
- 快速排序
- 归并类排序
- 归并排序
- 插入类排序
| 排序方法 | 平均情况 | 最好情况 | 最坏情况 | 辅助空间 | 稳定性 |
|---|---|---|---|---|---|
| 冒泡排序 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
| 简单选择排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 稳定 |
| 直接插入排序 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
| 希尔排序 | O(nlogn)~O(n^2) | O(n^1.3) | O(n^2) | O(1) | 不稳定 |
| 堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
| 归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 稳定 |
| 快速排序 | O(nlogn) | O(nlogn) | O(n^2) | O(logn)~O(n) | 不稳定 |
设计模式:
l 单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点例如框架中的数据库连接
l 简单工厂模式:它具有创建对象的某些方法,可以使用工厂类创建对象,而不直接使用new。例如初始化数据库的时候会用到,比如MySQL,MSSQL
l 策略模式:针对一组算法,将每一个算法封装到具有共同接口的独立的类中,例如进入个人主页时,根据浏览者的不同,给予不同的显示与操作
l 注册模式:提供了在程序中有条理的存放并管理一组全局对象 (object),例如ZF框架中的Zend_Registry::set
l 适配器模式:将不同接口适配成统一的API接口,例如数据操作有mysql、mysqli、pdo等,可利用适配器模式统一接口
l 装饰器模式:不修改原类代码和继承的情况下动态扩展类的功能,例如框架的每个Controller文件会提供before和after方法
l 迭代器模式:提供一个方法顺序访问一个聚合对象中各个元素,在PHP中将继承Iterator类
l 原型模式:实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。
数据结构:
数组 (Array)
栈 (Stack) 先进后出
队列 (Queue) 先进先出
链表 (Linked List)
树 (Tree)
堆 (Heap) :堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。
图 (Graph)
散列表 (Hash)
linux常见命令,我回答只用过 cp,cd ls,mv,wget
Tp3.2 和 Tp5.0之间的区别
增加路由变量规则;
增加组合变量支持;
增加资源路由;
增加路由分组;
增加闭包定义支持;
增加MISS路由定义;
支持URL路由规则反解析;
请求对象和响应对象
15、谈谈mvc的认识
由模型、视图、控制器完成的应用程序,由模型发出要实现的功能到控制器,控制器接收组织功能传递给视图
13、对于大流量网站,采用什么方法来解决访问量的问题
- 确认服务器硬件是否能够支持当前的流量
- 数据库读写分离,优化数据表
- 程序功能规则,禁止外部的盗链
- 控制大文件的下载
- 使用不同主机分流主要流量
PHP优势
PHP特性:
- php独特混合了C,Java,Prel以及PHP自创的语法
- 可以比CGI或者Prel更快速去执行动态网页,与其他变成语言相比,PHP是讲程序嵌入到HTML文档中去执行,执行效率比完全生成HTML编辑的CGI要高很多,所有的CGI都能实现
- 支持几乎所有流行的数据库以及操作系统
- PHP可以使用C,C++进行程序的扩展
PHP优势:
- 开放源代码
- 免费性
- 快捷性
- 跨平台强
- 效率高
- 图形处理
- 面向对象
- 专业专注
PHP技术应用:
- 静态页面生成
- 数据库缓存
- 过程缓存
- div+css w3c标准
- 大负荷
- 分布式
- flex
- 支持MVC
- Smarty模块引擎
PHP认证级别
- 初级 IFE:Index Front Engineer 前端工程师
- 中级 IPE:Index PHP Engineer PHP工程师
- 高级 IAE:Index Architecture Engineer 架构工程师
12、是否使用过模板引擎?使用的模板引擎的名字是?
Smarty:Smarty算是一种很老的PHP模板引擎了,它曾是我使用这门语言模板的最初选择。虽然它的更新已经不算频繁了,并且缺少新一代模板引擎所具有的部分特性,但是它仍然值得一看。
16、 说明php中传值与传引用的区别,并说明传值什么时候传引用?
变量默认总是传值赋值,那也就是说,当将一个表达式的值赋予一个变量时,整个表达式的值被赋值到目标变量,这意味着:当一个变量的赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量
3、说出你所知道的数据库设计范式?常用的建模工具是什么?(mysql建模工具)
答:1NF:每一条满足原子性,不可以分割;2NF:每一条记录要满足唯一性,3NF:字段不冗余,有时我们还需要反三范式(直接相关,无传递性),常用的建模工具:phpMyAdmin,navicat for mysql,DOS命令行;
1、SESSION 保存在服务器的哪里?
答:通过php.ini指定,可存在指定目录的文件中或内存中,或数据库中!
2、服务端是如何获取客户端的cookie?
答:服务器每次处理请求的进候都可以抓取头信息的cookie并设置返回,
29、PHP常用的合并数组的方式?
答:array_mergn;array_mergn_recursive;
25、如何衡量AJAX的使用(何时使用AJAX)
答:AJAX既称无刷新技术,常用见的使用场景:表单验证,用户评分、点击;只要需要实时的与服务器交互时即可使用;
26、什么是推技术,实现原理是什么?
答:推技术又称COMET,即在客户请求时在服务器挂起长连接,一旦服务器有了新数据,它降立即反回给客户端,实时性好;
27、什么是垂直搜索,斯芬克斯中分词原理?
答:垂直搜索是指在特定的范围内搜索的上下文,搜索面只会越来越精细,而非越来越广泛;sphinx分词的原理:将文本拆分为多个单词从数据源的各个文档对像创建索引并将索引表存储于内存中!
28、sphinx中无法ha_sphinx.so是用来做什么的?
答:一个sphinx的存储模块;
29、PHP常用的合并数组的方式?
答:array_mergn;array_mergn_recursive;
23、Memcached的原理
答:memcached 是以守护程序方式运行于一个或多个服务器中,等待接收客户端的连接操作,客户端可以由各种语言编写(例如PHP)。PHP 等客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。
memcache最大只能存入1MB数据,memcache并非为存储大数据而生,但可以考虑在存储前将值先压缩或拆分成多值分配到多个key中!
21、HTTP 协议的原理,什么是全双工,什么是半双工?
答:HTTP协议是一种无状态的协义,直白的讲就是请求和响应,全双工是指请求和响应同时进行,半双工指单个执行;
20、你所知道的缓存技术有哪些,分别做下简单介绍
答:ob缓存,通过模板技术写入文件类缓存;memcache;redis;redis和memcache最显著的区别在于数据不仅并于内存中,同时还会在磁盘中生成文件,即使重启,数据亦可被加载;
19、PHP生成页面缓存的原理
答:将缓存内容放入OB缓存中,在OB缓存结束或脚本执行完毕后放入到程序缓存未尾并返回!
16、如何最快速的插入5000条以上的数据?
答:先生成数据文件,在用sql语句导入
15、请说出mysql常用存储引擎?memory存储引擎的特点?
答:Myisam、InnoDB、memory,memory的特点是将表存到内存中,数度快,重启后数据丢失!
9、说出你常用的版本控制器,SVN中需要配置哪几个配置文件
答:SVN,GIT,CVS;配置文件:mod_authz_svn.so mod_dav_svn.so移至服务器模块中并加载,配置权限,分配用户;
8、主从数据库的配置,都需要哪些基本的条件,需要配置什么内容?
答:基本条件:二台以上数据库服务器,
配置流程:1.分别打开主从服务器的bin-log;从服务器+relaylog
2.在主服务器根据需求建立相应的帐号并授权;
3.从服务器使用己创建好的帐号连接主服务器读取二进制文件并分析后同步
配置项:主:log-bin=mysql-bin;server-id=num(int);binlog-format=mixd/statement/row/
从:log_bin=mysql-bin;server-id=num(int)//唯一;relay_log=mysql-relay-bin;log_slave_updates=1;relay_only=1;
3、如何实现SESSION共享,共享的原理是什么?
答:配置主从数据库,将SESSION存入主数据库中,常见的做法还有在各服务器端安装MEMCAHCE,将SESSION存入各MEMCACHE中,
linux常见命令,我回答只用过 cp,cd ls,mv,wget

本文是一篇关于PHP和Web开发的面试经验分享,涵盖了数据提交方式、前端技术、AJAX优势、安全机制、Redis与Memcached的区别、数据库优化、PHP数组与字符串处理函数、进程状态、HTTP协议等内容。面试中强调了GET与POST的区别、网页前端技术如HTML、CSS和JavaScript、以及PHP处理时间和字符串的函数。此外,还讨论了安全措施,如防止SQL注入,以及PHP中的Session与Cookie区别。文章还提及了数据库设计范式和PHP MVC模式的理解。
3869

被折叠的 条评论
为什么被折叠?



