이 기사는 모든 사람을 위한 몇 가지 일반적인 PHP 인터뷰 질문(답변 포함)을 요약한 것입니다. 도움이 필요한 친구가 이를 참조할 수 있기를 바랍니다.
학교를 막 졸업하고 시장이 어떤지 몰랐고 경험도 없었습니다(여기에 문장 삽입, 경험 없음). , 만약 당신이 한번도 완성된 프로젝트나 반완성된 프로젝트를 개발한 적이 없다면, 회사는 일반적으로 당신을 원하지 않을 것입니다. 왜냐하면 회사는 물건을 만드는 데 도움을 주고 회사의 비즈니스와 성과를 향상시키기 위해 당신을 채용하기 때문입니다. 그 당시에는 시험 기간이 800 위안이라고 말했습니다. 물론 몇 년 전이었습니다! 가격도 꽤 저렴해서 회사에서 그냥 달라고 하더라구요! ! ! 그 이유는 매우 간단합니다. 모두가 알고 있습니다!
[관련 추천 : php 면접 질문(요약)]
회사에서 프로젝트를 할 때 성장은 과정이며, 자신의 학습 능력을 향상시키는 것이 핵심입니다. 입사하기 전에 1~2차례의 면접과 필기시험을 치르게 되는데 이는 우리 업계의 모든 사람들이 다 그러하므로 말하기 능력(말할 수 있는 능력) 외에 강점과 능력도 있습니다. 이는 또한 인터뷰 질문에 구현된 것이기도 합니다. 면접 질문에는 다양한 유형이 있지만 모두 PHP의 기본과 떼려야 뗄 수 없는 관계입니다. 방금 나온 사람들은 시험 문제를 이해하지 못할 수도 있습니다. 제가 그 때 실제로 사용했던 방법을 알려드릴게요! 문제 유형을 모두 외워보세요! 이 방법은 매우 구식이고 비현실적입니다. 하지만 흔한 질문 유형을 모두 접했기 때문에 매우 유용합니다 ~~ 운이 좋을 수도 있습니다!
다양한 방법으로 배울 수 있습니다! 나는 전에도 이런 식으로 여기에 와본 적이 있어요! 이제 우리는 계속해서 기술을 배우고 향상해야 하며, 계속해서 학습해야 합니다! 한 번 함정에 빠지면 빠져나오기 어렵습니다!
다음은 일반적인 면접 질문 몇 가지를 추천해 드리는 내용입니다. 도움이 되셨기를 바랍니다! !
1. 버블정렬, 면접 전 꼭 기억해주세요!
function maopao($arr) { $len = count($arr); $n = count($arr) - 1; for ($i = 0; $i < $len; $i++) { for ($j = 0; $j < $n; $j++) { if ($arr[$j] > $arr[$j + 1]) { $tmp = $arr[$j]; $arr[$j] = $arr[$j + 1]; $arr[$j + 1] = $tmp; } } } return $arr; }
2. 빠른 정리, 면접 전 꼭 기억해주세요!
function quick_sort($array) { if (count($array) <= 1) return $array; $key = $array[0]; $left_arr = array(); $right_arr = array(); for ($i=1; $i<count($array); $i++){ if ($array[$i] <= $key) $left_arr[] = $array[$i]; else $right_arr[] = $array[$i]; } $left_arr = quick_sort($left_arr); $right_arr = quick_sort($right_arr); return array_merge($left_arr, array($key), $right_arr); }
3. PHP에서 값으로 전달하는 경우와 참조로 전달하는 경우의 차이점을 설명해 주세요.
값으로 전달: 범위 내에서 값이 변경됩니다. 함수는 함수 외부에서 무시됩니다
참조로 전달: 함수 범위 내에서 값을 변경하면 함수 외부에서도 이러한 수정 사항이 반영됩니다.
장점과 단점: 값으로 전달할 때 PHP는 값을 복사해야 합니다. 특히 큰 문자열과 개체의 경우 비용이 많이 드는 작업이 될 수 있습니다. 참조로 전달하면 값을 복사할 필요가 없으므로 성능 향상에 좋습니다. (장단점 고려)
4. MySQL 데이터베이스에서 varchar와 char 필드 유형의 주요 차이점은 무엇입니까?
Varchar는 가변 길이이고 저장 공간을 절약하지만 char은 고정 길이입니다. . varchar는 고정된 길이가 아닌 길이를 먼저 검색한 후 데이터를 추출해야 하기 때문에 char 타입보다 검색 효율성이 빠르며, 이는 char 고정 길이 타입보다 한 단계 더 진행되므로 효율성이 더 낮습니다.
5. MySQL 데이터베이스에서 일반적으로 사용되는 스토리지 엔진과 차이점은 무엇인가요?
MyISAM: 트랜잭션, 테이블 잠금을 지원하지 않으며 조각화되기 쉽고 자주 최적화해야 하며 읽기 및 쓰기 속도가 빠르고 전체 텍스트 인덱싱을 지원합니다.
InnoDB: 트랜잭션, 행 잠금 및 충돌 복구 기능을 지원합니다. 읽기 및 쓰기 속도는 MyISAM보다 느리며, 전체 텍스트 인덱싱은 5.6 이상에서 지원됩니다.
스토리지 엔진은 데이터베이스가 아닌 테이블을 기반으로 합니다
(이 질문은 가능하면 더 자세히 설명할 수 있습니다)
6. 트래픽이 많은 웹사이트의 경우 트래픽 문제를 해결하기 위해 어떤 방법을 사용하나요?
먼저 서버 하드웨어가 현재 트래픽을 지원할 만큼 충분한지 확인하세요
둘째, 데이터베이스 액세스를 최적화하세요.
셋째, 외부 핫링크를 금지합니다.
넷째, 대용량 파일의 다운로드를 제어합니다.
다섯째, 다른 호스트를 사용하여 주요 트래픽을 전환합니다
여섯째, 트래픽 분석 및 통계 소프트웨어를 사용합니다
일곱째, 정적 페이지와 캐시를 사용해 보세요
7. 주요 기능은 무엇입니까?
객체 지향은 프로그램의 재사용성을 향상시키고 프로그램 구조를 보다 명확하게 만드는 프로그램 설계 방법입니다. 주요 기능: 캡슐화, 상속, 다형성.
8. 세션과 쿠키의 차이점은 무엇인가요? 이것이 포인트
SESSION은 서버측에 저장되고 COOKIE는 클라이언트측에 저장됩니다. 세션은 상대적으로 안전합니다. 쿠키는 특정 수단으로 수정될 수 있으며 안전하지 않습니다. 세션은 전달을 위해 쿠키를 사용합니다. 쿠키를 비활성화한 후에도 세션을 계속 사용할 수 있으며, 세션이 저장된 파일에서 세션 ID가 생성되며, 세션 ID는 get 매개변수를 통해 세션을 공유할 페이지로 전달되고 세션 ID를 읽어옵니다. 세션에서 데이터를 가져옵니다.
세션 및 쿠키에 대한 자세한 튜토리얼을 찾아보는 것이 좋습니다
9. 캐싱 기술에 대해 알고 계시나요? Redis는 테스트 포인트입니다
1. 캐싱 기술은 동적 콘텐츠를 파일로 캐시하고, 일정 시간 내에 동적 페이지에 접근하여 데이터베이스를 다시 방문할 필요 없이 캐시된 파일을 직접 호출하는 기술입니다.
2. 캐싱에는 Memcache를 사용하세요.
10. 양식에서 get과 post 제출 방법의 차이점은
get이 URL에서 볼 수 있고 전송되는 데이터의 양이 적으며 보안이 낮습니다. 게시물은 암시적이며 전송되는 데이터의 양이 크고 보안이 높습니다
11. 데이터베이스를 최적화하는 방법가장 적합한 필드 속성을 선택하고 정의된 필드 너비를 최대한 줄입니다. 필드를 NOTNULL로 설정해 보세요
연결(JOIN)을 사용하여 하위 쿼리 교체
Union(UNION)을 사용하여 수동으로 생성된 임시 테이블 교체
트랜잭션 처리
테이블 잠금, 트랜잭션 처리 최적화
외래 키 사용, 잠금 최적화 tables
인덱스 사용
쿼리 문 최적화
12. include 문과 require 문 사이의 차이점은 무엇인가요? 명령문 포함과 요구의 차이점은 무엇입니까? require는 무조건 포함입니다. 즉, require가 프로세스에 추가되면 조건이 true인지 여부에 관계없이 require가 먼저 실행됩니다. 파일이 존재하지 않거나 열 수 없으면 오류가 발생합니다. 그러면 프로그램 실행이 종료됩니다
include 반환 값이 있지만 require는 그렇지 않습니다(아마도 require가 include보다 빠르기 때문일 것입니다). 포함된 파일이 없으면 오류 메시지가 표시되지만 프로그램은 계속 실행됩니다. 13. redis와 memcacahe, mongoDB의 차이점은 무엇인가요?
모두 성능이 매우 뛰어난 비관계형 데이터베이스이지만 mongoDB, memcache 및 redis는 서로 다른 두 가지 유형입니다. 후자는 주로 데이터 캐싱에 사용됩니다. 전자는 데이터베이스에 가장 가까운 문서형 비관계형 데이터베이스입니다. 데이터 저장 위치의 관점에서 Memcache 데이터는 메모리에 저장되는 반면 Redis는 메모리나 디스크에 저장되어 영구 저장 기능을 구현할 수 있습니다. Memcache의 전원이 꺼지면 모든 데이터가 손실되며 Redis는 스냅샷과 AOF를 사용하여 데이터를 디스크에 저장하고 복구 중에 디스크에서 메모리로 읽을 수 있습니다. 실제 메모리가 모두 사용되면 데이터를 디스크에 쓸 수 있습니다. 저장되는 데이터 유형의 측면에서 memcache와 redis는 두 키-값 쌍을 모두 저장하지만 redis는 문자열(string), 해시(hash), 목록(list) 및 세트(Set) zset를 포함하여 더 풍부한 값 유형을 갖습니다. (순서가 지정된 세트) 반면 Memcache는 주로 문자열을 저장합니다.
14. PHP의 기본 변수 유형
네 가지 스칼라 유형: boolean(부울 유형), 정수(정수 유형), float(부동 소수점 유형, double이라고도 함), 문자열(문자열) 두 가지 복합 유형 : 배열(array), 객체(object)마지막으로 두 가지 특별한 유형이 있습니다: 리소스(resource), NULL(NULL)
15. 의사정적을 구현하는 방법은 무엇입니까? 1. 정적화는 페이지 정적화를 의미하며, 이는 실제 정적 파일을 생성하는 것을 의미합니다. 즉, 데이터베이스를 쿼리하지 않고 파일에서 직접 데이터를 얻을 수 있으며, 이는 진정한 정적을 의미합니다.두 가지 주요 구현 방법이 있습니다. 하나는 데이터베이스에 정보를 추가할 때 생성되는 정적 파일로, 템플릿 교체 기술이라고도 합니다. 하나는 사용자가 우리 페이지를 방문할 때 먼저 해당 캐시 파일이 있는지 확인합니다. 캐시 파일이 있고 데이터베이스가 없으면 동시에 캐시 파일이 생성됩니다.
2、伪静态不是真正意义上的静态化,之所以使用伪静态,主要是为了SEO推广,搜索引擎对动态的文件获取难度大,不利于网站的推广。实习原理是基于Apache或Nginx的rewrite机智
主要有两种方式:
一种是直接在配置虚拟机的位置配置伪静态,这个每次修改完成后需要重启web服务器。
另一种采用分布式的,可以在网站的根目录上创建.htaccess的文件,在里面配置相应的重写规则来实现伪静态,这种每次重写时不需要重启web服务器,且结构上比较清晰。
16、Mysql的读写分离?(进阶的会遇到)
读写分离的实现原理就是在执行SQL语句的时候,判断到底是读操作还是写操作,把读的操作转向到读服务器上(从服务器,一般是多台),写的操作转到写的服务器上(主服务器,一般是一台,视数据量来看)。当然为了保证多台数据库数据的一致性,需要主从复制。
17、如何处理负载,高并发?
1、HTML静态化
效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。
2、图片服务器分离
把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如七牛等
3、数据库集群和库表散列及缓存
数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。
4、镜像:
尽量减少下载,可以把不同的请求分发到多个镜像端。
5、负载均衡:
Apache的最大并发连接为1500,只能增加服务器,可以从硬件上着手,如F5服务器。当然硬件的成本比较高,我们往往从软件方面着手。
18、说一下单引号双引号?(基础考点)
单引号内部的变量不会执行, 双引号会执行
单引号解析速度比双引号快。
单引号只能解析部分特殊字符,双引号可以解析所有特殊字符。
19、PHP7的新特性?重点
标量类型声明:PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 callable (PHP 5.4,即可以是函数,包括匿名函数),现在也可以使用 string、int、float和 bool 了。
返回值类型声明:增加了对返回类型声明的支持。 类似于参数类型声明,返回类型声明指明了函数返回值的类型。可用的类型与参数声明中可用的类型相同。
NULL 合并运算符:由于日常使用中存在大量同时使用三元表达式和 isset()的情况,NULL 合并运算符使得变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。
use 加强:从同一 namespace 导入的类、函数和常量现在可以通过单个 use 语句 一次性导入了
匿名类:现在支持通过new class 来实例化一个匿名类
20、PHP 数组排序
sort() - 以升序对数组排序
rsort() - 以降序对数组排序
asort() - 根据值,以升序对关联数组进行排序
ksort() - 根据键,以升序对关联数组进行排序
arsort() - 根据值,以降序对关联数组进行排序
krsort() - 根据键,以降序对关联数组进行排序
21、建立索引
(普通索引)-> 创建:CREATE INDEX <索引名> ON tablename (索引字段) 修改:ALTER TABLE tablename ADD INDEX [索引名] (索引字段) 创表指定索引:CREATE TABLE tablename([...],INDEX[索引名](索引字段)) (唯一索引)-> 创建:CREATE UNIQUE <索引名> ON tablename (索引字段) 修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引字段) 创表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引字段)) (主键)-> 它是唯一索引,一般在创建表是建立,格式为: CREATA TABLE tablename ([...],PRIMARY KEY[索引字段])
22、PHP支持多继承吗?
不支持。PHP中只允许单继承,父类可以被一个子类用关键字“extends”继承。
23、使用过Memcache缓存吗,如果使用过,能够简单的描述一下它的工作原理吗?
Memcahce是把所有的数据保存在内存当中,采用hash表的方式,每条数据又key和value组成,每个key是独一无二的,当要访问某个值的时候先按照找到值,然后返回结果。
Memcahce采用LRU算法来逐渐把过期数据清除掉。
24、优化MYSQL数据库的方法
(1)选择最有效率的表名顺序 (2)WHERE子句中的连接顺序 (3)SELECT子句中避免使用‘*’ (4)用Where子句替换HAVING子句 (5)通过内部函数提高SQL效率 (6)避免在索引列上使用计算。 (7)提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉。 (1).选取最适用的字段属性,应该尽量把字段设置为NOT NULL (2).使用连接(JOIN)来代替子查询(Sub-Queries) (3).使用联合(UNION)来代替手动创建的临时表 (4).尽量少使用 LIKE 关键字和通配符 (5).使用事务和外键
25、MySQL主从备份的原理?
mysql支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。
26、error_reporting() 的作用?
设置 PHP 的报错级别并返回当前级别。
27、如何修改session的生存时间
在php.ini 中设置 session.gc_maxlifetime = 1440 //默认时间
代码实现
$lifeTime = 24 * 3600; // 保存一天 session_set_cookie_params($lifeTime); session_start();
28、常见的 PHP 安全性攻击
SQL注入:用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行。
防止:
使用mysql_real_escape_string()过滤数据
手动检查每一数据是否为正确的数据类型
使用预处理语句并绑定变量
参数化SQL:是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,用@或?来表示参数。
XSS攻击 :跨站点脚本攻击,由用户输入一些数据到你的网站,其中包括客户端脚本(通常JavaScript)。如果你没有过滤就输出数据到另一个web页面,这个脚本将被执行。
防止:为了防止XSS攻击,使用PHP的htmlentities()函数过滤再输出到浏览器。
CSRF: 사이트 간 요청 위조. 페이지에서 사이트의 신뢰할 수 있는 사용자인 것처럼 보이지만 가짜인 요청을 하는 경우입니다.
Prevention: 일반적으로 사용자가 양식에서 오는지 확인하세요. , 그리고 이는 귀하가 보내는 모든 양식과 일치합니다. 기억해야 할 두 가지 사항이 있습니다.
각 세션의 ID를 업데이트하고 사용자에 대해 SSL을 사용하는 등 사용자 세션에 적절한 보안 조치를 적용합니다.
또 다른 일회용 토큰을 생성하여 양식에 포함하고 세션(세션 변수)에 저장한 후 제출 시 확인하세요. 예를 들어 laravel의 _token
코드 주입: 코드 주입은 유효하지 않은 데이터를 처리하여 컴퓨터 취약점을 악용하여 발생합니다. 문제는 일반적으로 파일 포함을 통해 실수로 임의의 코드를 실행할 때 발생합니다. 잘못 작성된 코드로 인해 원격 파일이 포함되고 실행될 수 있습니다. 많은 PHP 함수와 마찬가지로 require에는 URL이나 파일 이름이 포함될 수 있습니다.
코드 삽입 방지
사용자 입력 필터링
php.ini 설정에서allow_url_fopen 및allow_url_include를 비활성화하세요. 이렇게 하면 require/include/fopen의 원격 파일이 비활성화됩니다.
질문 유형이 많습니다. 학습 과정에서 학습 능력을 천천히 발견하고 향상시키시기 바랍니다. !