当前位置: 首页 > 后端技术 > PHP

【新增】PHP面试常见问题汇总(含答案)

时间:2023-03-30 00:58:35 PHP

1.冒泡排序,面试前一定要记住!函数maopao($arr){$len=count($arr);$n=计数($arr)-1;对于($i=0;$i<$len;$i++){对于($j=0;$j<$n;$j++){如果($arr[$j]>$arr[$j+1]){$tmp=$arr[$j];$arr[$j]=$arr[$j+1];$arr[$j+1]=$tmp;}}}return$arr;}Github2,快速排序,面试前一定要记住!functionquick_sort($array){if(count($array)<=1)return$array;$key=$array[0];$left_arr=数组();$right_arr=数组();对于($i=1;$iif($array[$i]<=$key)$left_arr[]=$array[$i];else$right_arr[]=$array[$i];}$left_arr=quick_sort($left_arr);$right_arr=quick_sort($right_arr);returnarray_merge($left_arr,array($key),$right_arr);}3.请解释一下PHP中按值传递和按引用传递的区别,什么时候按值传递什么时候按引用传递?值传递:在函数范围内对值的任何改变都会在函数外被忽略通过引用传递:在函数范围内对值的任何改变也可以在函数外反映这些修改优点和缺点:当按值传递时,PHP必须复制值。特别是对于大型字符串和对象,这可能是一项昂贵的操作。引用传递不需要复制值,对性能提升很有好处。(优缺点会考)4、MySQL数据库中字段类型varchar和char的主要区别是什么?Varchar是变长的,为了节省存储空间,char是定长的。查找效率比char类型快,因为varchar是不定长的,必须先查找长度,然后再提取数据,比char定长类型多了一步,所以效率是降低。5、MySQL数据库常用的存储引擎及其区别?MyISAM:不支持事务,表锁,容易产生碎片,优化频繁,读写速度快,支持全文索引。InnoDB:支持事务、行锁,具有崩溃恢复能力。读写速度比MyISAM慢,5.6以后支持全文索引。存储引擎是基于表的,不是基于数据库的(这个问题可以再细一点)6.对于流量大的网站,用什么方法解决流量问题?首先确认服务器硬件是否足以支撑当前流量。第二,优化数据库访问。第三,禁止外链。第四,控制大文件的下载。第五,使用不同的主机来分流主流量。六、使用流量分析统计软件。第七,尽量使用静态页面和缓存。7.什么是面向对象?主要特点是什么?面向对象是程序的一种设计方法,有利于提高程序的复用性,使程序结构更加清晰。主要特点:封装、继承、多态。8、SESSION和COOKIE有什么区别?这是关键点:SESSION保存在服务器端,COOKIE保存在客户端。Session更安全,cookie可以通过一些手段修改,不安全。会话依赖于cookie进行传递。禁用cookie后,session仍然可以使用。在存储session的文件中,生成一个sessionID,通过get参数方法将sessionID传递给session要共享的页面,读取sessionID从session中获取数据。session和cookie的详细教程建议找找9、你了解缓存技术吗?Redis是一个测试点(1)缓存技术是将动态内容缓存在文件中,在一定时间内访问动态页面直接调用缓存文件,无需重新访问数据库。(2)Memcache可以用来做缓存。10、表单get中get和post提交方式的区别是显式的,从url中可以看出数据,传输数据量小,安全性低;post是隐式的,传输数据量大,安全性低。更高11.优化数据库的方法选择最适用的字段属性,尽量减小定义的字段宽度,尽量将字段设置为NOTNULL,使用连接(JOIN)代替子查询,应用联合(UNION)代替手动创建临时表事务处理锁表,优化事务处理,使用外键,优化锁定表,使用索引优化查询语句12.语句include和require有什么区别?include和require语句有什么区别?require是无条件包含的,即如果在进程中加入require,无论条件是否成立,require都会先执行。当文件不存在或无法打开时,会提示错误并终止程序。include有返回值,而require没有(可能因为require比include快),如果被包含的文件不存在,会提示错误,但程序会继续执行。13、redis、memcacahe、mongoDB有什么区别?都是非关系型数据库,性能非常高,但是mongoDB、memcache、redis是两种不同的类型。后两者主要用于数据缓存,前者主要用于大数据的查询和存储。它是最接近数据库的文档型非关系数据库。在数据存储位置上,memcache的数据存在于内存中,而redis既可以存储在内存中,也可以存储在磁盘上,实现持久化存储的功能。memcache一旦断电,所有数据都会丢失,而redis可以使用Snapshots和AOF将数据保存到磁盘,恢复时从磁盘读取到内存。当物理内存用完后,可以将数据写入磁盘。在存储数据的类型上,memcache和redis都存储键值对,但是redis值的类型比较丰富,包括string(字符串)、hash(散列)、list(列表)、set(集合))zset(有序集合),memcache主要存储字符串。14.PHP的基本变量类型四种标量类型:布尔(Boolean)、整型(integer)、浮点(floatingpoint,又称double)、字符串(string)两种复合类型:数组(array)、对象(object)最后两种特殊类型:资源(resource)、NULL(NULL)15、如何实现静态化?如何实现伪静态?(1)static是指页面静态,即生成实际的静态文件,即直接从文件中获取数据,不查询数据库,是指真正的静态。实现方式主要有两种:一种是我们向数据库中添加信息时生成的静态文件,也称为模板替换技术。一种是用户在访问我们的页面时首先判断是否有对应的缓存文件。如果有读缓存,则没有读数据库,同时生成一个缓存文件。(2)伪静态不是真正意义上的静态。之所以使用伪静态,主要是为了SEO推广。搜索引擎很难获取动态文件,不利于网站推广。实践原理基于Apache或Nginx的rewritewit。主要有两种方式:一种是直接在配置虚拟机的位置配置伪静态,每次修改后需要重启web服务器。另一个是分布式的。可以在网站根目录下创建.htaccess文件,在里面配置相应的重写规则,实现伪静态。这种改写不需要每次都重启web服务器,结构比较清晰。16、Mysql的读写分离?(进阶会遇到)读写分离的实现原理是在执行SQL语句时判断是读操作还是写操作,将读操作转交给读服务器(fromserver,一般为多个),以及写入操作被转移到写入服务器(主服务器,通常是一个,取决于数据量)。当然,为了保证多个数据库中数据的一致性,需要主从复制。17、负载和高并发怎么处理?(1)静态HTML效率最高,消耗最少的纯静态HTML页面,所以我们尽量让我们网站的页面使用静态页面。这是最简单的方法,也是最有效的方法。(2)图片服务器分离,图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,比如七牛等。(3)并发连接数数据库集群和数据库表哈希和缓存数据库都是100个。一个数据库是远远不够的。我们可以从读写分离、主从复制、数据库集群入手。另外,为了尽量减少数据库访问,可以使用memcache、redis等缓存数据库。(4)镜像:尽量减少下载,将不同的请求分发到多个镜像终端。(5)负载均衡:Apache最大并发连接数为1500,只增加服务器,可以从硬件入手,比如F5服务器。当然,硬件成本比较高,我们往往从软件入手。18.说说单引号和双引号?(基本测试点)单引号里面的变量不会执行,双引号里面的会执行。单引号的解析速度比双引号快。单引号只能解析部分特殊字符,双引号可以解析所有特殊字符。19、PHP7的新特性?关键标量类型声明:PHP7中函数的形参类型声明可以是标量。在PHP5中,只能是类名、接口、数组或可调用对象(PHP5.4,可以是函数,包括匿名函数),现在也可以使用string、int、float和bool。返回类型声明:添加了对返回类型声明的支持。与参数类型声明类似,返回类型声明指定函数返回值的类型。可用类型与参数声明中可用的类型相同。NULLcoalescingoperator:由于在日常使用中有很多同时使用三元表达式和isset()的情况,NULLcoalescingoperator使得变量存在且值不为NULL,它会返回自己的值,否则它将返回它的前两个操作数。use增强:从同一命名空间导入的类、函数和常量现在可以通过单个use语句导入。匿名类:现在支持通过新类20实例化匿名类。PHP数组排序sort()-数组升序排序rsort()-数组降序排序asort()-关联数组按值升序排序ksort()-根据键对关联数组进行升序排序arsort()-根据值对关联数组进行降序排序Sortkrsort()-根据键对关联数组进行降序排序](索引字段)创建指定索引:CREATETABLEtablename([...],INDEX[indexname](indexfield))(uniqueindex)->create:CREATEUNIQUEONtablename(indexfield)修改:ALTERTABLEtablenameADDUNIQUE[indexname](indexfield)createatablespecifiedindex:CREATETABLEtablename([...],UNIQUE[indexname](indexfield))(primarykey)->是唯一索引,一般在建表的时候,格式为:CREATATABLEtablename([...],PRIMARYKEY[indexfield])22.PHP是否支持多重继承电子?不支持。PHP只允许单继承,父类可以通过关键字“extends”被子类继承。23.你用过Memcache吗?如果有,能否简单介绍一下它的工作原理?Memcahce将所有数据存储在内存中,采用哈希表的方式。每条数据由键和值组成。每个键都是唯一的。当访问某个值时,首先找到该值并返回结果。Memcahce使用LRU算法逐步清除过期数据。24.优化MYSQL数据库的方法(1)选择最有效的表名顺序(2)WHERE子句中的连接顺序(3)避免在SELECT子句中使用'*'(4)将HAVING子句替换为WHEREclauseSentence(5)ImproveSQLefficiencythroughinternalfunctions(6)避免在索引列上使用计算。(7)为了提高GROUPBY语句的效率,可以在GROUPBY之前过滤掉不需要的记录。(1).选择最适用的字段属性,并尝试将字段设置为NOTNULL(2)。使用JOIN而不是子查询(3)。使用UNION而不是手动创建临时表(4)。尽可能少地使用LIKE关键字和通配符(5)。使用事务和外键25.MySQL主从备份的原理?mysql支持单向、异步复制,复制期间一台服务器作为主服务器,一台或多台其他服务器作为从服务器。26.error_reporting()的作用是什么?设置PHP错误级别并返回当前级别。27、如何修改session的生命周期Setsession.gc_maxlifetime=1440inphp.ini//默认代码实现$lifeTime=24*3600;//保存一天session_set_cookie_params($lifeTime);session_start();28、常见的PHP安全攻击SQL注入:用户通过在表单域中输入SQL语句的方式影响SQL的正常执行。预防:使用mysql_real_escape_string()过滤数据手动检查每条数据是否是正确的数据类型使用预处理语句和绑定变量参数化SQL:指设计链接数据库和访问数据时需要填写值或数据其中,使用参数(Parameter)给值,使用@或?来表示参数。XSS攻击:一种跨站点脚本攻击,用户在这种攻击中向您的网站输入一些数据,其中包括客户端脚本(通常是JavaScript)。如果不过滤就输出数据到另一个网页,就会执行这个脚本。预防:为了防止XSS攻击,使用PHP的htmlentities()函数过滤输出到浏览器。CSRF:Cross-siterequestforgery,指的是一个页面发出的请求,看起来像是网站的可信用户,但是防伪:一般来说,要确保用户来自你的表单,并且匹配你的每一个发出表格。有两点必须牢记:为用户会话使用适当的安全措施,例如为每个会话更新id和为用户使用SSL。生成另一个一次性令牌并将其嵌入表单中,将其保存在会话(会话变量)中,在提交时检查它。如laravel中的_token代码注入:代码注入是利用计算机漏洞处理无效数据造成的。当您不小心执行了任意代码(通常是通过文件包含)时,问题就来了。编写不当的代码可能允许包含和执行远程文件。像许多PHP函数一样,require可以包含URL或文件名。要防止代码注入过滤用户输入,请在php.ini中设置禁用allow_url_fopen和allow_url_include。这样会禁用require/include/fopen的远程文件,大家别迷路了,以上就是本文的全部内容,能看到这里的都是人才。前面说了PHP的技术点很多,也是因为太多了,写的太多了,写完了也不会看太多,所以我这里整理成了PDF和文档,有需要的可以点击进入密码:想了解更多内容可以访问【比大厂】优质PHP架构师教程目录,只要会看,就可以保证你的薪水会上升到一个更高的水平(不断更新)。以上内容希望对大家有所帮助,很多PHPer在进阶的时候总会遇到一些问题和瓶颈。业务代码写多了,没有方向感,就不知道从哪里入手改进。我整理了一些这方面的资料,包括但不限于:高扩展、高性能、高并发、服务器性能调优、TP6、laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务,Nginx等知识点进阶进阶干货需要的可以免费分享给大家,需要的可以加我的PHP技术交流群953224940