php面试题三年,PHP面试题集锦(3)

1、$_GET,$_POST,$_REQUEST 三者的区别从一个简单的理解来看在PHP中$_GET $_POST $_REQUEST都是接受数据了,get接受的是url参数而post可以说是由表单post过来的数据,而request是可以接受两者的数据,这个就是他们基础的区别所在了,下面一起来看看它们的区别证明。

PHP中有$_REQUEST与$_POST、$_GET用于接受表单数据。一、$_REQUEST与$_POST、$_GET的区别和特点

$_REQUEST[]具用$_POST[] $_GET[]的功能,但是$_REQUEST[]比较慢。通过POST和GET方法提交的所有数据都可以通过$_REQUEST数组获得。二、$_POST、$_GET的区别和特点

1. GET是从服务器上获取数据,POST是向服务器传送数据。

2. GET是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。POST是通过HTTP POST机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

3. 对于GET方式提交表单数据,服务器端用$_GET[‘name’]获取变量的值,对于POST方式提交表单数据,服务器端用$_POST[‘name’]获取提交的数据,当然,两者都可以通过$_REQUEST[‘name’]获得表单数据。对于REQUEST方式提交表单数据,服务器端用$_REQUEST[‘name’]获取变量的值,但这种方式很少用。

4. GET传送的数据量较小,不能大于2KB。POST传送的数据量较大,一般被默认为不受限制。但理论上,一般认为不能超过100KB。

5. GET安全性非常低,POST安全性较高。

6. GET表单值可以通过_GET获取;但通过action的url设置的参数总是获取不到的,

是一样的,也就是说,在这种情况下,GET方式会忽略action页面后边带的参数列表。POST表单值可以通过_POST获取;但通过action的url参数设置的参数则可以不能通过_POST获取到。action=test.php?id=1这种就是GET方式传值,可以用$_REQUEST和$_GET接受传值,但不能用POST方式获取到值,即使表单是POST方式提交。所在,在提交表单时,如果action中同时有参数,最好只能通过POST表单方式,对于表单内数据,直接通过POST获取,对于action中参数,童工GET获取。

在做数据查询时,建议用GET方式,而在做数据添加、修改或删除时,建议用POST方式。

request是先读取 get再读post 的, 同时存在, 即覆盖掉前面的变量。

2、$_SESSION,$_COOKIE 两者的区别与联系

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

cookie 和session 的联系:

session是通过cookie来工作的

session和cookie之间是通过$_COOKIE['PHPSESSID']来联系的,通过$_COOKIE['PHPSESSID']可以知道session的id,从而获取到其他的信息。

3、include、require 有什么区别,include可以重复引入同一文件吗?:include如果引入的文件不存在,试图继续往下执行,报一个warning

(如果你不介意之前的内容是否被包含,之后的内容都要执行,就使用include)

而require如果引入的文件不存在,报fatal error,不再继续执行.

(如果之前的内容一定要被包含,才允许继续执行之后的代码,就使用require)

4.Include/require 与 include_once /require_once的区别_once 会自动判断文件是否已经引入,如果引入,不再重复执行.

即:保证被包含文件只可能被引入一次.

(如果包含的文件里有定义函数,那么被包含的文件只能被包含一次,如果多次包含,就会出现函数重定义的错误,php是不运行函数重定义的,会出现致命错误,之后代码不在运行)

=======================================================

有的文件不允许被包含多次?

可以用_once来控制,

但是,如果从文件的设计上,比较规范,能保证肯定不会出现多次包含的错误,

这种情况下 建议用include

因为include_once要检测之前有没有包含,效率没有include高

5、写一个函数,显示前天的时间 (年-月-日 时:分:秒)$a = date("Y-m-d H:i:s", strtotime("-1 day"));

6、写一个函数,验证邮箱的格式是否正确function  checkEmail($email){

$pregEmail="/([\w\-]+\@[\w\-]+\.[\w\-]+)/";

return    preg_match($pregEmail,$email);

}

7、有一个data.txt文件,一行作为一条记录,请写一个函数,分页显示data.txt文件的内容,每页10条记录。

8、写一个自动加载类

9、写一个函数,显示当前目录下的文件及目录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;

}

}

