1、 SESSION 与 COOKIE的区别是什么,请从协议,产生的原因与作用说明?

1、http是无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户。
2、SESSION存储在服务器端,COOKIE保存在客户端。Session比较安全,cookie用某些手段可以修改,不安全。Session依赖于cookie进行传递。
3、禁用cookie后,session不能正常使用。Session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php的配置文件的session.save_path指定。Session文件是公有的。

2、varchar 和 char有什么区别?

1、char是固定长度的字符类型,分配多少空间,就占用多长空间。 
2、varchar是可变长度的字符类型,内容有多大就占用多大的空间,能有效节省空间。
3、由于varchar类型是可变的,所以在数据长度改变的时,服务器要进行额外的操作,所以效率比char类型低。

3、常用到的mysql命令?

`Show databases`
`Show tables`
`Insert into 表名() values()`
`Update 表名 set 字段=where ...`
`Delete from 表名 where ...`
`Select * from 表名 where 条件 order by ... Desc/asc limit ... Group by ... Having ...`
  • 进入mysql管理命令行的命令?
mysql -uroot -p 回车 密码
  • show databases; 这个命令的作用?
显示当前mysql服务器中有哪些数据库
  • show create database mysql; 这个命令的作用?
显示创建数据库的sql语句
  • show create table user; 这个命令的作用?
显示创建表的sql语句
  • desc user; 这个命令的作用?
查询user表的结构
  • explain select * from user; 这个命令的作用?
获取select相关信息
  • show processlist; 这个命令的作用?
显示哪些线程正在运行
  • SHOW VARIABLES; 这个命令的作用?
显示系统变量和值
  • SHOW VARIABLES like ’%conn%’; 这个命令的作用?
显示系统变量名包含conn的值
  • LEFT JOIN 写一个SQL语句?
SELECT A.id,A.class FROM A LEFT JOIN B ON A.cid=B.id

4、对于大流量的站点,一般会采用什么策略来优化?

1、确定当前服务器设备是否满足流量需求。(检查硬件负载情况,正常满载应控制在70~80%)
2、使用流量统计软件统计(百度统计啥的)分析网站流量,可以知道哪些地方耗费了大量的流量,哪些页面需要再进行优化。(优化程序逻辑、若有计算就优化算法看看,优化数据库,排查慢sql)
3、引入缓存技术,把动态内容缓存到文件中,动态网页直接调用这些文件,而不必再访问数据库。
4、禁止外部盗链,图片和文件外部盗链会给服务器带来大量的负载压力,可以通过refer来禁止外部盗链,或者使用apache来配置禁止盗链。
5、控制大文件的下载,大文件的下载对于非SCSI硬盘来说会占用大量的资源,导致服务器的响应能力下降。
6、使用不同的主机分流主要流量,使服务器均衡负载。(前面都优化过的情况,就只能增加硬件,做分流)

5、写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。

function my_scandir($dir){
$files = array();
if ( $handle = opendir($dir) ){
while ( ($file = readdir($handle)) !== false ) {
if ( $file != ".." && $file != "." ) {
if ( is_dir($dir . "/" . $file) ) {
$files[$file] = scandir($dir . "/" . $file);
}else {
$files[] = $file;
}
}
}
closedir($handle);
return $files;
}
}

6、写几个魔术方法并说明作用?

__call():当调用不存在的方法时会自动调用的方法
__autoload():在实例化一个尚未被定义的类是会自动调用次方法来加载类文件
__set():当给未定义的变量赋值时会自动调用的方法
__get():当获取未定义变量的值时会自动调用的方法
__construct():构造方法,实例化类时自动调用的方法
__destroy():销毁对象时自动调用的方法
__unset():当对一个未定义变量调用unset()时自动调用的方法
__isset():当对一个未定义变量调用isset()方法时自动调用的方法
__clone():克隆一个对象
__tostring():当输出一个对象时自动调用的方法

7、整理记录一些常见的php面试题(一)_缓存_POST、整理记录一些常见的php面试题(一)_缓存_02_COOKIE、整理记录一些常见的php面试题(一)_php_03_FILES的意思是什么?

$_REQUEST:用来获取post或get方式提交的值
$_POST:用来获取post方式提交的值
$_GET:用来获取get方式提交的值
$_COOKIE:用来获取cookie存储的值
$_SESSION:用来获取session存储的值
$_FILES:用来获取上传文件表单的值

8、关于mysql关系型数据库索引的问题。

  • 索引的目的是什么?
a、快速访问数据表中的特定信息,提高检索速度
b、创建唯一性索引,保证数据库表中每一行数据的唯一性
c、加速表和表之间的连接
d、使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间
  • 索引对数据库系统的负面影响是什么?
