这篇文章介绍的内容是关于PHP 经典面试题集 PHP 经典面试题集,有着必定的参考价值,如今分享给你们,有须要的朋友能够参考一下javascript
结合我本身面试状况,面对的一些php面试题列举出来,基本上结合本身的见解回答的,不妥的地方请你们指出去,与你们一块儿讨论分析,也但愿能帮到正在面试的童鞋们:php
1.表单提交中的Get和Post的异同点
get 请求通常用于向服务端获取数据,post 通常向服务端提交数据html
get 传输的参数在 url 中,传递参数大小有限制,post 没有大小限制,java
get 不安全,post 安全性比get高mysql
get请求在服务端用Request.queryString 接受 ,post 请求在服务端用Requset.form 接受nginx
2.HTML的base标签是干什么用的
必须写在head 中, base 标签为页面上的全部连接规定默认地址或默认目标程序员
3.echo(),print(),print_r()的区别?
echo是PHP语句, print和print_r是函数,语句没有返回值,函数能够有返回值(即使没有用)面试
print() 只能打印出简单类型变量的值(如int,string)正则表达式
print_r() 能够打印出复杂类型变量的值(如数组,对象)redis
echo 输出一个或者多个字符串
4.写一个email的正则表达式
/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
5.数组[‘a’, ‘b’, ‘c’] 转换成字符串 ‘abc’
echo implode(‘’,[‘a’, ‘b’, ‘c’]);
echo join([‘a’, ‘b’, ‘c’],'');
6.获取字符串’aAbB’中A首次出现的位置
$str=‘aAbB’;
echo strpos($str,"A");
7. 编写一段用最小代价实现将字符串彻底反序, e.g. 将 “1234567890” 转换成 “0987654321”. (用前述你最熟悉的语言编写并标注简单注释, 不要使用函数,
$s = '1234567890';
$o = '';
$i = 0;
while(isset($s[$i]) && $s[$i] != null) {
$o = $s[$i++].$o;
}
echo $o;
8.请用递归实现一个阶乘求值算法 F(n): n=5;F(n)=5!=5*4*3*2*1=120
function F($n){
if($n==0){
return 1;
}else{
return $n* F($n-1);
}
}var_dump(F(5));
9.将字符长fang-zhi-gang 转化为驼峰法的形式:FangZhiGang
//方法一
function Fun($str){
if(isset($str) && !empty($str)){
$newStr='';
if(strpos($str,'-')>0){
$strArray=explode('-',$str);
$len=count($strArray);
for ($i=0;$i<$len;$i++){
$newStr.=ucfirst($strArray[$i]);
}
}
return $newStr; }
}
//方法二function Fun($str){
$arr1=explode('_',$str);
$str = implode(' ',$arr1);
return ucwords($str);
}
var_dump(Fun("fang-zhi-gang")); //FangZhiGang
10.数组内置的排序方法有哪些?
sort($array); //数组升序排序
rsort($array); //数组降序排序
asort($array); //根据值,以升序对关联数组进行排序
ksort($array); //根据建,以升序对关联数组进行排序
arsort($array); //根据值,以降序对关联数组进行排序
krsort($array); // 根据键,以降序对关联数组进行排序
11.用PHP写出显示客户端IP与服务器IP的代码
$_SERVER["REMOTE_ADDR"]
$_SERVER["SERVER_ADDR"]
12.语句include和require的区别是什么?为避免屡次包含同一文件,可用(?)语句代替它们?
require是无条件包含也就是若是一个流程里加入require,不管条件成立与否都会先执行require
include有返回值,而require没有(可能由于如此require的速度比include快)
包含文件不存在或者语法错误的时候require是致命的错误终止执行,include不是
13.session与cookie的区别?
session:储存用户访问的全局惟一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放
cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cookie来讲是存储在用户WIN的Temp目录中的。
二者均可经过时间来设置时间长短
14.PHP 不使用第三个变量实现交换两个变量的值
//方法一
$a.=$b;
$b=str_replace($b,"",$a);
$a=str_replace($b,"",$a);
//方法二
list($b,$a)=array($a,$b);
var_dump($a,$b);
15.写一个方法获取文件的扩展名
function get_extension($file){
//方法一
return substr(strrchr($file,'.'), 1);
//方法二
return end(explode('.', $file));
}echo get_extension('fangzhigang.png'); //png
16.用PHP打印出前一天的时间格式是2017-3-22 22:21:21
$a= date("Y-m-d H:i:s", strtotime("-1 days"));
17.sql语句应该考虑哪些安全性
(1)防止sql注入,对特殊字符进行转义,过滤或者使用预编译sql语句绑定
(2)使用最小权限原则,特别是不要使用root帐户,微不一样的动做或者操做创建不一样的帐户
(3)当sql出错时,不要把数据库出错的信息暴露到客户端
18.优化mysql 数据库方法
(1)选取适当的字段,打字段设置为NOT NULL,在查询的时候数据库不用比较NULL;
(2)使用连接(join)代替子查询;
(3)使用联合(UNION)查询代替手动建立临时表;
(4)尽可能减小使用(LIKE)关键字和通配符
(5)使用事务和外健
19.对于大流量的网站,你会采用什么方法来解决访问量?
(1)首先确认服务器硬件是否知足支持当前的流量;
(2)优化数据库的访问;
(3)禁止外部盗链;
(4)控制大文件下载;
(5)使用不一样的主机分流;
(6)使用流量分析统计;
20.mysql_fetch_row() 和mysql_fetch_array之间有什么区别?
这两个函数,返回的都是一个数组,区别就是第一个函数返回的数组是只包含值,咱们只能$row[0],$row[1],这样以数组下标来读取数据,
而MySQL_fetch_array()返回的数组既包含第一种,也包含键值对的形式,咱们能够这样读取数据,(假如数据库的字段是 username,passwd):$row['username']$row['passwd']
21.MySQL的几个概念:主键,外键,索引,惟一索引
主键(primary key) 可以惟一标识表中某一行的属性或属性组。一个表只能有一个主键,但能够有多个候选索引。主键经常与外键构成参照完整性约束,防止出现数据不一致。主键能够保证记录的惟一和主键域非空,数据库管理系统对于主键自动生成惟一索引,因此主键也是一个特殊的索引。
外键(foreign key) 是用于创建和增强两个表数据之间的连接的一列或多列。外键约束主要用来维护两个表之间数据的一致性。简言之,表的外键就是另外一表的主键,外键将两表联系起来。通常状况下,要删除一张表中的主键必须首先要确保其它表中的没有相同外键(即该表中的主键没有一个外键和它相关联)。
索引(index) 是用来快速地寻找那些具备特定值的记录。主要是为了检索的方便,是为了加快访问速度, 按必定的规则建立的,通常起到排序做用。所谓惟一性索引,这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的全部值都只能出现一次,即必须惟一。
总结:
主键必定是惟一性索引,惟一性索引并不必定就是主键。
一个表中能够有多个惟一性索引,但只能有一个主键。
主键列不容许空值,而惟一性索引列容许空值。
主键能够被其余字段做外键引用,而索引不能做为外键引用。
22.mysql数据库引擎有哪些?
MyISAM、 ISAM、HEAP、InnoDB、BDB、CVS...
23.谈谈你对 mysql 引擎中的MyISAM与InnoDB的区别理解?
InnoDB和MyISAM是许多人在使用MySQL时最经常使用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差异为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,可是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
如下是一些细节和具体实现的差异:
MyISAM与InnoDB的区别是什么?
一、 存储结构
MyISAM:每一个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
InnoDB:全部的表都保存在同一个数据文件中(也多是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操做系统文件的大小,通常为2GB。
二、 存储空间
MyISAM:可被压缩,存储空间较小。支持三种不一样的存储格式:静态表(默认,可是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。
InnoDB:须要更多的内存和存储,它会在主内存中创建其专用的缓冲池用于高速缓冲数据和索引。
三、 可移植性、备份及恢复
MyISAM:数据是以文件的形式存储,因此在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操做。
InnoDB:免费的方案能够是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。
四、 事务支持
MyISAM:强调的是性能,每次查询具备原子性,其执行数度比InnoDB类型更快,可是不提供事务支持。
InnoDB:提供事务支持事务,外部键等高级数据库功能。 具备事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。
五、 AUTO_INCREMENT
MyISAM:能够和其余字段一块儿创建联合索引。引擎的自动增加列必须是索引,若是是组合索引,自动增加能够不是第一列,他能够根据前面几列进行排序后递增。
InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增加列必须是索引,若是是组合索引也必须是组合索引的第一列。
六、 表锁差别
MyISAM:只支持表级锁,用户在操做myisam表时,select,update,delete,insert语句都会给表自动加锁,若是加锁之后的表知足insert并发的状况下,能够在表的尾部插入新的数据。
InnoDB:支持事务和行级锁,是innodb的最大特点。行锁大幅度提升了多用户并发操做的新能。可是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。
七、 全文索引
MyISAM:支持 FULLTEXT类型的全文索引
InnoDB:不支持FULLTEXT类型的全文索引,可是innodb可使用sphinx插件支持全文索引,而且效果更好。
八、 表主键
MyISAM:容许没有任何索引和主键的表存在,索引都是保存行的地址。
InnoDB:若是没有设定主键或者非空惟一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。
九、 表的具体行数
MyISAM:保存有表的总行数,若是select count(*) from table;会直接取出出该值。
InnoDB:没有保存表的总行数,若是使用select count(*) from table;就会遍历整个表,消耗至关大,可是在加了wehre条件后,myisam和innodb处理的方式都同样。
十、 CURD操做
MyISAM:若是执行大量的SELECT,MyISAM是更好的选择。
InnoDB:若是你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会从新创建表,而是一行一行的删除,在innodb上若是要清空保存有大量数据的表,最好使用truncate table这个命令。
十一、 外键
MyISAM:不支持
InnoDB:支持
经过上述的分析,基本上能够考虑使用InnoDB来替代MyISAM引擎了,缘由是InnoDB自身不少良好的特色,好比事务支持、存储 过程、视图、行级锁定等等,在并发不少的状况下,相信InnoDB的表现确定要比MyISAM强不少。另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优点。若是不是很复杂的Web应用,非关键应用,仍是能够继续考虑MyISAM的,这个具体状况能够本身斟酌。
24. 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的不一样在于:
一、存储方式:
memecache 把数据所有存在内存之中,断电后会挂掉,数据不能超过内存大小
redis有部份存在硬盘上,这样能保证数据的持久性。
二、数据支持类型:
redis在数据支持上要比memecache多的多。
三、使用底层模型不一样:
新版本的redis直接本身构建了VM 机制 ,由于通常的系统调用系统函数的话,会浪费必定的时间去移动和请求。
四、运行环境不一样:
redis目前官方只支持Linux 上去行,从而省去了对于其它系统的支持,这样的话能够更好的把精力用于本系统 环境上的优化,虽而后来微软有一个小组为其写了补丁。可是没有放到主干上
memcache只能当作缓存,cache
redis的内容是能够落地的,就是说跟MongoDB有些相似,而后redis也能够做为缓存,而且能够设置master-slave
25.表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列不然选择B列,当B列大于C列时选择B列不然选择C列。
drop table table1 create table table1(
a int,
b int,
c int ) insert into table1 values(22,24,23)
select * from table1
select (case when a>b then a else b end),(case when b>c then b else c end) from table1
select (case when a>b then a
when a>c then a
when b>c then b else c
end) from table1
26.安装Linux系统中,用netconfig程序对网络进行配置,要输入哪些内容?
会让用户输入主机名、域名、域名服务器、IP地址、网关地址和子网掩码等必要信息
27. PHP 如何写接口给人家调用?
public function authenticationApi($data,$url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
//输出格式能够转为数组形式的json格式
$tmpInfo = curl_exec($ch);
curl_close($ch);
return $tmpInfo;
}
28.用PHP header()函数实现页面404错误提示功能
Header("HTTP/1.1 404 Not Found");
29.heredoc结构及用法
echo <<<EOT
<html>
<head><title>主页</title></head>
<body>主页内容</body>
</html>
EOT;
注意:结束标识符所在的行不能包含任何其它字符除";"
30.nowdoc结构及用法
$str = <<<'EOD'
Example of string
spanning multiple lines
using nowdoc syntax.
EOD;
31.javascript 判断弹出窗口是否被屏蔽程序代码
var wroxWin = window.open("http://www.111cn.net", "_blank");if (wroxWin == null) {
alert("糟糕!弹出窗口被屏蔽了");}
32. php序列化和反序列化用的函数
serialize() 序列化
unserialize() 反序列化
33. 利用下表结构,写出发贴数最多的十我的名字的SQL语句(members(id,username,posts,pass,email)
select memebers.username from members group by posts desc limit 10
34,.以Apache模块的方式安装PHP,在文件http.conf中首先要用语句(?)动态装载PHP模块,而后再用语句(?)使得Apache把全部扩展名为php的文件都做为PHP脚本处理。
1.LoadModule php5_module "c:/php/php5apache2.dll")
2.AddType application/x-httpd-php .php
35.数据库中的事务是什么?
事务就是一系列的操做,这些操做完成一项任务。只要这些操做里有一个操做没有成功,事务就操做失败,发生回滚事件。即撤消前面的操做,这样能够保证数据的一致性。并且能够把操做暂时放在缓存里,等全部操做都成功有提交数据库,这样保证费时的操做都是有效操做。
36.apche 和 nginx 的优缺
nginx轻量级,比apache占用更少的内存及资源,抗并发,nginx处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能。apache 相对于nginx 的优势:rewrite比nginx 的rewrite 强大,少bug,稳定。(须要性能用nginx,求稳定就apache)。
37.求两个日期的差数,例如2007-2-5 ~ 2007-3-6 的日期差数
// 方法一:用DateTime类
$day1 = '2003-09-16';
$day2 = '2011-11-23';
$d1 = new dateTime($day1);
$d2 = new dateTime($day2);
echo $d1->diff($d2)->days;
// 方法二,用时间戳计算
echo (strtotime($day2) - strtotime($day1))/(24*3600);
38.下面的代码用来作什么?请解释。$date='08/26/2003';
print
ereg_replace("([0-9]+)/([0-9]+)/([0-9]+)","\\2/\\1/\\3",$date);
这是把一个日期从 MM/DD/YYYY 的格式转为 DD/MM/YYYY 格式。个人一个好朋友告诉我能够把这个正规表达式拆解为如下的语句,对于如此简单的表示是来讲其实无须拆解,纯粹为了解说的方便:
// 对应一个或更多 0-9,后面紧随一个斜号$regExpression = "([0-9]+)/";
// 应一个或更多 0-9,后面紧随另外一个斜号$regExpression .= "([0-9]+)/";
// 再次对应一个或更多 0-9$regExpression .= "([0-9]+)";至于 \\2/\\1/\\3 则是用来对应括号,第一个括号对的是月份
39.在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预约义变量(?)中;而连接到当前页面的URL记录在预约义变量(?)中。
(1) echo $_SERVER['PHP_SELF'];
(2) echo $_SERVER["HTTP_REFERER"];
40.一个函数的参数不能是对变量的引用,除非在php.ini中把(?)设为on.
allow_call_time_pass_reference
今天就先写到这里吧!在后期的面试中遇到不一样的面试题我会不按期更新
但愿此文会给你们带来帮助,觉写的不错的,对你有帮助中的请动动你的手关注我和点赞分享,祝愿正在找工做的你,能找一份满意的工做。祝你新的旅途愉快!
以上就是PHP 经典面试题集的详细内容
相关推荐: