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设置的参数总是获取不到的,<form method="get" action="a.asp?b=b"></form>
跟<form method="get"action="a.asp"></form>是一样的,也就是说,在这种情况下,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';