10、这是一个标准URL (http://127.0.0.1/test.php?type=1),请写一个函数,用最高效的方式获取所访问的文件的后缀名

11、mysql数据库中,innodb 和 myisam 区别(只少5点)

1、 存储结构

MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。

InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。2、 存储空间

MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。

InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

3、 事务支持

MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。

InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。4、 CURD操作

MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。(因为没有支持行级锁),在增删的时候需要锁定整个表格,效率会低一些。相关的是innodb支持行级锁,删除插入的时候只需要锁定改行就行,效率较高

InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。5、 外键

MyISAM:不支持

InnoDB:支持

12、有一张评论表comment(uid 用户ID,post_id 评论ID,article_id 文章ID),请写一条sql语句查询出提交评论最多的3个用户id

select  user_id ,count(post_id) as sum_post  from comment  group by user_id  order by sum_post  desc

13、怎么解决ajax跨域请求1、允许单个域名访问2、允许多个域名访问3、允许所有域名访问

14、请讲下你对MVC的理解

15、要实现一个在线倒计时抢购功能,需要注意哪些问题?怎么解决这些问题?

16、请讲下你对高并发大访问量的网站解决方案

首先,确认服务器硬件是否足够支持当前的流量。

普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大,那么必须首先配置一台更高性能的专用服务器才能解决问题,否则怎么优化都不可能彻底解决性能问题。其次,优化数据库访问。

前台实现完全的静态化当然最好,可以完全不用访问数据库,不过对于频繁更新的网站,静态化往往不能满足某些功能。

缓存技术就是另一个解决方案,就是将动态数据存储到缓存文件中,动态网页直接调用这些文件,而不必再访问数据库,WordPress和Z-Blog都大量使用这种缓存技术。

如果确实无法避免对数据库的访问,那么可以尝试优化数据库的查询SQL.避免使用Select * from这样的语句,每次查询只返回自己需要的结果,避免短时间内的大,尽量做到"所查即所得" ,遵循以小表为主,附表为辅,查询条件先索引,先小后大的原则,提高查询效率.第三,禁止外部的盗链。

外部网站的图片或者文件盗链往往会带来大量的负载压力,因此应该严格限制外部对于自身的图片或者文件盗链,好在目前可以简单地通过refer来控制盗链,Apache自己就可以通过配置来禁止盗链,IIS也有一些第三方的ISAPI可以实现同样的功能。当然,伪造refer也可以通过代码来实现盗链,不过目前蓄意伪造refer盗链的还不多,可以先不去考虑,或者使用非技术手段来解决,比如在图片上增加水印。第四,控制大文件的下载。

大文件的下载会占用很大的流量,并且对于非SCSI硬盘来说,大量文件下载会消耗CPU,使得网站响应能力下降。因此,尽量不要提供超过2M的大文件下载,如果需要提供,建议将大文件放在另外一台服务器上。第五,使用不同主机分流主要流量

将文件放在不同的主机上,提供不同的镜像供用户下载。比如如果觉得RSS文件占用流量大,那么使用FeedBurner或者FeedSky等服务将RSS输出放在其他主机上,这样别人访问的流量压力就大多集中在FeedBurner的主机上,RSS就不占用太多资源了。

17.你用什么方法检查 PHP 脚本的执行效率(通常是脚本执行时间)和数据库 SQL 的效率(通常是数据库 Query 时间), 并定位和分析脚本执行和数据库查询的瓶颈所在?

1.PHP执行时间:

$begin=microtime(true); //获取程序开始执行的时间

// some code here 待执行的代码

$stop=microtime(true); //获取程序执行结束的时间

list($m0,$s0)=explode(" ",$begin);

list($m1,$s1)=explode(" ",$stop);

$runtime=($s1+$m1-$s0-$m0)*1000;

echo    ‘当前脚本执行时间:’.$etime-$stime.'微秒';

2.SQL执行时间(其实和上面一样):

$begin=microtime();

mysql_query($sql);

$stop=microtime();

list($m0,$s0)=explode(" ",$begin);

list($m1,$s1)=explode(" ",$stop);

$runtime=round(($s1+$m1-$s0-$m0)*1000,4);

echo '当前脚本执行时间:'.$runtime.'ms';

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值