a、创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;
b、索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;
c、当对表进行增、删、改的时候索引也要动态维护,这样就降低了数据的维护速度。
  • 为数据表建立索引的原则有哪些?
a、在最频繁使用的、用以缩小查询范围的字段上建立索引
b、在频繁使用的、需要排序的字段上建立索引
  • 什么情况下不宜建立索引?
a、对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引
b、对于一些特殊的数据类型,不宜建立索引,比如文本字段(text),值范围较少的知道等。

9、SQL注入漏洞产生的原因?如何避免?

产生原因:程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。
措施:

1、 客户端提交的数据进行过滤、特殊符号语义化等。(源头输入过滤)
2、 执行sql语句*时*使用addslashes进行sql语句转换
3、 过滤掉sql语句中的一些关键字:update、insert、delete、select、*
4、 控制错误信息,不要再浏览器上输出错误信息,将错误信息写到日志文件中。
5、 提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。
6、 开启配置文件中的magic_quotes_gpc和magic_quotes_runtime设置
7、 Php配置文件中设置register_globals为off,关闭全局变量注册

10、get和post区别

1、get,url参数可见,post,url参数不可见。
2、get通过url拼接传递参数,post通过请求body体传递。
3、get请求是可以缓存的,post请求不可以缓存。
4、get请求页面后退不产生影响,post请求页面后退会重新提交。
5、get一般传输数据大小不超过2K~4K,post请求传输数据的大小根据php.ini 配置文件设定。
6、get请求将header和data一起发送,服务器响应200则返回数据。post请求浏览器先发送header,服务器响应100,浏览器再发送data,服务器响应200则返回数据。

11、reqiure与include的区别?

require如果包含文件出错会报致命错误并且停止运行,而include会报Notice错误,程序继续运行。require_once会检查是否重复包含,如果已经包含则不再执行,include同理。

12、数据库事务及其特性?

事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。
事务特性( ACID):

(1)原子性(Atomicity):即不可分割性,事务要么全部被执行,要么就全部不被执行。

(2)一致性(Consistency):事务的执行使得数据库从一种正确状态转换成另一种正确状态

(3)隔离性(Isolation):在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,

(4)持久性(Durability):事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

13、PDO连接MySQL实例

$dbms='mysql';     //数据库类型
$host='localhost'; //数据库主机名
$dbName='test'; //使用的数据库
$user='root'; //数据库连接用户名
$pass=''; //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";
try {
$dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象
echo "连接成功<br/>";
/*你还可以进行一次搜索操作
foreach ($dbh->query('SELECT * from FOO') as $row) {
print_r($row); //你可以用 echo($GLOBAL); 来看到这些值
}
*/
$dbh = null;
} catch (PDOException $e) {
die ("Error!: " . $e->getMessage() . "<br/>");
}
//默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:
$db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));

14、redis为什么快?

1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
4、使用多路I/O复用模型,非阻塞IO;
5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;

15、redis 常见的数据类型?及常见的应用场景?

数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
string:是 redis 最基本的类型,可等于Memcached的类型,都是key => value,最大存储长度512M。常见应用:常规key=>value缓存、计数、粉丝数、文章数等。
hash: 是一个键值(key => value)对集合,特别适合用于存储对象。类似 用户id => {name:'bob',age:'15'} , 取值:hget 用户id name 输出bob。应用:存储部分可变数据,类似用户信息、商品信息等。
list: 是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。先入先出,比较多用于做队列情况。
set: 是string类型的无序集合不重复。应用:微博共同关注、共同好友等
sorted set :应用带权重的数据队列,做优先级、类任务插队处理

16、关于缓存穿透、缓存击穿、缓存雪崩的理解及解决方案。

缓存穿透:key中对应的缓存数据不存在,导致去请求数据库,造成数据库的压力倍增的情况
解决方案:常规是用布隆过滤器拦截数据,也可以将空数据也做成缓存。
缓存击穿:redis过期后的一瞬间,有大量用户请求同一个缓存数据,导致这些请求都去请求数据库,造成数据库压力倍增的情,针对一个key而言
解决方案:用互斥锁来做,多个同时请求,只发一个,其它请求等待第一个完成后再请求。
缓存雪崩:缓存服务器宕机或者大量缓存集中某个时间段失效,导致请求全部去到数据库,造成数据库压力倍增的情况,这个是针对多个key而言
解决方案:将key的过期时间,做成随机,避免大量key同时过期。我觉得这个可以在此基础多做一个检查缓存数据是否过期或临近过期,然后针对这些key,重新查询,重新设置缓存时间

未完待续。过几天再接着更新