我爱编程

php-面试第二篇

2017-12-05  本文已影响48人  像敏锐的狗

11、谈谈mvc的认识。由模型、视图、控制器完成的应用程序,由模型发出要实现的功能到控制器,控制器接收组织功能传递给视图12、说明php中传值与传引用的区别,并说明传值什么时候传引用?变量默认总是传值赋值,那也就是说,当将一个表达式的值赋予一个变量时,整个表达式的值被赋值到目标变量,这意味着:当一个变量的赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量php也提供了另外一种方式给变量赋值:引用赋值。这意味着新的变量简单的__引用__(换言之,成为了其别名或者指向)了原始变量。改动的新的变量将影响到原始变量,反之亦然。使用引用赋值,简单地将一个&符号加到将要赋值的变量前(源变量)对象默认是传引用 对于较大是的数据,传引用比较好,这样可以节省内存的开销13、isset、empty、is_null的区别。isset 判断变量是否定义或者是否为空 变量存在返回ture,否则返回false 变量定义不赋值返回false unset一个变量,返回false 变量赋值为null,返回false empty:判断变量的值是否为空,能转换为false的都是空,为空返回true,反之返回false。 "",0,"0",NULL,FALSE都认为为空,返回true 没有任何属性的对象都认为是空 is_null:检测传入的值(值、变量、表达式)是否为null 定义了,但是赋值为Null 定义了,但是没有赋值 unset一个变量14、PHP网站的主要攻击方式有哪些? 1. 命令注入(Command Injection) 2. eval 注入(Eval Injection) 3. 客户端脚本攻击(Script Insertion) 4. 跨网站脚本攻击(Cross Site Scripting, XSS) 5. SQL 注入攻击(SQL injection) 6. 跨网站请求伪造攻击(Cross Site RequestForgeries, CSRF) 7. Session 会话劫持(Session Hijacking) 8. Session 固定攻击(Session Fixation) 9. HTTP 响应拆分攻击(HTTP Response Splitting) 10. 文件上传漏洞(File Upload Attack) 11. 目录穿越漏洞(Directory Traversal) 12. 远程文件包含攻击(Remote Inclusion) 13. 动态函数注入攻击(Dynamic VariableEvaluation) 14. URL 攻击(URL attack) 15. 表单提交欺骗攻击(Spoofed FormSubmissions) 16. HTTP 请求欺骗攻击(Spoofed HTTP Requests)15、框架中什么是单一入口和多入口 , 单一入口的优缺点? 1. 多口就是通过访问不同的文件来完成用户请求。单一入口只 web 程序所有的请求都指向一个脚本文件的。 2. 单一入口更容易控制权限,方便对 http 请求可以进行安全性检查。缺点:URL 看起来不那么美观,特别是对搜索引擎来说不友好。16、什么是面向对象?主要特征是什么?面向对象是程序的一种设计模式,它利于提高程序的重用性,使程序机构更加清晰。 主要特征是:封装、继承、多态。五大基本原则: 单一职责原则;开放封闭原则;替换原则; 依赖原则; 接口分离原则。17、面向对象有哪几种常用的设计模式,六大设计原则是什么?常用设计模式:单例模式(有的叫单元素模式,单态模式),工厂模式,观察者模式,命令链模式,策略模式。1),OCP原则(也叫开闭原则) 2),SRP原则(职责单一原则) 3),OCP原则(里氏替换原则) 4),DIP原则(依赖倒置原则) 6),LoD法则(迪米特法则)18、了解XSS攻击吗?如何防止?XSS是跨站脚本攻击,首先是利用跨站脚本漏洞以一个特权模式去执行攻击者构造的脚本,然后利用不安全的Activex控件执行恶意的行为。使用htmlspecialchars()函数对提交的内容进行过滤,使字符串里面的特殊符号实体化。19、SQL注入漏洞产生的原因?如何防止?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. 控制错误信息,不要在浏览器上输出错误信息,将错误信息写到日志文件中。20、对于大流量网站,采用什么方法来解决访问量的问题。 ● 确认服务器硬件是否能够支持当前的流量 ● 数据库读写分离,优化数据表 ● 程序功能规则,禁止外部的盗链 ● 控制大文件的下载 ● 使用不同主机分流主要流量 21、什么是静态路由,其特点是什么?什么是动态路由,其特点是什么?  静态路由是由系统管理员设计与构建的路由表规定的路由。适用于网关数量有限的场合,且网络拓朴结构不经常变化的网络。其缺点是不能动态地适用网络状况的变化,当网络状况变化后必须由网络管理员修改路由表。动态路由是由路由选择协议而动态构建的,路由协议之间通过交换各自所拥有的路由信息实时更新路由表的内容。动态路由可以自动学习网络的拓朴结构,并更新路由表。其缺点是路由广播更新信息将占据大量的网络带宽。22、PHP的垃圾收集机制是怎样的?PHP可以自动进行内存管理,清除不再需要的对象。PHP使用了引用计数(reference counting)这种单纯的垃圾回收(garbage collection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。23、PHP如何实现页面跳转(写出三种方法)。方法一:php函数跳转,缺点,header头之前不能有输出,跳转后的程序继续执行,可用exit中断执行后面的程序。header("Location:网址");//直接跳转header("refresh:3;url=http://axgle.za.net");//三秒后跳转 方法二:利用metaecho"";方法三: echo "window.location.href=''";24、请对POSIX风格和兼容Perl风格两种正则表达式的主要函数进行类比说明。1)preg_replace()里面的正则可以写成型如:"/.xxx/"而ereg_replace()里面的正则需写成型如"xxx"2)preg_replace()能操作数组,而ereg_replace()不可以3)在逆向引用用preg_replace()可使用0-99个,而ereg_replace()最多为9个使用Perl兼容正则表达式语法的preg_match()函数通常是比ereg()更快的替代方案。25、请写出并说明如何在命令行下运行PHP脚本(写出两种方式)同时向PHP脚本传递参数?首先进入php安装目录Php –f d:/wamp/www/1.php其中-f参数指定要执行的php文件php –r phpinfo();其中-r表示直接执行php代码,无需写开始结束标记26、一个函数的参数不能是对变量的引用,除非在php.ini中把____设为on。allow_call_time_pass_reference是否启用在函数调用时强制参数被按照引用传递27、PHP中如何判断一个字符串是否是合法的日期模式:2007-03-13 13:13:13。思路:先把给定字符串用日期函数重新转换并比较。?php function checkDateTime($data){ if (date('Y-m-d H:i:s',strtotime($data)) == $data) { return true; } else { return false; } } // 示例 $data = '2015-06-20 13:35:42'; var_dump(checkDateTime($data));//bool(true) $data = '2015-06-36 13:35:42'; var_dump(checkDateTime($data));//bool(false)?28、写出五种以上你使用过的PHP的扩展的名称mysql,mysqli,iconv,mbstring,gd,redis,memcache29、php中WEB上传文件的原理是什么,如何限制上传文件的大小?上传文件的表单使用post方式,并且要在form中添加enctype='multipart/form-data'。一般可以加上隐藏域:,位置在file域前面。value的值是上传文件的客户端字节限制。可以避免用户在花时间等待上传大文件之后才发现文件过大上传失败的麻烦。使用file文件域来选择要上传的文件,当点击提交按钮之后,文件会被上传到服务器中的临时目录,在脚本运行结束时会被销毁,所以应该在脚本结束之前,将其移动到服务器上的某个目录下,可以通过函数move_uploaded_file()来移动临时文件,要获取临时文件的信息,使用$_FILES。限制上传文件大小的因素有:1)客户端的隐藏域MAX_FILE_SIZE的数值(可以被绕开)。2)服务器端的upload_max_filesize,post_max_size和memory_limit。这几项不能够用脚本来设置。3)自定义文件大小限制逻辑。即使服务器的限制是能自己决定,也会有需要个别考虑的情况。所以这个限制方式经常是必要的。30、在url中用get传值的时候,若中文出现乱码,应该用哪个函数对中文进行编码?urlencode31、如果我的网站用的utf-8编码,为防止乱码出现,都需要注意哪些地方?1)数据库中库和表都用utf8编码2)php连接mysql,指定数据库编码为utf8 mysql_query(“set names utf8”);3)php文件指定头部编码为utf-8 header(“content-type:text/html;charset=utf-8”);4)网站下所有文件的编码为utf85)html文件指定编码为utf-832、编写函数取得上一月的最后一天Date(‘Y-m-d’,strtotime(‘-‘.date(‘d’).’ day’));33、(^\s*)|(\s*$)这个正则表达式作用是:__________;匹配以0个或多个空白符开头或者0个或多个空白符结尾的字符串34.写出php的public、protected、private几种访问控制模式的区别public:公有,任何地方都可以访问protected:继承,只能在本类或子类中访问,在其它地方不允许访问private:私有,只能在本类中访问,在其他地方不允许访问35.autoload()函数是如何运作的?使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。36.类的属性可以序列化后保存到session中,从而以后可以恢复整个类,这要用到的函数是____serialize()和unserialize()37.接口和抽象类的区别是什么?抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。抽象类是通过关键字abstract来声明的。抽象类与普通类相似,都包含成员变量和成员方法,两者的区别在于,抽象类中至少要包含一个抽象方法,抽象方法没有方法体,该方法天生就是要被子类重写的。抽象方法的格式为:Abstract function abstract Method();接口是通过interface关键字来声明的,接口中的成员常量和方法都是public的,方法可以不写关键字public,接口中的方法也是没有方法体。接口中的方法也天生就是要被子类实现的。抽象类和接口实现的功能十分相似,最大的不同是接口能实现多继承。在应用中选择抽象类还是接口要看具体实现。子类继承抽象类使用extends,子类实现接口使用implements。抽象类是对事物本质的抽象,接口是对动作的抽象。38、类中如何定义常量、如何在类中和类外调用常量?类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。定义常量使用关键字const,例如:const PI=3.1415326;无论是类内还是类外,常量的访问和变量是不一样的,常量不需要实例化对象,访问常量的格式都是类名加作用域操作符号(双冒号)来调用,即:类名::类常量名。39、cookie和session原理及区别 。cookie采用的是客户端的会话状态的一种储存机制。它是服务器在本地机器上存储的小段文本或者是内存中的一段数据,并随每一个请求发送至同一个服务器。session是一种服务器端的信息管理机制,它把这些文件信息以文件的形式存放在服务器的硬盘空间上(这是默认情况,可以用memcache把这种数据放到内存里面)当客户端向服务器发出请求时,要求服务器端产生一个session时,服务器端会先检查一下,客户端的cookie里面有没有session_id,是否过期。如果有这样的session_id的话,服务器端会根据cookie里的session_id把服务器的session检索出来。如果没有这样的session_id的话,服务器端会重新建立一个。PHPSESSID是一串加了密的字符串,它的生成按照一定的规则来执行。同一客户端启动二次session_start的话,session_id是不一样的。 区别:Cookie保存在客户端浏览器中,而Session保存在服务器上。 Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。 Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。40、session产生的session_id放在cookie里面,如果用户把cookie禁止掉,是不是session也不能用了呢?禁止掉cookie后,session当然可以用,不过通过其他的方式来获得这个sessionid,比如,可以根在url的后面,或者以表单的形势提交到服务器端。从而使服务器端了解客户端的状态。41、为什么说session 比cookie更安全?真正的cookie存在于客户端硬盘上的一个文本文件,如果两者一样的话,只要cookie就好了,让客户端来分提服务器的负担,并且对于用户来说又是透明的。但实际上不是。session的sessionID是放在cookie里,要想功破session的话,得分两步:第一要功破cookie。功破cookie后,你要得到sessionID,sessionID是要有人登录,或者启动session_start才会有,你不知道什么时候会有人登录。第二取有效sessionID。sessionID是加密的,第二次session_start的时候,前一次的sessionID就没有用了,session过期时sessionid也会失效,想在短时间内功破加了密的 sessionID很难。session是针对某一次通信而言,会话结束session也就随着消失了。40、写出邮箱地址正则匹配表达式(注意要匹配所有邮箱域名)。^[a-z0-9_-]+[a-z0-9_.-]*@[a-z0-9_-]+[a-z0-9_.-]*\.[a-z]{2,5}$41、如何提高PHP运行效率?1)、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。2)、$row[’id’] 的速度是$row[id]的7倍。3)、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。4)、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。5)、注销那些不用的变量尤其是大数组,以便释放内存。6)、尽量避免使用__get,__set,__autoload。7)、require_once()代价昂贵。8)、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。9)、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。10)、函数代替正则表达式完成相同功能。11)、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。12)、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。13)、使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。14)、用@屏蔽错误消息的做法非常低效,极其低效。15)、打开apache的mod_deflate模块,可以提高网页的浏览速度。16)、数据库连接当使用完毕时应关掉,不要用长连接。17)、错误消息代价昂贵。18)、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。19)、递增一个全局变量要比递增一个局部变量慢2倍。20)、递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。21)、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。22)、仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。23)、方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。24)、派生类中的方法运行起来要快于在基类中定义的同样的方法。25)、调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。26)、Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。27)、除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。28)、尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。29)、当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写))、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。(举例如下) 2. if (strlen($foo) < 5) { echo “Foo is too short”$$ }复制代码(与下面的技巧做比较) 2. if (!isset($foo{5})) { echo “Foo is too short”$$ }复制代码调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。30)、当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。31)、并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。32)、并非要用类实现所有的数据结构,数组也很有用。33)、不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?34)、当你需要时,你总能把代码分解成方法。35)、尽量采用大量的PHP内置函数。36)、如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。37)、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。38)、mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。39)、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;40)、尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;41)、优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作;42)、循环内部不要声明变量,尤其是大变量:对象43)、多维数组尽量不要循环嵌套赋值;44)、用单引号替代双引号引用字符串;45)、“用i += 1代替 i = i+1。符合c/c++的习惯,效率还高”;46)、对global变量,应该用完就unset()掉;

上一篇下一篇

猜你喜欢

热点阅读