php面试题及详细答案
PHP程序员应该具备独立分析和解决问题的能力,还要让面试官看到你的能力,那么php面试题一般有什么内容呢?今天小编整理了php面试题及详细答案供大家参考,一起来看看吧!
php面试题及详细答案
1、给你四个坐标点,判断它们能不能组成一个矩形,如判断 ([0,0],[0,1],[1,1],[1,0]) 能组成一个矩形。
勾股定理,矩形是对角线相等的四边形。只要任意三点不在一条直线上,任选一点,求这一点到另外三点的长度的平方,两个短的之和如果等于最长的,那么这就是矩形。
2、获取当前客户端的 IP 地址,并判断是否在
(111.111.111.111,222.222.222.222)
如果没有使用代理服务器:
$ip = $_SERVER['REMOTE_ADDR'];
使用透明代理
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
3、nginx 的 log_format 配置如下:
1 log_format main ‘remoteaddr−remote_user [timelocal]"request”’
2 ‘statusbody_bytes_sent “httpreferer"″"http_user_agent” “upstreamresponsetime""request_time” “http_x_forwarded_for"';从今天的 nginx log 文件 access.log 中:a、列出 “request_time” 最大的 20 行?b、列出早上 10 点访问量做多的 20 个 url 地址?4、什么是 CSRF 攻击?XSS 攻击?如何防范? CSRF:跨站请求伪造,可以通过通过判断来源和加 Token 的方式来防范。XSS:跨站脚本攻击,可以通过对内容转义和过滤来防范,还有 CSP
5、从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是连续的
这个问题有个关键点,扑克牌,1-13 不能再多了。这就很简单了。用 PHP 来做,定义一个数组分别存着 1 到 13, 拿出一个,置空一个,最后看下 这五个置空的 是不是连续的。这种情况不考虑抽出的顺序。
6、两条相交的单向链表,如何求它们的第一个公共节点
思想:
如果两个链表相交,则从相交点开始,后面的节点都相同,即最后一个节点肯定相同;
从头到尾遍历两个链表,并记录链表长度,当二者的尾节点不同,则二者肯定不相交;
尾节点相同,如果 A 长为 LA,B 为 LB,如果 LA>LB, 则 A 前 LA-LB 个先跳过
如果两个单向链表有公共的结点,也就是说两个链表从某一结点开始,它们的 m_pNext 都指向同一个结点。但由于是单向链表的结点,每个结点只有一个 m_pNext,因此从第一个公共结点开始,之后它们所有结点都是重合的,不可能再出现分叉。所以,两个有公共结点而部分重合的链表,拓扑形状看起来像一个 Y,而不可能像 X。
7、最长公共子序列问题 LCS,如有 [1,2,5,11,32,15,77] 和 [99,32,15,5,1,77] 两个数组,找到它们共同都拥有的数,写出时间复杂度最优的代码,不能用 array_intersect(这里有坑,需要去研究一下动态规划)。
8、linux 的内存分配和多线程原理
9、MYSQL 中主键与唯一索引的区别
主键:绝对不能有空值。唯一索引:可以有空值
10、http 与 https 的主要区别
关键是 S 上。简而言之,https 建立连接后要先把 SSL 的证书发下去,有了公钥和私钥,就可以解密了。
11、http 状态码及其含意
200 请求已成功,请求所希望的响应头或数据体将随此响应返回。
301 被请求的资源已永久移动到新位置。
302 请求的资源现在临时从不同的 URI 响应请求。
400 1、语义有误,当前请求无法被服务器理解。2、请求参数有误。
401 当前请求需要用户验证。
403 服务器已经理解请求,但是拒绝执行它。
404 请求失败,请求所希望得到的资源未被在服务器上发现。
500 服务器遇到了一个未曾预料的状况,无法完成对请求的处理,会在程序码出错时出现。
501 服务器不支持当前请求所需要的某个功能。无法识别请求的方法。
502 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
503 由于临时的服务器维护或者过载,服务器当前无法处理请求。
12、linux 中怎么查看系统资源占用情况
top、htop、free、uptime
13、SQL 注入的原理是什么?如何防止 SQL 注入 原理:第一 SQL 本身有问题(这个不是主要问题)。第二你写的 SQL 很有问题(这是最主要的)防范:第一,绝对不要相信用户输入的任何东西。第二,预编译。现在的框架一般都会有 SQL 过滤的。
14、isset (null) isset (false) empty (null) empty (false) 输出 PHP 入门问题,isset 和 empty 的区别分别是 false, true, true, true
15、优化 MYSQL 的方法 第一,数据超过一定数量或者体积,请拆分表,垂直或者水平分(最有效果的优化)第二,务必有自增主键。通过自增主键来查数据是最快的。第三,常用的查询字段建立联合索引,写 SQL 一定要尊从最左原则,用到这个索引。第四,不要把逻辑运算放到 sql 里。言外之意是,不要写太复杂的 SQL,你能写复杂的 SQL 你肯定也能通过 PHP 实现。
php面试宝典
说到php面试宝典,可能在一百个人看来,就有一百个哈姆雷特。所以说,没有绝对的宝典,只有相对的经验。根据小编的'总结,这些经验主要体现在以下三个方面。
第一,专业技术不可少。
毕竟公司招的是专业的php工程师,如果他不能为企业解决相关的技术问题,是不可能得到这份工作的。在面试时,技术方面的主考官很可能把自己遇到的实际问题摆在应聘者眼前,如果应聘者回答得不能让人满意,很可能就止步于此了。假设你也要应聘php工程师,没有知识上的积累,很可能会导致应聘失败。程序员的职业发展规划和分类
第二,综合素质很重要。
在php面试宝典里,这一条也是相当重要的。所谓综合素质,既包括应聘者的事业心、进取心,又包括他对工作的热情、自律能力等内容。试想,如果一个应聘php工程师的人,除了在专业上的能力,其他一无是处,那么,主考官不会录用他的。这是因为,php工程师也要与公司里的其他人和平共处,也要得到别人的支持,或者给予别人支持。
第三,回答薪酬要讨巧。
很多php工程师在面对主考官时,会被问到预期的工资的问题。这个问题确实有点棘手,如果你要价高了,招聘单位不会录用你,如果你要价低了,又不能体现出自己的价值,让自己受了委屈。所以,在回答这一问题时,一定要从实际情况出发,将行业内盛行的工资水平作为参考,加上自己的预期,给主考官报一个在合理范畴内的工资水准。
学习了php面试宝典,应聘者还要注意,任何一份工作都有自己的特殊性,如果你对这份工作没有必要的激情和动力,就不要去争夺它了。因为,这样既浪费了你自己的时间和精力,也给主考官带来了一定的困扰。
php运行机制
PHP常见的运行模式有2种,分别是php-fpm 和php-cli 。当PHP 选择运行在php-fpm模式下,所有的变量都是页面级的,无论是全局变量还是类的静态成员,都会在页面执行完毕后被清空。运行在php-cli模式下可以实现程序常驻内存,各种变量和数据库连接都能长久保存在内存 实现资源复用,性能可以得到很大的提升,php-cli虽然开发比较复杂,但是能够获取更高的性能,对开发者的要求比较高需要比较高的开发水平,比较常用的模式是结合swoole 组件编写cli框架,各种变量能保存在跨进程的高性能共享内存 Table ,可以开发出支持热启动的php-cli可靠各类应用系统。
php-fpm在PHP 5.3.3 版本成为了官方正式组件(2010-07-22),它提供了稳定可靠的进程管理服务,进程不足时候可以智能扩充数量,闲置时候可以自动回收销毁多余的进程,同时它对程序的容错能力很强大运行非常稳定,可以应付企业级的开发需求。php-fpm友好的完成了使用HTTP/HTTPS等TCP/IP互联网协议下进行的用户的输入输出,页面级生命周期各种资源用完即释放,不存在内存泄漏的问题。php-fpm也提供有一些常驻内存的技术支持,例如PHP 7.4引入的opcache.preload也能实现局部的PHP类和函数的常驻内存,不过这个方法不够灵活,和服务器配置捆绑的太死了。
php-cli因为能实现各类资源的常驻内存,所以可以资源复用,更高效完成多进程编程和异步编程,可以开发出负载能力更高的应用系统。但是相对php-fpm的简单编程开发,开发者要注意很多的事项和需要做很多附加的控制器开发,否则就无法实现期待中的高性能。
首先开发者需要去实现可靠的进程管理服务,保证系统进程遇到各类错误退出运行后能够自动创建新的进程,只有这样才能保证后续的服务请求有足够空闲进程可分配。每个业务代码段都要做异常处理,让进程遇到非致命错误时候不会退出,因为进程重启意味程序和各类资源需要再次加载,这个过程性能消耗不小,所以只有进程稳定运行了常驻内存才有意义。
其次因为常驻内存,编写的新的程序必须重启服务才能生效,这一点习惯了fpm模式的开发者会感到比较陌生。另外开发者需要手工释放内存,否则系统长时间运行后会出现内存泄露。同时在cli模式下,我们不能像fpm里直接用 $_SERVER、$_POST、$_GET、$_COOKI和$_FILES 进行编程工作,需要自己去解析各种互联网通讯协议完成用户的输入输出。要实现多进程编程利用多核CPU计算,还有学习使用pcntl和posix编程,这里涉及到了异步编程逻辑,这块难度还是比较大的。比较常用的模式是结合swoole 组件编写cli框架。
PHP是一个活跃的社区开发语言,有专业的核心开发团队在持续不断的迭代,最近一个版本就是PHP 8.0.8 引入了很多的新特性。