[李景山php] php面试中常见问答题
2017-05-05 11:33
176 查看
理论概念 GET和POST的原理和区别 GET将数据追加与url之后进行提交,而POST将数据放在HTML的HEADER头进行提交. GET对数据的大小限制受浏览器和服务器程序的影响,IE浏览器长度大约为2083字节,POST理论上没有大小限制,但是受服务器程序的影响。 因为GET方式将数据追加在URL之后进行提交,所以GET方式提交的数据容易被篡改。 GET传参必须为ASCII字符集,而POST支持整个ISO10646字符集。 什么是SESSION和COOKIE,他们的区别 简单的说SESSION是在服务器端保持会话状态的一种方式,而COOKIE是在客户端保持会话状态的一种方式。 正统的COOKIE分发是通过HTTP扩展协议来实现的。而SESSION是服务器使用散列表结构来保存会话信息的。 COOKIE保存在客户端所以他不安全,SESSION保存在服务器所以在安全性上更胜一筹,但他会增加服务器的IO开销。 在为客户端建立SESSION时,客户端需要向服务器传递以COOKIE形式保存在浏览器缓冲区的SESSION ID,如果浏览器禁用了COOKIE那么需要使用一种我们很常见的技术URL重写,在网页中添加一个隐藏表单随网页传递SESSION ID信息。也可以将SESSION ID存在Memcache里。 MYSQL常用优化 数据表设计大体遵守三范式适当使用反三范式 三范式设计的数据表理论上说是最简洁的,但是他在查询的时候需要关联很多表,导致性能较低,所以我们需要适当的加入冗余,将数据表的执行效率提升到最高。 适当的建立索引 虽然建立索引能提高数据库的搜索速度,但是索引的存储方式不同于数据库数据的存储方式,他会影响数据库增删改的性能,同时造成服务器额外的IO开销。1)只对经常作为查询条件的字段建立索引。2)索引字段中的值必须有所区别3)MYSQL支持长字段的前缀索引 对大数据表进行水平拆分 利用表分区技术将一张大表拆分为若干张小表,减少服务器IO开销,提高数据检索速度。同时还可以配合经典的分库分表技术,对大表进行更细致的拆分。 对大数据表进行垂直拆分 将数据表中关系性不高的字段分流至KV结构数据库,既提升了数据检索速度,有能分流数据检索压力。 选择适当的字段类型,特别是主键 图片等大文件使用文件存储而不是放在数据库里面 利用预处理机制对数据库集中进行操作,避免频繁的进行数据库读写。 选择适当的引擎,innoDB虽然强大,但他的写入速度明显低于myIsam,所以只在适当的情况下使用innoDB。 SQL语句优化 不使用复杂的SQL语句,避免使用关联查询,而是将复杂的SQL语句拆分为多条简单的SQL语句,转在PHP端进行计算,分离数据库的运算压力和锁表风险 。 保持事务和数据库连接短小精干,用完即关。 按需获取字段,尽量不使用* 大表使用计数器进行统计,而不使用count(*) IN的效率大于OR 尽量避免使用%和取反,使用sphinx进行全文搜索 统一字符集 开启慢查询日志 使用explain分析查询信息 什么是MVC,优缺点 MVC是模型、视图、控制器的缩写,是一种设计模式,他使程序被分离为输入、处理、输出三个部分。 优点: 低耦合,高类聚 类重用性高 可维护性高 管理方便 缺点: 不适合小型应用程序 增加系统结构和实现的复杂性 视图与控制器相互依赖,通为常不能独立进行重用。 各部分功能 模型主要存放数据库操作类,用于查询并返回数据。 视图是用户看到的与之交互的页面,通常为纯HTML代码,利用模板引擎进行动态操作。 控制器接受用户输入并调用模型和视图去完成用户的需求。控制器本身不处理和输出任何数据,它只是接受请求并决定调用模型中的哪个方法去请求数据,然后调用视图去显示数据。 什么是OOP?主要特征是什么? 面向对象是一种编程架构,他的许多原始思想都来自simula语言,他的本质是一种更接近人类认知事物的哲学观计算模型,OOP中对象作为计算的根本,对象拥有独立的属性,对象的建立、销毁、发送和响应都是构成OOP模型的根本。 特征:继承 多态 封装 常用HTTP状态 1系列 临时响应 2系列 成功 200 服务器成功处理了所有请求 3系列 已重定向 300 这个资源有多个位置信息:通常浏览器会自动选择一个 301 资源永久重定向 302 资源临时重定向:请求的资源已经被缓存,服务器建议从location域中获取 4系列 请求错误 400 服务器无法理解的请求 401 未授权:服务器需要验证身份 403 拒绝显示:服务器理解了你的请求 但是拒绝执行 404 资源未找到 5系列 服务器错误 500 服务器内部错误 501 服务器不支持请求需要调用的某个功能 502 网关错误 503 服务器过载 504 网关超时 509 服务器带宽达到使用上限 MYSQL索引有哪些?什么时候使用? 普通索引,主键索引,唯一索引 主键索引和唯一索引的区别 主键索引只能主键用,建立唯一索引的字段中不能有一样的值 什么时候使用索引 1)只对经常作为查询条件的字段建立索引。2)索引字段中的值必须有所区别3)MYSQL支持长字段的前缀索引 说说你对MEMCACHE的理解 Memcache是一个高性能、分布式内存对象缓存系统。通过在内存中建立一张巨大的hash表,可以存储很多格式的数据。简单的说就是把数据缓存在内存中,可以极大地提高下次读取时的速度。 优点 运行稳定,配置简单,可以分流数据库查询压力,可以多台服务器分布式存储 使用模板引擎的目的是?常见的模板引擎有哪些? 目的是将网页的HTML代码和PHP代码分离,提高团队合作的效率,降低维护修改代码的难度. 常见模板引擎如下: Smarty: smarty是一个基于PHP开发的PHP模板引擎。它提供了逻辑与外在内容的分离,简单的讲,目的就是要使用PHP程序员同美工分离,使用的程序员改变程序的逻辑内容不会影响到美工的页面设计,美工重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。 ThinkTemplate:thinkPHP内置的模板引擎,使用方法与smarty类似. TemplateLite:一个小型快速的模板引擎,拥有smarty的绝大数功能. 版本管理的优点是什么?常见的版本控制软件有哪些? 优点: 1)提高团队开发效率,更加方便的管理项目文件 2)将项目的所有文件集中放置在服务器上,通过授权进行访问,安全性较高. 3)避免多个用户同时修改同一个文件引起的冲突 4)能将同一个文件恢复到不同时段,或进行更改比较. 用过的版本控制软件: SVN介绍: SVN:subversion是目前主流的版本管理软件,很多开源程序都是使用SVN作为代码版本管理软件. 用过的服务器端:SVN edge 3.0 用过的客户端:tortoiseSVN 常见版本控制软件: SVN CVS PCVS 一个字节占多少bit,IPV4和IPV6各占多少字节 一个字节占8bit,IPV4占4字节,IPV6占16字节 谈谈ASP PHP JSP的特点 名称 开发速度 性能消耗 建设成本 扩展性 跨平台 安全性 ASP 快 中 中 差 不支持 差 PHP 快 低 低 好 一般 好 JSP 慢 低 高 好 完美 好 GD库是什么?他的作用是 GD库是PHP处理图形扩展库,用来为PHP处理图片提供支持,如缩放图像,生成水印,生成图片等等,但从GD-1.6开始不支持有版权争议的GIF改为支持PNG PHP基础 Is_set()和empty()的区别 Is_set 检查变量是否建立:只要变量不等于null就返回true Empty 检查变量是否为空:(不等于false,0,null,array())才返回true MYSQL常用数据库字段类型 INT 整型 Char 定长字符串 VarChar 变长字符串 Datetime 日期格式 Text 大文本数据 MYSQL char和varchar的区别,他们的优缺点? Char是定长字符串,优点是执行效率快,但会占用较多的硬盘空间 Varchar是变长字符串,优点是根据实际的字符数确定占用空间,比较节省硬盘空间,但读取时会预先判断字符的实际长度,执行效率不高,且在频繁改动的情况下,容易产生磁盘碎片. MYSQL常用存储引擎 Myisam innoDB BDB Memory 什么是事务? 事务是恢复和并发控制的基本单位,在MYSQL中事务可以使一条或多条SQL语句,甚至整个程序.事务具有以下四个特性(ACID):原子性,一致性,隔离性,隔离性. 如果所有操作均成功,则该事务成功并提交,其修改会影响所有其他数据库进程,如果事务失败,事务将回滚,该事务所有操作都将被取消. I++和++i那个效率更高? 如果运算结果在这一行不会被使用,那么他们效率没有区别。 Echo ++I; 如果运算结果在这一行会被使用,那么++i更快 因为i++,会建立一个临时变量储存I运算后的结果,然后在这一行对I的使用结束后,覆盖i 解释$_request $_post $_get $_cookie $_SESSION $_FILE $_REQUEST 接受POST和GET的值 $_post 接受POST传值 $_GET 接受GET传值 $_cookie 获取cookie保存的值 $_SESSION 获取SESSION保存的值 $_FILE 获取文件上传表单的值 哪种数组下标效率高 索引数组效率更高,因为他的下标是非负整型. OOP的几种魔术方法 __call():调用一个不存在的方法时会自动调动这个方法 __autoload():实例化一个还没有被定义的类的时候会自动调用这个函数 __construct():类实例化时,会自动调用这个方法 __destruct():类销毁的时候会自动调用这个方法 __tostring():直接打印输出类时会自动调用这个方法 __set():外部设置类的内部属性或不存在的属性时,会自动调用这个方法 __get():外部读取类的内部属性或不存在的属性时,会自动调用这个方法 __unset():当对一个未定义的变量调用unset()方法时会自动调用这个方法 __isset():当对一个未定义的变量调用isset()方法时会自动调用这个方法 __clone():克隆一个对象 Echo print() print_r()的区别 Echo 是PHP的语法,可以输出变量,但是不能输出数组,执行效率最高 Print()是PHP的一个内置函数,可以输出变量,但不能输出数组,执行效率中等 Print_r() 是PHP的一个内置函数,可以输出变量也能输出数组,执行效率最低 Include和require的区别() PHP每次都会重新读取并包含Include指定的文件,PHP只会包含一次require指定的文件,下一次遇上require同名文件,他会选择忽略,所以require得运行效率相对include较高. 当文件不存在时,require会返回一个错误并终止程序,include只会返回一条警告继续运行程序,所以require适合用来包含一些重要的运行文件,include适合包含一些次要文件. 单引号和双引号的区别 单引号不会解释变量,不能转义单引号和转义符本身,执行效率较高 双引号会解释变量,可以转义字符,执行效率较低 引用传参和非引用传参的区别,什么时候使用引用传参或引用传参的好处? 引用传参时,等于做了别名,函数内部对变量的任何更改也会改变在函数外部的这个变量的值. 按值传参,函数内部对传入变量的修改不会影响到外部变量的值. 什么时候用引用传参,引用传参的好处: PHP进行非引用传参时,首先需要复制一份变量,如果传入的是一个较大的字符串,那么会带来较大的性能开销,而引用传参,php只需要将函数内部的变量指向外部变量的内存地址即可,效率较高. PHP如何抛出和接收错误 Try{ 要执行的代码 }catch(Exception $e){ Die($e -> getmessage());//(捕获并处理异常的代码) } 列出并解释OOP常用修饰符 Public:公有的,在本类,子类或外部均能访问 Protected:受保护的,在本类,子类可以访问 Private:私有的,只能在本类访问 Interface:定义一个接口类使用的修饰符 Abstract:定义一个抽象类使用的修饰符 Final:最终的,不能被覆盖,类不能被继承 Static:静态的,属性和方法被所有实例化对象共享,属性和方法不能被实例化. Implements:继承接口 Extends:继承类 内连接.左连接,右连接,全连接的作用和使用条件 字符串转数组,数组传字符串,字符串截取,字符串替换,字符串查找的函数是? Explode(),implode(),substr(),str_replace(),strstr() 如何定义一个常量? Define(‘name’,value); 如何翻转一个字符串? Echo strrev($str); 如何显示服务器IP和访客IP $_server[‘server_addr’] $_server[‘remote_addr’] 如何设置PHP的错误级别和提示 Error_reporting() 验证邮箱地址的正则表达式 /^([a-zA-Z0-9-])+@([a-zA-Z0-9-]+\.([a-zA-Z]){2,3}$/ PHP文件读写详解 文件的几种读写方式 R只读打开(指针指向文件头) R+读写方式打开(指针指向文件头) W写入方式打开(文件内容清0,不存在则创建) W+读写方式打开(文件内容清0,不存在则创建) A写入方式打开(指针指向末尾,不存在则创建)A+读写模式打开(指针指向末尾,不存在则创建) X创建并以写入方式打开(如果文件存在则报错)X+创建并以读写方式打开(如果文件存在则报错) 如何读取文件 读取整个文件:File_get_content() 标准模式读取文件:$handle = fopen(‘XXX.txt’,r+); $str = fread($handle,读取长度); 如何写入文件 覆盖写入整个文件:file_put_content(); 标准写入:$headle = fopen(‘xxx.txt’,a+); $result = fwrite($handle,’内容’,写入多少长度(可选参数)); 何如输出10进制 8进制 和 16进制 Echo 10 ;//十进制 Echo 08;//八进制前面加0 Echo 0x16; //十六进制前面加0x 获取URL的几种方法 获取站点名称:如http://www.abc.com Echo $_SERVER[‘SERVER_NAME’]; 获取目前访问的文件名称:如:/1.php Echo $_SERVER[‘PHP_SELF’]; 连同GET传参一同获取:如/1.php?a=haha Echo $_SERVER[‘QUERY_URI’]; 拼接一个完整URL Echo $SERVER[‘SERVER_NAME’].$_SERVER[‘PHP_SELF’]; 解释函数Asort和arsort Asort 按照数据的键值进行升序排序,并保持索引关系 如:array(‘a’=>’CCC’,’b’=>’AAA’,’c’=>’BBB’); 排序后 arrat(‘b’=>’AAA’,’C’=>’BBB’,’a’=>’CCC’) Arsort同理,只是进行降序排序 IE和非IE的划分标准是什么?如何判断? IE浏览器即使用IE内核的浏览器:如360、腾讯TT、搜狗等 非IE即为没有使用IE内核的浏览器:如火狐 谷歌等 通过$_SERVER[HTTP_USER_AGENT]判断 func()和@func()有什么区别 @func()抑制的错误输出,不会显示错误 PHP进阶 解释magic_quotes_gpc(),magic_quotes_runtime()的作用 他们都是php.ini里面的设置项 如果将magic_quotes_gpc打开,那么PHP会自动对POST GET COOKIE里面的字符串添加\转义 如果将magic_quotes_runtime打开,PHP会自动对从数据库读取出来的单引号和双引号加上\进行转义 PHP框架使用单入口和多入口的区别和优缺点 单入口是指访问一个文件完成用户对网站所有功能的访问(如MIOPHP) 优点: 结构简单,调用方便 提高框架代码重用,方便维护和改动 缺点: M=class&a=func的URL结构不经过优化的话会搜索引擎不友好 多入口是指访问多个文件完成用户对网站所有功能的访问(如MIO!论坛) 优点: URL结构对搜索引擎友好 更容易实现对每个页面的自定义功能 缺点: 重用性差,维护程序繁琐 从一个URL里面获取文件的扩展名 $url = 'http://www.abc.com/index.php?a=haha&b=heihei'; $arr = parse_url($url); $urlArr = explode('.',$arr['path']); Array_pop($urlArr); Linux 解压 Tar zxvf filename 压缩 Tar zcvf filename .gz gzip gunzip .tar.gz tar -zcf tar -zxf .zip zip -r unzip .bz2 bzip2 bunzip2 .tar.bz2 tar -cjf tar -xjf 目录查询 Ls 文件复制 Cp 要复制的文件 复制到哪里 文件删除 RM 要删除的文件 文件剪切 MV 要剪切的文件 剪切到哪 MYSQL Mysql_fetch_row和mysql_fetch_array的区别 Mysql_fetch_row从结果集获取一行返回一个数字数组 Mysql_fetch_array从结果集获取一行返回一个索引数组或关联数组或索引关联共有的数组 写出数据库增删改查的SQL语句 Insert into 表名 (name,psw) VALUES(‘haha’,’123321’); Update 表名 set psw=’111’ where name=’haha’; Select name,psw from 表名 Delect from 表名 where name=’haha’; 取得查询结果集条数的方法是? Mysql: $rows = mysql_num_rows($result); Mysqli: $rows = $result -> num_rows(); PDO: $stmt -> rowCount()