1.提交表格Get和Post的异同点
get 请求通常用于从服务端获取数据,post 一般向服务端提交数据
get 传输的参数在 url 传输参数大小有限
get 不安全,post 安全性比get高
get是显式,数据从url传输数据量小,安全性低;
post是隐式的,传输数据量大,安全性高
2、echo(),print(),print_r()的区别
echo是PHP语句, print和print_r是函数,句子没有返回值,函数可以有返回值
print() 只能打印简单类型变量的值(如int,string)
print_r() 复杂类型变量的值(如数组、对象)可以打印出来
echo 输出一个或者多个字符串
3.数组内置的排序方法
sort($array); ///数组升序排序
rsort($array); ///数组降序排序
asort($array); //根据值以升序排序相关数组
ksort($array); //根据建设,对相关数组进行升序排序
arsort($array); //根据值以降序排序相关数组
krsort($array); // 按键对相关数组进行排序
4、sql应子应该考虑哪些安全性?
(1)防止sql注入,转换特殊字符,过滤或使用预编译sql语句绑定
(2)使用最小权限原则,特别是不使用root账户、微不同的动作或操作建立不同的账户
(3)当sql错误时,不要将数据库错误信息暴露到客户端
5、优化mysql 数据库方法
(1)选择合适的字段,将打字段设置为NOT NULL,查询时不需要比较数据库NULL;
(2)使用链接(join)替代子查询;
(3)联合使用(UNION)手动创建临时表而不是查询;
(4)尽量减少使用(LIKE)关键字和通配符
(5)使用事务和外健
6.对于流量大的网站,用什么方法来解决访问量?
(1)首先确认服务器硬件是否满足支持当前流量的要求;
(2)优化数据库访问;
(三)禁止外部盗链;
(4)控制下载大文件;
(5)使用不同的主机分流;
(6)使用流量分析统计;
(7)尽量使用静态页,缓存
7、MySQL几个概念:主键、外键、索引、唯一索引
主键(primary key) 它可以识别表中某一行的属性或属性组。一个表只能有一个主键,但可以有多个候选索引。主键通常与外键构成参考完整性约束,以防止数据不一致。主键可以确保记录的唯一性和主键域非空。数据库管理系统自动生成主键的唯一索引,因此主键也是一个特殊的索引。
外键(foreign key) 它是一列或多列用于建立和加强两个表数据之间的链接。外键约束主要用于维持两个表之间数据的一致性。简而言之,表的外键是另一个表的主键,外键连接两个表。一般来说,要删除一个表中的主键,必须首先确保其他表中没有相同的外键(即表中的主键没有相关的外键)。
索引(index) 用于快速找到具有特定值的记录。主要是为了方便检索,加快访问速度, 根据某些规则创建的索引通常起到排序作用。所谓独特索引,与前面的普通索引基本相同,但有一个区别:索引列的所有值只能出现一次,即必须是唯一的。
总结:
主键必须是唯一索引,唯一索引不一定是主键。
表中可以有多个独特的索引,但只能有一个主键。
主键列不允许空值,而唯一索引列允许空值。
其他字段可以引用主键,而索引不能作为外键引用。
8、 mysql 引擎中的MyISAM与InnoDB的区别
以下是细节与具体实现的区别:
MyISAM与InnoDB的区别是什么?
8.1、存储结构
MyISAM:每个MyISAM将三个文件存储在磁盘上。第一个文件的名称从表的名称开始,扩展名称指出文件类型。.frm定义文件存储表。数据文件的扩展被称为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
InnoDB:所有的表都保存在同一数据文件中(或多个文件,或独立的表空间文件),InnoDB表的大小仅限于操作系统文件的大小,一般为2GB。
8.2、 存储空间
MyISAM:可压缩,存储空间小。支持静态表、动态表、压缩表三种不同的存储格式:静态表(默认情况下,但注意数据末尾不能有空间)。
InnoDB:高速缓冲数据和索引需要更多的内存和存储,它将在主内存中建立一个特殊的缓冲池。
8.3、 可移植、备份和恢复
MyISAM:数据以文件的形式存储,因此在跨平台的数据转移中非常方便。在备份和恢复时,可以单独操作一个表。
InnoDB:可以复制数据文件并备份免费方案 binlog,或者用 mysqldump,当数据量达到几十G时,就会相对痛苦。
8.4、 事务支持
MyISAM:强调性能,每次查询都有原子性,执行数量比InnoDB类型更快,但不提供事务支持。
InnoDB:提供高级数据库功能,如事务支持、外部键等。 具有事务(commit)、回滚(rollback)以及崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。
8.5、 AUTO_INCREMENT
MyISAM:联合索引可以与其他字段一起建立。发动机的自动增长列必须是索引。如果是组合索引,自动增长不能是第一列。他可以根据前几列进行排序并增加。
InnoDB:InnoDB它必须包含只有这个字段的索引。如果是组合索引,则必须是组合索引的第一列。
MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert如果加锁后的表符合要求,语句会自动加锁。insert新数据可以并发插入表的尾部。
InnoDB:支持事务和行级锁,是innodb最大的特点。行锁大大提高了多用户并发操作的新能量。InnoDB行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表。
8.7、 全文索引
MyISAM:支持 FULLTEXT全文索引类型
InnoDB:不支持FULLTEXT全文索引的类型,但是innodb可以使用sphinx插件支持全文索引,效果更好。
8.8、 表主键
MyISAM:索引是保存行的地址,允许没有索引和主键的表存。
InnoDB:如果不设置主键或非空索引,则自动生成6字节主键(用户看不见)。数据是主索引的一部分,附加索引保存了主索引的值。
8.9、 表的具体行数
MyISAM:如果有表的总行数保存,select count(*) from table;该值将直接取出。
InnoDB:如果使用无保存表的总行数select count(*) from table;它将遍历整个表,消耗相当大,但添加wehre条件后,myisam和innodb处理方法相同。
8.10、 CURD操作
MyISAM:若大量执行SELECT,MyISAM是更好的选择。
InnoDB:如果你的数据执行大量的数据,INSERT或UPDATE,考虑到性能,应使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB表格不会重建,而是一行一行删除innodb如果要清空保存大量数据的表,最好使用truncate table这个命令。
8.11、 外键
MyISAM:不支持
InnoDB:支持
通过以上分析,基本上可以考虑使用InnoDB来替代MyISAM原因是发动机InnoDB自身很多良好的特点,比如事务支持、存储 在很多并发的情况下,相信过程、视图、行级锁定等。InnoDB性能必须比较MyISAM强很多。此外,任何一种手表都不是万能的。只有根据业务类型选择合适的手表类型,才能充分发挥作用MySQL性能优势。假如不是很复杂Web应用程序,非关键应用程序,或者可以继续考虑MyISAM的,这个具体情况可以自己斟酌。
9、redis 和 memache 缓存的区别
总结一:
1.数据类型
Redis丰富的数据类型,支持set list等类型
memcache支持简单的数据类型,客户需要处理复杂的对象
2.持久性
redis支持数据持续存储
memcache不支持数据持久存储
3.分布式存储
redis支持master-slave复制模式
memcache可以使用一致性hash做分布式
value大小不同
memcache是一个内存缓存,key的长度小于250字符,单个item存储要小于1M,不适合虚拟机使用
4.数据一致性不同
redis使用的是单线程模型,保证了数据按顺序提交。
memcache需要使用cas保证数据一致性。CAS(Check and Set)是一个确保并发一致性的机制,属于“乐观锁”范畴;原理很简单:拿版本号,操作,对比版本号,如果一致就操作,不一致就放弃任何操作
5.cpu利用
redis单线程模型只能使用一个cpu,可以开启多个redis进程
总结二:
1.Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别。
2.Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。
3.Redis支持数据的备份,即master-slave模式的数据备份。
4.Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
我个人认为最本质的不同是Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcached只是简单的K/V缓存
总结三:
redis和memecache的不同在于:
1、存储方式:
memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小
redis有部份存在硬盘上,这样能保证数据的持久性。
2、数据支持类型:
redis在数据支持上要比memecache多的多。
3、使用底层模型不同:
新版本的redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
4、运行环境不同:
redis目前官方只支持Linux 上去行,从而省去了对于其它系统的支持,这样的话可以更好的把精力用于本系统 环境上的优化,虽然后来微软有一个小组为其写了补丁。但是没有放到主干上
memcache只能当做缓存,cache
redis的内容是可以落地的,就是说跟MongoDB有些类似,然后redis也可以作为缓存,并且可以设置master-slave
11、heredoc结构及用法
echo <<<EOT <html> <head><title>主页</title></head> <body>主页内容</body> </html> EOT;
注意:结束标识符所在的行不能包含任何其它字符除";"
12、nowdoc结构及用法
$str = <<<'EOD' Example of string spanning multiple lines using nowdoc syntax. EOD;
13、数据库中的事务是什么?
事务就是一系列的操作,这些操作完成一项任务。只要这些操作里有一个操作没有成功,事务就操作失败,发生回滚事件。即撤消前面的操作,这样可以保证数据的一致性。而且可以把操作暂时放在缓存里,等所有操作都成功有提交数据库,这样保证费时的操作都是有效操作
14、apche 和 nginx 的优缺
nginx轻量级,比apache占用更少的内存及资源,抗并发,nginx处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能。apache 相对于nginx 的优点:rewrite比nginx 的rewrite 强大,少bug,稳定。(需要性能用nginx,求稳定就apache)。
15、php 的垃圾回收机制
PHP 可以自动进行内存管理,清除不需要的对象。
PHP 使用了引用计数 (reference counting) GC 机制。
16、session 与 cookie 的区别和联系
http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户。 区别:
16.1、存放位置:Session 保存在服务器,Cookie 保存在客户端。
16.2、存放的形式:Session 是以对象的形式保存在服务器,Cookie 以字符串的形式保存在客户端。
16.3、 用途:Cookies 适合做保存用户的个人设置,爱好等,Session 适合做客户的身份验证
16.4、路径:Session 不能区分路径,同一个用户在访问一个网站期间,所有的 Session 在任何一个地方都可以访问到。而 Cookie 中如果设置了路径参数,那么同一个网站中不同路径下的 Cookie 互相是访问不到的。
16.5、安全性:Cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗,考虑到安全应当使用 session
16.6、大小以及数量限制:每个域名所包含的 cookie 数:IE7/8,FireFox:50 个,Opera30 个; Cookie 总大小:Firefox 和 Safari 允许 cookie 多达 4097 个字节,Opera 允许 cookie 多达 4096 个字 节,InternetExplorer 允许 cookie 多达 4095 个字节;一般认为 Session 没有大小和数量限制。
关系:
Session 需要借助 Cookie 才能正常工作。如果客户端完全禁止 Cookie,Session 将失效!因为 Session 是由应用服务器维持的一个 服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的 SessionID, 用该 SessionID 为标识符来存取服务器端的 Session 存储空间。而 SessionID 这一数据则是保存到客户端,用 Cookie 保存的,用户提交页面时,会将这一 SessionID 提交到服务器端,来存取 Session 数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用 Cookie,那么 Session 也会失效。
17、 PHP 页面重定向的方法
方法一:使用header
header('Location: http://www.baidu.com/') ;
方法二:利用meta
echo"<meta http-equiv=refresh content='0;url=网址'>";
18、长连接、短连接的区别和使用
长连接:client 方与 server 方先建立连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在。此种方式常用于 P2P 通信。
短连接:Client 方与 server 每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此方式常用于一点对多点通讯。C/S 通信。
长连接与短连接的使用时机:
长连接:
短连接多用于操作频繁,点对点的通讯,而且连接数不能太多的情况。每个 TCP 连 接的建立都需要三次握手,每个 TCP 连接的断开要四次握手。如果每次操作都要建立连接然后再操作的话处理速度会降低,所以每次操作下次操作时直接发送数据 就可以了,不用再建立 TCP 连接。例如:数据库的连接用长连接,如果用短连接频繁的通信会造成 socket 错误,频繁的 socket 创建也是对资源的浪 费。
短连接:
web 网站的 http 服务一般都用短连接。因为长连接对于服务器来说要耗费一定 的资源。像 web 网站这么频繁的成千上万甚至上亿客户端的连接用短连接更省一些资源。试想如果都用长连接,而且同时用成千上万的用户,每个用户都占有一个 连接的话,可想而知服务器的压力有多大。所以并发量大,但是每个用户又不需频繁操作的情况下需要短连接。
19、HTTP 协议详解、应用
http(超文本传输协议)是一个基于请求与响应模式的、无状态的、短连接、灵活、应用层的协议,常基于 TCP 的连接方式。
参考 https://blog.csdn.net/gueter/article/details/1524447
20、预定义变量(超级全局变量)
$GLOBALS
$_SERVER
$_GET
$_POST
$_COOKIE
$_SESSION
$_REQUEST
$_ENV
21、魔术变量
LINE
FILE
DIR
CLASS
FUNCTION
METHOD
NAMESPACE
22、常见的 web 攻击方式
常见攻击
XSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往 Web 页面里插入恶意 html 代码,当用户浏览该页之时,嵌入的恶意 html 代码会被执行,从而达到恶意用户的特殊 目的。XSS 属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性。但是随着前端技术的不断进步富客户端的应用越来越多,这方面的问题越来 越受关注。举个简单例子 : 假如你现在是 sns 站点上一个用户,发布信息的功能存在漏洞可以执行 js 你在 此刻输入一个 恶意脚本,那么当前所有看到你新信息的人的浏览器都会执行这个脚本弹出提示框 (很爽吧 弹出广告 :)),如果你做一些更为激进行为呢 后果难以想象。
CSRF (Cross Site Request Forgery),跨站点伪造请求。顾名思义就是 通过伪造连接请求在用户不知情的情况下,让用户以自己的身份来完成攻击者需要达到的一些目的。csrf 的攻击不同于 xss csrf 需要被攻击者的主动行为触发。这样听来似乎是有 “被钓鱼” 的嫌疑。
多窗口浏览器这这方面似乎是有助纣为虐的嫌疑,因为打开的新窗口是具有当前所有 会话的,如果是单浏览器窗口类似 ie6 就不会存在这样的问题,因为每个窗口都是一个独立的进程。举个简单例子 : 你正在玩白社会, 看到有人发了一个连接,你点击过去,然后这个连接里面伪造了一个送礼物的表单,这仅仅是一个简单的例子,问题可见一般。
cookie 劫持。通过获取页面的权限,在页面中写一个简单的到恶意站点的请 求,并携带用户的 cookie 获取 cookie 后通过 cookie 就可以直以被盗用户的身份登录站点。这就是 cookie 劫持。举个简单例子: 某人写了一篇很有意思的日志,然后分享给大家,很多人都点击查看并且分享了该日志,一切似乎都很正常,然而写日志的人却另有用心,在日志中偷偷隐藏了一个 对站外的请求,那么所有看过这片日志的人都会在不知情的情况下把自己的 cookie 发送给了 某人,那么他可以通过任意一个人的 cookie 来登录这个人的账户。
SQL 注入攻击
在 SQL 注入攻击 中,用户通过操纵表单或 GET 查询字符串,将信息添加到数据库查询中。
DNS 攻击
拒绝服务攻击
拒绝服务攻击即攻击者想办法让目标机器停止提供服务,是黑客常用的攻击手段之。
攻击者进行拒绝服务攻击,实际上让服务器实现两种效果:一是迫使服务器的缓冲区满,不接收新的请求;二是使用 IP 欺骗,迫使服务器把合法用户的连接复位,影响合法用户的连接
23、数据库设计经验,为什么进行分表?分库?一般多少数据量开始分表?分库?分库分表的目的?什么是数据库垂直拆分?水平拆分?分区等等
一:为什么要分表
当一张表的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO 等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。
二:分表的方案
23.1、做 mysql 集群,有人会问 mysql 集群,根分表有什么关系吗?虽然它不是实际意义上的分表,但是它启到了分表的作用,做集群的意义是什么呢?为一个数据库减轻负担,说白了就是减少 sql 排队队列中的 sql 的数量,举个例子:有 10 个 sql 请求,如果放在一个数据库服务器的排队队列中,他要等很长时间,如果把这 10 个 sql 请求,分配到 5 个数据库服务器的排队队列中,一个数据库服务器的队列中只有 2 个,这样等待时间是不是大大的缩短了呢?
linux mysql proxy 的安装,配置,以及读写分离
mysql replication 互为主从的安装及配置,以及数据同步
优点:扩展性好,没有多个分表后的复杂操作(php 代码)
缺点:单个表的数据量还是没有变,一次操作所花的时间还是那么多,硬件开销大。
23.2、垂直分割就是按字段分。水平分割。就是按记录分
24、数据库优化
24.1、检查优化索引的使用
24.2、避免出现 SELECT * FROM table 语句,要明确查出的字段。
24.3、应绝对避免在 order by 子句中使用表达式。
24.4、小心使用 IN 和 OR,需要注意 In 集合中的数据量。建议集合中的数据不超过 200 个。
24.5、<> 用 < 、> 代替,> 用 >= 代替,< 用 <= 代替,这样可以有效的利用索引
24.6、在查询时尽量减少对多余数据的读取包括多余的列与多余的行
24.7、多表关联查询时,写法必须遵循以下原则,这样做有利于建立索引,提高查询效率。格式如下
select sum(table1.je) from table1 table1, table2 table2, table3 table3 where (table1的等值条件(=)) and(table1的非等值条件) and (table2与table1的关联条件) and (table2的等值条件) and (table2的非等值条件) and(table3与table2的关联条件) and (table3的等值条件) and (table3的非等值条件)。
24.8、如果在语句中有 not in(in)操作,应考虑用 not exists(exists)来重写,最好的办法是使用外连接实现。
24.9、选取最适用的字段属性 ,MySQL 可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。
25、如何设计一个高并发的系统
① 数据库的优化,包括合理的事务隔离级别、SQL 语句优化、索引的优化
② 使用缓存,尽量减少数据库 IO
③ 分布式数据库、分布式缓存
④ 服务器的负载均衡
26、mySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据
相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略(回收策略)。redis 提供 6 种数据淘汰策略:
volatile-lru:从已设置过期时间的数据集(server.db [i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db [i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db [i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db [i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db [i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
27、写出一个能创建多级目录的PHP函数(新浪网技术部)
<?php
/** * 创建多级目录 * @param $path string 要创建的目录 * @param $mode int 创建目录的模式,在windows下可忽略 */
function create_dir($path,$mode = 0777)
{
if (is_dir($path)) {
# 如果目录已经存在,则不创建
echo "该目录已经存在";
} else {
# 不存在,创建
if (mkdir($path,$mode,true)) {
echo "创建目录成功";
} else {
echo "创建目录失败";
}
}
}
?>
28、抓取远程图片到本地
file_get_contents或者curl
29、请写一段PHP代码,确保多个进程同时写入同一个文件成功
<?php
$fp = fopen("lock.txt","w+");
if (flock($fp,LOCK_EX)) {
//获得写锁,写数据
fwrite($fp, "write something");
// 解除锁定
flock($fp, LOCK_UN);
} else {
echo "file is locking...";
}
fclose($fp);
?>
30、写一个函数,尽可能高效的,从一个标准url里取出文件的扩展名
// 方案一
function getExt1($url){
$arr = parse_url($url);
//Array ( [scheme] => http [host] => www.sina.com.cn [path] => /abc/de/fg.php [query] => id=1 )
$file = basename($arr['path']);
$ext = explode('.', $file);
return $ext[count($ext)-1];
}
31、编写一个函数,递归遍历,实现无限分类
<?php
function tree($arr,$pid=0,$level=0){
static $list = array();
foreach ($arr as $v) {
//如果是顶级分类,则将其存到$list中,并以此节点为根节点,遍历其子节点
if ($v['parent_id'] == $pid) {
$v['level'] = $level;
$list[] = $v;
tree($arr,$v['cat_id'],$level+1);
}
}
return $list;
}
?>
32、有一个网页地址,比如PHP开发资源网主页:http://www.phpres.com/index.html,如何得到它的内容?
方法1(对于PHP5及更高版本):
$readcontents=fopen("http://www.phpres.com/index.html","rb");
$contents=stream_get_contents($readcontents);
fclose($readcontents);
echo $contents;
方法2:
echo file_get_contents("http://www.phpres.com/index.html");
33、请写一个函数验证电子邮件的格式是否正确(使用正则)
preg_match('/^[\w\-\.]+@[\w\-]+(\.\w+)+$/',$email);
34、请写出并说明如何在命令行下运行PHP脚本(写出两种方式)同时向PHP脚本传递参数?
首先进入php安装目录 php -f d:/wamp/www/1.php 其中-f参数指定要执行的php文件 php -r phpinfo(); 其中-r表示直接执行php代码,无需写开始结束标记
35、PHP中,如何获得一个数组的键值
使用key()可以获得数组中当前元素的键名,使用current()则可以返回当前元素的值。 使用array_keys()则可以得到数组中所有的键名。 使用foreach结构foreach($arr as value)可以通过value分别获取键名和值。
36、在url中用get传值的时候,若中文出现乱码,应该用哪个函数对中文进行编码?
urlencode()
37、写出五种以上你使用过的PHP的扩展的名称(提示:常用的PHP扩展)
mb_sring、iconv、curl、GD、XML、socket、MySQL、PDO等
38、什么是面向对象?主要特征是什么?
注:面向对象
面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。优点:灵活性、重用性、拓展性。
39、HTTP 状态中302、403、 500代码含义?
一二三四五原则: 一. 消息系列 二 成功系列 三. 重定向系列 四. 请求错误系列 五. 服务器端错误系列
302:临时转移成功,请求的内容已转移到新位置 403:禁止访问 500:服务器内部错误 401代表未授权。
40、Linux 下建立压缩包,解压缩包的命令
Tar.gz:
打包: tar czf file.tar.gz file.txt
解压: tar xzf file.tar.gz
Bz2:
打包: bzip2 [-k] 文件
解压: bunzip2 [-k] 文件
Gzip(只对文件,不保留原文件)
打包: gzip file1.txt
解压: gunzip file1.txt.gz
Zip: -r 对目录
打包: zip file1.zip file1.txt
解压: unzip file1.zip
41、isset() 和 empty() 区别
Isset判断变量是否存在,可以传入多个变量,若其中一个变量不存在则返回假,empty判断变量是否为空为假,只可传一个变量,如果为空为假则返回真。
42、对于缓存技术的了解
缓存技术是将动态内容缓存到文件中,在一定时间内访问动态页面直接调用缓存文件,而不必重新访问数据库。
43、设置COOKIE的值:
Setcookie(名称,值,保存时间,有效域);
44、面向对象中接口和抽象类的区别及应用场景?
44.1、有抽象方法的类叫做抽象类,抽象类中不一定只有抽象方法,抽象方法必须使用abstract关键字定义。
44.2、接口中全部是抽象方法,方法不用使用abstract定义。
44.3、当多个同类的类要设计一个上层,通常设计为抽象类,当多个异构的类要设计一个上层,通常设计为接口。
45、什么是模板技术、能够使HTML和PHP分离开使用的模板?
模板技术就是使程序的逻辑代码和界面分开的技术。
能够使HTML和PHP分开的模板有:Smarty、Template、PHPlib Template、FastTemplate
46、魔术方法并说明作用
__call()当调用不存在的方法时会自动调用的方法
__autoload()在实例化一个尚未被定义的类是会自动调用次方法来加载类文件
__set()当给未定义的变量赋值时会自动调用的方法
__get()当获取未定义变量的值时会自动调用的方法
__construct()构造方法,实例化类时自动调用的方法
__destroy()销毁对象时自动调用的方法
__unset()当对一个未定义变量调用unset()时自动调用的方法
__isset()当对一个未定义变量调用isset()方法时自动调用的方法
__clone()克隆一个对象
__tostring()当输出一个对象时自动调用的方法
__callStatic()
__sleep()
__wakeup()
__toString()
__set_state()
47、预定义变量
$_REQUEST用来获取post或get方式提交的值
$_POST用来获取post方式提交的值
$_GET用来获取get方式提交的值
$_COOKIE用来获取cookie存储的值
$_SESSION用来获取session存储的值
$_FILES用来获取上传文件表单的值
48、框架中什么是单一入口和多入口,单一入口的优缺点
1、多入口就是通过访问不同的文件来完成用户请求。
单一入口指web程序所有的请求都指向一个脚本文件的。
2、单一入口更容易控制权限,方便对http请求可以进行安全性检查。
缺点:URL看起来不那么美观,特别是对搜索引擎来说不友好。
49、索引的目的
1、快速访问数据表中的特定信息,提高检索速度
2、创建唯一性索引,保证数据库表中每一行数据的唯一性
3、加速表和表之间的连接
4、使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间
使用索引负面影响:创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改的时候索引也要动态维护,这样就降低了数据的维护速度。
50、防御攻击
50.1、XSS是跨站脚本攻击,首先是利用跨站脚本漏洞以一个特权模式去执行攻击者构造的脚本,然后利用不安全的Activex控件执行恶意的行为。
使用htmlspecialchars()函数对提交的内容进行过滤,使字符串里面的特殊符号实体化。
50.2、SQL注入产生的原因:程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。
防止SQL注入:
1、开启配置文件中的magic_quotes_gpc和magic_quotes_runtime设置
2、执行sql语句时使用addslashes进行sql语句转换
3、Sql语句书写尽量不要省略小引号和单引号
4、过滤掉sql语句中的一些关键字:update、insert、delete、select、*
5、提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。
6、Php配置文件中设置register_globals为off,关闭全局变量注册
7、控制错误信息,不要再浏览器上输出错误信息,将错误信息写到日志文件中。
51、冒泡排序,面试前一定要记住哦!
function maopao($arr)
{
$len = count($arr);
$n = count($arr) - 1;
for ($i = 0; $i < $len; $i++) {
for ($j = 0; $j < $n; $j++) {
if ($arr[$j] > $arr[$j + 1]) {
$tmp = $arr[$j];
$arr[$j] = $arr[$j + 1];
$arr[$j + 1] = $tmp;
}
}
}
return $arr;
}
52、快速排序,面试前一定要记住哦!
function quick_sort($array) {
if (count($array) <= 1) return $array;
$key = $array[0];
$left_arr = array();
$right_arr = array();
for ($i=1; $i
if ($array[$i] <= $key)
$left_arr[] = $array[$i];
else
$right_arr[] = $array[$i];
}
$left_arr = quick_sort($left_arr);
$right_arr = quick_sort($right_arr);
return array_merge($left_arr, array($key), $right_arr);
}
53、MySQL数据库的常用存储引擎以及它们的区别?
MyISAM:不支持事务,表锁,易产生碎片,要经常优化,读写速度较快,支持全文索引。
InnoDB:支持事务,行锁,有崩溃恢复能力。读写速度比MyISAM慢,5.6之后支持全文索引。 存储引擎是基于表的,而不是数据库
54、PHP的基本变量类型
四种标量类型:boolean (布尔型)、integer (整型)、float (浮点型, 也称作 double)、string (字符串)
两种复合类型:array (数组)、object (对象)
最后是两种特殊类型:resource(资源)、NULL(NULL)
55、静态化如何实现的?伪静态如何实现?
1、 静态化指的是页面静态化,也即生成实实在在的静态文件,也即不需要查询数据库就可以直接从文件中获取数据,指的是真静态。 实现方式主要有两种:
一种是我们在添加信息入库的时候就生成的静态文件,也称为模板替换技术。
一种是用户在访问我们的页面时先判断是否有对应的缓存文件存在,如果存在就读缓存,不存在就读数据库,同时生成缓存文件。
2、伪静态不是真正意义上的静态化,之所以使用伪静态,主要是为了SEO推广,搜索引擎对动态的文件获取难度大,不利于网站的推广。实习原理是基于Apache或Nginx的rewrite机智 主要有两种方式:
一种是直接在配置虚拟机的位置配置伪静态,这个每次修改完成后需要重启web服务器。
另一种采用分布式的,可以在网站的根目录上创建.htaccess的文件,在里面配置相应的重写规则来实现伪静态,这种每次重写时不需要重启web服务器,且结构上比较清晰。
56、如何处理负载,高并发?
1、HTML静态化 效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。
2、图片服务器分离 把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如七牛等
3、数据库集群和库表散列及缓存 数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。
4、镜像: 尽量减少下载,可以把不同的请求分发到多个镜像端。
5、负载均衡: Apache的最大并发连接为1500,只能增加服务器,可以从硬件上着手,如F5服务器。当然硬件的成本比较高,我们往往从软件方面着手。
57、MySQL主从备份的原理?
mysql支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器
58、常见的 PHP 安全性攻击
1.SQL注入:用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行。 防止:
使用mysql_real_escape_string()过滤数据
手动检查每一数据是否为正确的数据类型
使用预处理语句并绑定变量
参数化SQL:是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,用@或?来表示参数。
2.XSS攻击 :跨站点脚本攻击,由用户输入一些数据到你的网站,其中包括客户端脚本(通常JavaScript)。如果你没有过滤就输出数据到另一个web页面,这个脚本将被执行。 防止:为了防止XSS攻击,使用PHP的htmlentities()函数过滤再输出到浏览器。
3.CSRF:跨站点请求伪造,是指一个页面发出的请求,看起来就像是网站的信任用户,但是是伪造的 防止:一般来说,确保用户来自你的表单,并且匹配每一个你发送出去的表单。有两点一定要记住:
对用户会话采用适当的安全措施,例如:给每一个会话更新id和用户使用SSL。
生成另一个一次性的令牌并将其嵌入表单,保存在会话中(一个会话变量),在提交时检查它。 如laravel中的 _token
代码注入:代码注入是利用计算机漏洞通过处理无效数据造成的。问题出在,当你不小心执行任意代码,通常通过文件包含。写得很糟糕的代码可以允许一个远程文件包含并执行。如许多PHP函数,如require可以包含URL或文件名。 防止代码注入
过滤用户输入
在php.ini中设置禁用allow_url_fopen和allow_url_include。这将禁用require/include/fopen的远程文件
59、TP框架的优点与特性
优点:TP框架是我们中国人自己开发的框架,各种资料比较齐全,国内用的比较多,比较简单和方便,而且是免费开源的
特性: 1.多表查询非常方便,在model中几句代码就可以完成对多表的关联操作
2.融合了smarty模板,使前后台分离
3.支持多种缓存技术,尤其对memcache技术支持非常好
4.命名规范,模型,视图,控制器严格遵循命名规则,通过命名一一对应
5.支持多种url模式
6.内置ajax返回方法,包括xml,json,html等
7.支持应用扩展,类库扩展,驱动扩展等
60、如何解决异常处理
答: 抛出异常:使用try…catch,异常的代码放在try代码块内,如果没有触发异常,则代码继续执行,如果异常被触发,就会 抛出一个异常。Catch代码块捕获异常,并创建一个包含异常信息的对象。$e->getMessage(),输出异常的错误信息。
解决异常: