이 기사는 PHP에 대한 관련 지식을 제공합니다. 주로 PHP 인터뷰 질문을 소개하고 39가지 일반적인 인터뷰 질문을 요약합니다. PHP 인터뷰 질문에는 여러 가지 유형이 있지만 모두 기본과 분리될 수 없습니다. 일반적인 PHP 면접 질문이 모두에게 도움이 되기를 바랍니다.
추천 학습: "PHP 튜토리얼"
브라우저는 현재 URL 데이터를 구문 분석하여 해당 URL이 합법적인 링크인지 확인합니다. 합법적인 링크라면 정상적으로 다음 단계로 진행하세요. 합법적인 링크가 아닐 경우 바이두, 360, 구글 검색 등 검색 기능이 실행됩니다.
2단계, 도메인 이름 확인
서버는 IP 형태로 존재합니다. 도메인 이름을 IP로 확인해야 합니다. IP를 확인하는 세 가지 작은 단계가 있습니다.
1) 브라우저 자체 캐시에서 도메인 이름 데이터를 구문 분석하고
2) 로컬의 HOST 파일에서 도메인 이름을 확인합니다. 컴퓨터
3 ), DNS 서버를 통해 도메인 이름을 확인합니다
3단계, 정보 가져오기
이 단계에서는 주로 IP 및 포트 정보와 같은 URL 정보를 가져옵니다.
4단계. 패킷을 전송하고 3방향 핸드셰이크를 수행합니다
브라우저는 요청 정보를 패키징하고 TCP의 3방향 핸드셰이크를 통해 서버에 데이터를 전송합니다.
5단계: 서버가 데이터를 구문 분석, 처리 및 반환합니다
서버는 전달된 데이터를 다양한 수준과 방법을 통해 가져와 분석 및 처리한 후 최종적으로 응답 MIME 유형 데이터를 반환합니다. 정상적인 상태 코드는 200이고, 비정상적인 오류 코드는 404, 500, 501 등입니다.
6단계. 브라우저가 데이터를 가져오고, 렌더링하고, 표시합니다.
브라우저는 서버에서 데이터를 가져오고, 리소스를 로드하고, 페이지 등을 렌더링하고 사용자에게 페이지를 표시합니다.
2. SESSION과 COOKIE의 차이점은 무엇인가요? 프로토콜의 이유와 기능을 설명해 주세요.쿠키를 비활성화하면 세션을 정상적으로 이용하실 수 없습니다. 세션의 단점: 서버 측에 저장되며, 각 읽기는 서버에서 읽혀지므로 서버의 리소스가 소모됩니다. 세션은 서버 측의 파일이나 데이터베이스에 저장되며, 기본적으로 파일 경로는 PHP 구성 파일의 session.save_path에 지정됩니다. 세션 파일은 공개됩니다.
3. HTTP 상태의 302, 403, 500 코드는 무엇을 의미하나요?압축 해제: tar xzf file.tar.gz
Bz2:
패키지: bzip2 [-k] 파일
압축해제: bunzip2 [-k] 파일
Gzip(파일만, 원본 파일은 보관하지 않음)
패키지: gzip file1.txt
압축해제: gunzip file1.txt.gz
Zip: -r 디렉토리 압축
: zip file1.zip file1.txt
압축 해제: unzip file1.zip
Int Integer char 고정 길이 문자 Varchar 가변 길이 문자 Datetime Datetime 유형 Text 텍스트 유형 Varchar와 char char의 차이점은 고정 길이 문자 유형이 얼마나 많은 공간을 차지하느냐 하는 것입니다. Varchar는 가변 길이 문자 유형으로, 내용만큼 공간을 차지하므로 공간을 효과적으로 절약할 수 있습니다. varchar 타입은 가변형이므로 데이터 길이가 변경되면 서버에서 추가 작업을 수행해야 하므로 char 타입에 비해 효율성이 떨어집니다.
MyISAM 유형은 트랜잭션 및 테이블 잠금을 지원하지 않으며 조각화되기 쉽습니다. 자주 최적화해야 하며 읽기 및 쓰기 속도가 더 빠른 반면, InnoDB 유형은 트랜잭션, 행 잠금을 지원하고 충돌 복구 기능을 제공합니다. 읽기 및 쓰기 속도는 MyISAM보다 느립니다.
인덱스 생성: 경고 테이블 테이블 이름 추가 인덱스(`필드 이름`)
이해: session_start()가 켜져 있으면 상수 SID가 생성됩니다. COOKIE가 켜져 있으면 이 상수는 비어 있습니다. COOKIE가 닫히면 PHPSESSID 값이 이 상수에 저장됩니다. SESSIONID 값을 전달하기 위해 URL 뒤에 SID 매개변수를 추가하면 클라이언트 페이지가 SESSION의 값을 사용할 수 있습니다. 클라이언트가 COOKIE를 열고 서버가 SESSION을 열 때. 브라우저가 첫 번째 요청을 하면 서버는 SESSIONID를 저장하기 위해 브라우저에 쿠키를 보냅니다. 브라우저가 두 번째 요청을 하면 기존
Isset 변수가 존재하는지 확인하려면 여러 변수를 전달할 수 있습니다. 변수 중 하나가 존재하지 않으면 false를 반환합니다. 변수가 비어 있는지 확인하면 변수 하나만 false가 됩니다. 비어 있으면 true를 반환합니다.
답변: 두 가지 주요 방법이 있습니다.
1) 스냅샷 지속성
은 Redis 구성 파일에서 자동으로 설정되었습니다.
형식은 다음과 같습니다. save N M
은 N 초 내에 Redis가 최소한 M 발생 수정되면 redis는 디스크에 스냅샷을 생성합니다.
물론 save 또는 bgsave(비동기) 명령을 수동으로 실행하여 스냅샷을 만들 수도 있습니다
2) 파일만 추가 AOF 지속성
appendfsync Everysec과 같은 총 세 가지 모드가 있습니다. 기본값은 강제로 실행하는 것입니다. 1초에 한 번 디스크에 쓰기
appendfsync는 쓰기 작업이 수행될 때마다 항상 강제로 디스크에 쓰기를 수행합니다.
appendfsync 아니요 완전히 OS에 따라 다르므로 성능은 최고이지만 지속성은 보장할 수 없습니다
세 번째 모드가 최고입니다 . Redis는 기본적으로 세 번째 모드도 채택합니다.
답변: 일반적으로 사용되는 것은 크게 두 가지 유형으로 나뉘는데, 하나는 innodb이고 다른 하나는 myisam입니다. 둘 사이의 주요 차이점은
1) myisam은 트랜잭션 처리를 지원하지 않습니다. , innoDB는 트랜잭션 처리를 수행하지만
2) myisam은 외래 키를 지원하지 않고 innoDB는 외래 키를 지원합니다
3) myisam은 전체 텍스트 검색을 지원하지만 innoDB는 MySQL5.6 버전 이후에만 전체 텍스트 검색을 지원합니다
4) 데이터의 저장 형태가 다릅니다. mysiam 테이블 구조, 인덱스, 데이터, innoDB 세 가지 파일에 저장됩니다. 저장소는 구조를 하나의 파일로 저장하고 인덱스와 데이터는 하나의 파일로 저장됩니다
5) myisam은 innoDB보다 성능이 더 좋습니다. 데이터 쿼리 및 추가, innoDB는 일괄 삭제 성능이 더 높습니다.
6) myisam은 테이블 잠금을 지원하고, innoDB는 행 잠금을 지원합니다
답변: SQL 주입 공격은 사용자나 해커가 특수 입력을 구성하고 이를 웹 애플리케이션에 매개변수로 전달하는 것을 의미합니다. 이러한 입력의 대부분은 SQL 구문의 일부 조합으로 이루어진 후 SQL 문을 실행하여 공격자를 실행합니다. 필요한 작업의 경우 프로그래머가 사용자가 입력한 데이터를 주의 깊게 필터링하지 않아 불법 데이터가 시스템에 침입했다는 것입니다. 따라서 개발 과정에서 sql 주입을 방지해야 하는 이유는 주로 두 가지 측면에서입니다.
1) 자리 표시자 방법은 sql 문을 전처리한 후 sql 문을 실행하는 것입니다.
2) addlashes 또는 mysql_real_escape_string을 통해 두 함수가 값을 이스케이프합니다. 사용자가 입력하고 일부 특수 문자를 이스케이프합니다.
PDO 클래스에는 전처리를 구현할 수 있는 prepare 메소드가 있습니다. PDOStament 클래스의 excute 메소드는 두 가지 유형의 전처리 매개변수가 있습니다. , 다른 하나는 ? 자리 표시자입니다. 문자열 자리 표시자는 전처리를 수행하고 매개 변수를 전달할 때 연관 배열을 전달하고, ? 자리 표시자는 인덱스 배열을 전달합니다. 두 가지를 혼합할 수는 없지만 일반적으로 문자열 자리 표시자를 사용하는 것이 좋습니다.
답변: MySQL 최적화는 주로 다음과 같은 측면에서 이루어집니다.
1) 설계 관점: 스토리지 엔진 선택, 필드 유형 선택, 패러다임
2) 기능적 관점: 인덱스, 인덱스 등 MySQL 고유의 특성을 사용할 수 있습니다. 쿼리 캐싱, 조각 모음, 파티셔닝, 테이블 분할 등
3) SQL 문 최적화: 쿼리 문을 최대한 단순화하고 쿼리 필드를 가능한 한 적게 사용하며 페이징 문, 그룹화 문 등을 최적화합니다.
4) 대규모 로드 아키텍처 시스템 배포: 데이터베이스 서버를 분리합니다. 로드가 많은 경우 마스터-슬레이브 복제 및 읽기-쓰기 분리 메커니즘을 설계에 사용할 수 있습니다.
5) 하드웨어에서 데이터베이스 서버를 업그레이드합니다.
값으로 전달: 함수 범위 내에서 값을 변경하면 함수 외부에서 무시됩니다.
참조로 전달: 함수 범위 내에서 값을 변경하면 함수 외부에서도 이러한 수정 사항이 반영됩니다.
장점 및 단점 : 누르기 값이 전달되면 PHP는 값을 복사해야 합니다. 특히 큰 문자열과 개체의 경우 비용이 많이 드는 작업이 될 수 있습니다. 참조로 전달하면 값을 복사할 필요가 없으므로 성능 향상에 좋습니다.
PHP의 오류 수준을 설정하고 현재 수준을 반환합니다.
원리: 빠른 정렬은 분할 및 정복 전략을 사용하여 정렬할 데이터 시퀀스를 두 개의 하위 시퀀스로 나눕니다. :
(1) 시퀀스에서 요소를 선택하고 해당 요소를 "데이텀"이라고 부릅니다.
(2) 배열을 한 번 스캔하고 "베이스"보다 작은 모든 요소를 베이스 앞에 배치하고 "베이스"보다 큰 모든 요소를 베이스 뒤에 배열합니다.
(3) 기준 값보다 작은 요소의 하위 배열과 기준 값보다 큰 요소의 하위 배열이 정렬될 때까지 재귀를 통해 각 하위 시퀀스를 더 작은 시퀀스로 나눕니다.
//快速排序(数组排序) function QuickSort($arr){ $num = count($arr); $l=$r=0; for($i=1;$i<$num;$i++){ if($arr[$i] < $arr[0]){ $left[] = $arr[$i]; $l++; }else{ $right[] = $arr[$i]; $r++; } } if($l > 1){ $left = QuickSort($left); } $new_arr = $left; $new_arr[] = $arr[0]; if($r > 1){ $right = QuickSort($right); } for($i=0;$i<$r;$i++){ $new_arr[] = $right[$i]; } return $new_arr; }
//二分查找(数组里查找某个元素) function bin_sch($array, $low, $high, $k){ if ($low <= $high){ $mid = intval(($low+$high)/2); if ($array[$mid] == $k){ return $mid; }elseif ($k < $array[$mid]){ return bin_sch($array, $low, $mid-1, $k); }else{ return bin_sch($array, $mid+1, $high, $k); } } return -1; } //顺序查找(数组里查找某个元素) function seq_sch($array, $n, $k){ $array[$n] = $k; for($i=0; $i<$n; $i++){ if($array[$i]==$k){ break; } } if ($i<$n){ return $i; }else{ return -1; } }
//二维数组排序, $arr是数据,$keys是排序的健值,$order是排序规则,1是升序,0是降序 function array_sort($arr, $keys, $order=0) { if (!is_array($arr)) { return false; } $keysvalue = array(); foreach($arr as $key => $val) { $keysvalue[$key] = $val[$keys]; } if($order == 0){ asort($keysvalue); }else { arsort($keysvalue); } reset($keysvalue); foreach($keysvalue as $key => $vals) { $keysort[$key] = $key; } $new_array = array(); foreach($keysort as $key => $val) { $new_array[$key] = $arr[$val]; } return $new_array; }
class regx { public static function check($str) { if(preg_match("/^([1-9,])+$/",$str)) { return true; } return false; } } $str="12345,6"; if(regx::check($str)) { echo "suc"; } else { echo "fail"; }
class Db { private static $instance; public $handle; Private function __construct($host,$username,$password,$dbname) { $this->handle=NULL; $this->getcon($host,$username,$password,$dbname); } public static function getBb() { self::$instance=new Db(); return self::$instance; } private function getcon($host,$username,$password,$dbname) { if($this->handle!=NULL){ return true; } $this->handle=mysqli_connect($host,$username,$password,$dbname); } }
A) SQLite Database
B) MySQL Database
C) 공유 메모리
D) 파일 시스템
E) 세션 서버
<?php function mystrtoupper($a){ $b = str_split($a, 1); $r = ''; foreach($b as $v){ $v = ord($v); if($v >= 97 && $v<= 122){ $v -= 32; } $r .= chr($v); } return $r; } $a = 'a中你继续F@#$%^&*(BMDJFDoalsdkfjasl'; echo 'origin string:'.$a."\n"; echo 'result string:'; $r = mystrtoupper($a); var_dump($r);
24. PHP의 is_writeable() 함수에는 버그가 있어 디렉터리/파일이 쓰기 가능한지 여부를 정확하게 확인할 수 없습니다. 디렉터리/파일이 완전히 쓰기 가능한지 확인하는 함수를 작성하세요.
파일인 경우 파일을 열어(fopen) 파일에 쓰기 가능한지 테스트할 수 있습니다.
2) Unix에서는 PHP 구성 파일에서 safe_mode가 켜져 있으면(safe_mode=on) is_writeable()도 사용할 수 없습니다.
safe_mode가 켜져 있는지 확인하려면 구성 파일을 읽어보세요.
/** * Tests for file writability * * is_writable() returns TRUE on Windows servers when you really can't write to * the file, based on the read-only attribute. is_writable() is also unreliable * on Unix servers if safe_mode is on. * * @access private * @return void */ if ( ! function_exists('is_really_writable')) { function is_really_writable($file) { // If we're on a Unix server with safe_mode off we call is_writable if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE) { return is_writable($file); } // For windows servers and safe_mode "on" installations we'll actually // write a file then read it. Bah... if (is_dir($file)) { $file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100)); if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) { return FALSE; } fclose($fp); @chmod($file, DIR_WRITE_MODE); @unlink($file); return TRUE; } elseif ( ! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) { return FALSE; } fclose($fp); return TRUE; } }
答:用getimagesize来判断上传图片的类型比$_FILES函数的type更可靠
同一个文件,使用不同的浏览器php返回的type类型是不一样的,由浏览器提供type类型的话,
就有可能被黑客利用向服务器提交一个伪装撑图片后缀的可执行文件。
可以通过getimagesize()函数来判断上传的文件类型,如果是头像文件 会返回这样的一个数组
Array ( [0] => 331 [1] => 234 [2] => 3 [3] => width="331" height="234" [bits] => 8 [mime] => image/png );
答:基本原则:不对外界展示服务器或程序设计细节(屏蔽错误),不相信任何用户提交的数据(过滤用户提交)
1)屏蔽错误,将display_errors 设置为off
2)过滤用户提交参数,这里需要注意的是不能仅仅通过浏览器端的验证,还需要经过服务器端的过滤
这里是需要注意最多的地方,因为所有用户提交的数据入口都在这里,这是过滤数据的第一步。 1 考虑是否过滤select,insert,update,delete,drop,create等直接操作数据的命令语句 2 使用addslashes 将所有特殊字符过滤 3 打开magic_quotes_gpc,开启该参数数后自动将sql语句转换,将 ' 转换成 \'
3)可以考虑设置统一入口,只允许用户通过指定的入口访问,不能访问未经许可的文件等内容
4)可以考虑对安全性要求高的文件进行来源验证,比如要想执行b.php必须先执行a.php,可以在b.php中判断来自a.php的referer,避免用户直接执行b.php
答:由于 –enable-cli 和 –enable-cgi 同时默认有效,因此,不必再配置行中加上 –enable-cli 来使得 CLI 在 make install 过程中被拷贝到 {PREFIX}/bin/php
php -f “index.php” php -r “print_r(get_defined_constants());”
说明:
1)如果,你熟悉PHP源码,那么请从源码入手,回答些问题,会获得额外加分
2)如果,你不熟悉PHP源码,那么尽你所能,多写点东西,包括利用自己的编程直觉得到的信息,都可以。
3)对,则有分,错误不扣,不写无分。
答:PHP可以自动进行内存管理,清除不再需要的对象。PHP使用了引用计数(referencecounting)这种单纯的垃圾回收(garbagecollection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。
1. get是从服务器上获取数据,post是向服务器传送数据。 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。 3. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。 4. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
一:在php.ini中设置session.gc_maxlifetime = 1440 //默认时间 二:代码实现 $ lifeTime = 24 * 3600; //保存一天 session_set_cookie_params($ lifeTime); 在session_start();
他问的是已经支付成功后,但是回调失败了。
自己可以创建定时任务在每天的凌晨执行,去微信那边对账,然后更新数据库订单状态。
来自PHP技术交流群 群友分享
看看你的服务的访问日志,在防火墙中加过滤,或者在web服务器中加过滤吧。方法有以下几种。
是消耗服务器资源为主还是纯流量攻击?消耗资源的可以通过配置防火墙过滤规则防御中小规模的攻击。如果是纯流量攻击,考虑你用的是linode真心无解。即便你封了IP封了端口也没用,人家不管你接不接受他的请求,他都会塞满你的带宽。linode必然认为你是被流量攻击或者消耗过多资源然后给你挂起。
Groupadd mysql 添加一个用户组mysql Useradd -g mysql mysql 添加一个mysql用户指定分组为mysql Cd /lamp/mysql 进入mysql目录 ./configure –prefix=/usr/local/mysql/ –with-extra-charsets=all Make Make all
优化程序,优化数据库,如果程序和数据库已经最优化,使用以下解决方法:
1)索引的目的是什么?
2) 索引对数据库系统的负面影响是什么?
负面影响:创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改的时候索引也要动态维护,这样就降低了数据的维护速度。
3) 为数据表建立索引的原则有哪些?
4) 什么情况下不宜建立索引?
单引号不能解释变量,而双引号可以解释变量。
单引号不能转义字符,在双引号中可以转义字符。
方法一: <?php class Dtime{ function get_days($date1, $date2){ $time1 = strtotime($date1); $time2 = strtotime($date2); return ($time2-$time1)/86400; } } $Dtime = new Dtime; echo $Dtime->get_days(’2021-2-5′, ’2021-3-6′); ?> 方法二: <?php $temp = explode(‘-’, ’2021-2-5′); $time1 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]); $temp = explode(‘-’, ’2021-3-6′); $time2 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]); echo ($time2-$time1)/86400; 方法三:echo abs(strtotime(“2021-2-5″)-strtotime(“2021-3-1″))/60/60/24 计算时间差
<?php function BubbleSort(&$arr){ $cnt=count($arr); $flag=1; for($i=0;$i<$cnt;$i++){ if($flag==0){ return; } $flag=0; for($j=0;$j<$cnt-$i-1;$j++){ if($arr[$j]>$arr[$j+1]){ $tmp=$arr[$j]; $arr[$j]=$arr[$j+1]; $arr[$j+1]=$tmp; $flag=1; } } } } $test=array(1,3,6,8,2,7); BubbleSort($test); var_dump($test);
推荐学习:《PHP视频教程》
위 내용은 PHP 면접 질문 39개 요약 정리 (요약 공유)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!