>  기사  >  백엔드 개발  >  PHP 인터뷰 요약

PHP 인터뷰 요약

WBOY
WBOY원래의
2016-07-29 09:14:511014검색

8월 15일 베이징에 도착한 지 오늘까지 한 달이 넘었습니다. 그동안 크고 작은 10개 이상의 기업과 면접을 준비했고 최근에야 자리를 잡았습니다. 인터뷰를 하면서 제가 많이 성장한 것 같았어요. 처음 이 낯선 도시에 도착했을 때 나는 지하철을 타는 방법, 버스를 타는 방법, 제대로 된 삶을 사는 방법을 몰랐습니다. . .

면접은 직장에 들어가기 위한 첫 번째 관문입니다. 우리 학교는 너무 평범해서 면접을 볼 때 고등학생들에 비해 여러 가지 불편함을 겪었습니다. 떨어지다. 인터뷰의 방향은 PHP 개발 엔지니어이며 주로 웹사이트 백엔드, APP 인터페이스 등을 담당합니다. 제가 인터뷰한 회사, 시험문제, 경험담은 모두 제 개인 홈페이지에서 확인하실 수 있습니다: http://dwz.cn/1KMpea. 이번 인터뷰에서 제가 정리한 상식은 다음과 같습니다. 모든 분들께 도움이 되기를 바랍니다. 잘못된 점이 있으면 지적해 주시기 바랍니다.

요약:

면접에서 자주 나오는 질문을 바탕으로 php부분을 정리해봤습니다. 질문은 비교적 기본적인

--------------- - ---PHP 부분---------

PHP의 여러 출력 함수 echo, print(), print_r(), sprintf(), var_dump()의 차이점

1: echo:은 구문이 아닌 함수는 반환 값이 없으며 괄호 없이 여러 변수 값을 출력할 수 있습니다. 배열 및 객체 는 출력할 수 없으며 단순 유형(예: int, string)만 인쇄할 수 있습니다.

2: print: 함수가 아닌 명령문입니다. 반환 값은 1이며 괄호는 필요하지 않습니다. 배열 및 객체 는 출력할 수 없으며 단순 유형(예: int, string)만 인쇄할 수 있습니다.

3: print_r: string, int, float, array, object 등 복합형을 출력할 수 있는 함수입니다.

출력 배열은 구조체로 표현되며 print_r($str,true)를 사용하면 print_r이 출력되는 것을 방지하고 print_r에서 처리한 값을 반환할 수 있습니다

4: printf : 텍스트를 포맷팅 후 출력으로 변환하는 함수입니다(C 언어 참조)

5: sprintf: printf와 유사한 함수이지만 인쇄하지는 않지만 포맷된 텍스트를 반환합니다. (이 함수는 형식화된 텍스트를 문자열이 출력 대신 변수에 기록되는 것으로 변환합니다.) 그렇지 않으면 printf와 동일합니다.

예: $str = "Hello"; $number = 123;

$txt = sprintf("%s world.Day number %u",$str,$number); //출력: Hello world. 일수 123

6: var_dump(): 함수, 내용, 유형 또는 문자열 출력 변수 내용, 유형, 길이. 디버깅에 자주 사용됩니다.

여러 스레드가 동시에 파일을 읽고 쓰는 문제를 해결하는 함수를 작성하세요.

<span> 1</span> <?<span>php
</span><span> 2</span><span>$fp</span> = <span>fopen</span>("/tmp/lock.txt","w+"<span>);
</span><span> 3</span><span>if</span>(<span>flock</span>(<span>$fp</span>, LOCK_EX)){<span>//</span><span> 进行排它型锁定</span><span> 4</span><span>fwrite</span>(<span>$fp</span>,"Write something here\n"<span>);
</span><span> 5</span><span>flock</span>(<span>$fp</span>, LOCK_UN);<span>//</span><span> 释放锁定</span><span> 6</span>     }<span>else</span><span>{
</span><span> 7</span><span>echo</span> "Couldn't lock the file !"<span>;
</span><span> 8</span><span>    }
</span><span> 9</span><span>fclose</span>(<span>$fp</span><span>);
</span><span>10</span> ?>

쿠키 ​​세션 사용 계획을 비활성화하고 세션을 만료하도록 설정합니다. , 해당 기능:

URL을 통해 값을 전달하고 Session id url에 첨부됨 (단점: 순전히 정적인 페이지 Session id는 다음 페이지로 전달되지 않기 때문에 전체 사이트에 순전히 정적인 페이지가 있을 수 없음)

통과 양식을 숨기려면 양식의 숨겨진 텍스트 상자에 Session ID를 넣고 양식과 함께 제출합니다. (단점: <와 같은 비양식 상황에는 적용되지 않습니다. ;a> 직접 점프하는 태그)

php.ini 파일을 직접 구성하고 php.ini 파일의 Session.use_trans_sid= 0을 1로 설정합니다. (win에서는 지원되지 않는 것 같습니다)

Session ID를 파일, 데이터베이스 등에 저장하고

을 수동으로 호출합니다.

<span> 1</span> 第一种  <span>setcookie</span><span>() 直接用setcookie设置<strong>Session</strong> id的生命周期。
</span><span> 2</span><span> 3</span><span>$lifetime</span>=60; <span>//</span><span>保存1分钟 </span><span> 4</span><span><strong>Session</strong>_start</span><span>(); 
</span><span> 5</span><span>setcookie</span>(<span><strong>Session</strong>_name</span>(), <span><strong>Session</strong>_id</span>(), <span>time</span>()+<span>$lifetime</span>, "/"<span>);
</span><span> 6</span> 第二种  <span><strong>Session</strong>_set_cookie_params</span><span>()    
</span><span> 7</span><span>$lifetime</span>=60;<span>//</span><span>保存1分钟</span><span> 8</span><span><strong>Session</strong>_set_cookie_params</span>(<span>$lifetime</span><span>);
</span><span> 9</span><span><strong>Session</strong>_start</span><span>();
</span><span>10</span><span><strong>Session</strong>_regenerate_id</span>(<span>true</span><span>);
</span><span>11</span>     其中<strong>Session</strong>_regenerate_id();方法用于改变当前<strong>Session</strong>_id的值,并保留<strong>Session</strong>中数组的值。参数默认为 <span>false</span>,如果设置为true则改变<strong>Session</strong>_id的值,并清空当前<strong>Session</strong>数组。

json 형식 데이터의 특징은 무엇인가요?

JSON은 경량 데이터 교환 형식입니다. ECMAScript의 하위 집합을 기반으로 합니다. JSON은 완전히 언어 독립적인 텍스트 형식을 사용하지만 C 언어 계열(C, C, C#, Java, JavaScript, Perl, Python 등 포함)과 유사한 규칙도 사용합니다. 이러한 속성은 JSON을 이상적인 데이터 교환 언어로 만듭니다. 사람이 읽고 쓰기 쉽고, 기계가 구문 분석하고 생성하기 쉽습니다(네트워크 전송 속도).

JSON의 구조는 다음 두 가지를 기본으로 합니다

1. "이름/값" 쌍의 집합

다른 언어에서는 객체(객체), 레코드(레코드), 구조(구조체), 사전(딕셔너리), 해시 테이블(해시 테이블), 키 목록(키 목록) 등으로 이해됩니다. . 2. 순서가 지정된 값 목록 ​​
은 대부분의 언어에서 배열로 이해됩니다. ​​​​

파일 내용을 가져오는 PHP 방법, 해당 기능1: file_get_contents는 파일의 내용을 가져오고(get 및 post로 얻을 수 있음) 전체 파일을 문자열로 읽어옵니다

2: fopen을 사용하여 URL을 열고 get 메서드에서 콘텐츠를 가져옵니다(fgets() 함수의 도움으로)

3: fsockopen 함수 사용 URL 열기(get 및 post 메소드에서 얻을 수 있음)), 헤더 및 본문을 포함하여 get 모드에서 전체 데이터를 얻습니다.

4: 컬 라이브러리를 사용하여 가져오기 컬 라이브러리를 사용하기 전에 php.ini에서 컬 확장 기능이 켜져 있는지 확인해야 합니다

일반적인 PHP 배열 함수는?(array_merge, in_array의 역할)

1. 배열 연산의 기본 기능

array_values($arr) ; //배열의 값을 가져옵니다

array_keys($arr); 배열의 키 이름을 가져옵니다

array_flip($arr); //배열의 값과 키 이름이 서로 바뀐다. (중복된 것이 있으면 이전 것이 된다.) 나중 값으로 덮어쓰기)

array_search('PHP',$arr); //주어진 값을 검색하고 true를 추가하는 것은 엄격한 유형 검사입니다

array_reverse($arr); "apple", $arr); //배열에서 apple

검색 array_key_exists("apple", $arr); 주어진 키가 배열에 존재하는지 검색

array_count_values($arr) > 2. 배열 분할 및 채우기

array_slice($arr, 0, 3); //배열의 세그먼트를 꺼낼 수 있습니다. 이 함수는 키 이름을 무시합니다(배열 분할).

array_splice($arr, 0, 3,array("black","maroon")); //배열의 일부를 꺼낼 수 있습니다. 함수는 반환된 시퀀스가 ​​원래 배열에서 삭제된다는 것입니다.

array_chunk($arr, 3, TRUE) //배열은 여러 개로 분할될 수 있습니다. TRUE는 예약되어 있습니다. 원래 배열의 키 이름(여러 배열로 분할)

4. 배열 및 스택, 대기열

array_push($arr, "apple", "pear") // 하나 이상의 요소를 배열 스택의 끝에 푸시합니다(push ) , 스택에 푸시된 요소 수 반환

array_pop($arr) // 배열 스택의 마지막 요소 팝(팝)

array_shift($arr); //배열의 첫 번째 요소가 밖으로 이동되어 반환됩니다. (배열 길이는 1만큼 줄어들고 다른 요소는 한 위치 앞으로 이동하며 숫자 키 이름은 다음과 같습니다. 0부터 개수로 변경됨, 텍스트 키 이름은 변경되지 않음)

array_unshift($arr,"a",array(1,2)) //다음 위치에 하나 이상의 요소 삽입 배열의 시작

6. 배열 정렬

sort($arr) //작은 것부터 큰 것까지 무시 키 이름

rsort($ arr); //큰 것부터 작은 것까지, 키 이름을 무시하세요

asort($arr); 키 이름 유지 arsort($ arr); // 큰 것부터 작은 것까지 키 이름 유지


ksort($arr); > krsort($arr); // 키 이름을 기준으로 역순으로 정렬

7. 배열 계산

array_sum($arr); //배열 내부의 모든 요소에 대한 합산 연산 수행(배열 요소의 합)

array_merge($arr1, $arr2); //2개 이상 병합(동일한 문자열 키 이름, 후자가 이전 키 이름을 덮어쓰고 동일한 숫자 키 이름이 끝에 추가됨) )

array_diff($arr1, $arr2); //차이 결과 배열 반환 array_diff_assoc ($arr1, $arr2, $arr3); //차이 집합 결과 배열을 반환하고 키 이름도 비교합니다

array_intersect ($arr1, $arr2); //교차점 결과 배열 반환 array_intersect_assoc($arr1, $arr2); //교차점 결과 배열 반환, 키 이름도 비교

8. 기타 배열 함수

array_unique($arr); //배열에서 중복된 값을 제거하면 원래 키 이름이 새 배열에 유지됩니다. >

shuffle($arr); // 배열 순서를 섞습니다

php 매직 메서드와 마법 상수

方法:__construct(),__destruct(),    方法重载:__call(),__callStatic()。

属性重载:__get(),__set(),__isset(),__unset(),这四个只对类中,私有,受保护的成员属性有效

__toString(),__autoload();

_set_state(); //自 PHP 5.1.0 起当调用 var_export() 导出类时,此静态 方法会被调用。 本方法的唯一参数是一个数组。

 

__clone();       //通常用于对副本进行重新初始化,

说明:this指副本对象引用,that指原对象引用 等方法在 PHP 中被称为”魔术方法”。PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。

 

常量:__LINK__     //文件中的当前行号

        __FILE__       //文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。

        __DIR__       //文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录,它等价于 dirname(__FILE__)。

 

        __FUNCTION__      //函数名称。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

        __CLASS__             //类的名称。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

        __METHOD__        //类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

        __NAMESPACE__   //当前命名空间的名称(大小写敏感)。这个常量是在编译时定义的(PHP 5.3.0 新增)

PHP 如何获取客户端的IP地址,

用$_SERVER获取的IP地址有什么问题?

$_SERVER['REMOTE_ADDR'] ;   通过全局数组来获得 

getenv('REMOTE_ADDR') ; 通过环境变量来获得

当客户机使用代理的时候获取不到真实的IP地址

写一个函数,可以遍历文件夹下的所有文件和文件夹。

<span> 1</span><span>function</span> get_dir_info(<span>$path</span><span>){
</span><span> 2</span><span>$handle</span> = <span>opendir</span>(<span>$path</span>);<span>//</span><span>打开目录返回句柄</span><span> 3</span><span>while</span>((<span>$content</span> = <span>readdir</span>(<span>$handle</span>))!== <span>false</span><span>){
</span><span> 4</span><span>$new_dir</span> = <span>$path</span> . DIRECTORY_SEPARATOR . <span>$content</span><span>;
</span><span> 5</span><span>if</span>(<span>$content</span> == '..' || <span>$content</span> == '.'<span>){
</span><span> 6</span><span>continue</span><span>;
</span><span> 7</span><span>                }
</span><span> 8</span><span>if</span>(<span>is_dir</span>(<span>$new_dir</span><span>)){
</span><span> 9</span><span>echo</span> "<br>目录:".<span>$new_dir</span> . '<br>'<span>;
</span><span>10</span>                       get_dir_info(<span>$new_dir</span><span>);
</span><span>11</span>                 }<span>else</span><span>{
</span><span>12</span><span>echo</span> "文件:".<span>$path</span>.':'.<span>$content</span> .'<br>'<span>;
</span><span>13</span><span>                }
</span><span>14</span><span>          }
</span><span>15</span><span>      }
</span><span>16</span>       get_dir_info(<span>$dir</span>);

有mail.log的一个文档,内容为若干邮件地址,用’\n’分隔换行。挑选sina.com的地址(包括从文件读取、过滤到列印出来)。

思路1:用正则表达式(比较慢,效率地,不推荐用)

思路2:cat mail.log | grep sina.com

PHP缓存技术有哪些? tp是局部还是完全缓存?

1. 全页面静态化缓存,也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程
2. 页面部分缓存,将一个页面中不经常变的部分进行静态缓存,而经常变化的块不缓存,最后组装在一起显示
3. 数据缓存,通过一个id进行请求的数据,将数据缓存到一个php文件中,id和文件是对应的,下次通过这个id进行请求时 直接读php文件
4. 查询缓存,和数据缓存差不多,根据查询语句进行缓存;
5. 常用的缓存技术有:redis和memcache
个人认为tp应该是全局缓存 因为:tp缓存实在本地生成一个php文件来存储数据库中读取出来的数据

strlen()与mb_strlen的作用与区别

在PHP中,strlen与mb_strlen是求字符串长度的函数

PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍(在 UTF-8编码下,一个汉字占3个字节)。

 

采用mb_strlen函数可以较好地解决这个问题。mb_strlen的用法和strlen类似,只不过它有第二个可选参数用于指定字符编码。例如得到UTF-8的字符串$str长度,可以用 mb_strlen($str,'UTF-8')。如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过 mb_internal_encoding()函数得到。


需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

写一个函数,尽可能高效的从一个标准url中取出扩展名

$arr = parse_url('http://www.sina.com.cn/abc/de/fg.php?id=1');

 

$result = pathinfo($arr['path']);var_dump($arr);

 

var_dump($result['extension']);

php.ini 中safe mod关闭 影响哪些函数和参数,至少写6个?

move_uploaded_file()        exec()

system()                              passthru()

popen()                              fopen()

mkdir()                               rmdir()

rename()                            unlink()

copy()                                 chgrp()

chown()                              chmod()

touch()                               symlink()

link()                                   parse_ini_file()

set_time_limit()                  max_execution_time mail()

一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停 的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。

<span> 1</span> <<span>?php
</span><span> 2</span><span>function</span> fuhuan(<span>$allnum</span>, <span>$ti</span><span>){
</span><span> 3</span><span>$arr</span> = <span>array</span><span>();
</span><span> 4</span><span>for</span>(<span>$i</span> = 0; <span>$i</span> < <span>$allnum</span>; <span>$i</span>++<span>){
</span><span> 5</span><span>$arr</span>[<span>$i</span>] = <span>$i</span><span>;
</span><span> 6</span><span>  }
</span><span> 7</span><span> 8</span><span>$nums</span> = 1<span>;
</span><span> 9</span><span>while</span>(<span>count</span>(<span>$arr</span>) > 1<span>){
</span><span>10</span><span>foreach</span> (<span>$arr</span><span>as</span><span>$key</span> => <span>$value</span><span>) {
</span><span>11</span><span>if</span>(<span>$nums</span> == <span>$ti</span><span>){
</span><span>12</span><span>unset</span>(<span>$arr</span>[<span>$key</span><span>]);
</span><span>13</span><span>$nums</span> = 1<span>;
</span><span>14</span>     }<span>else</span><span>{
</span><span>15</span><span>$nums</span>++<span>;
</span><span>16</span><span>    }
</span><span>17</span><span>   }
</span><span>18</span><span>  }
</span><span>19</span><span>$new_arr</span> = <span>array_values</span>(<span>$arr</span><span>);
</span><span>20</span><span>var_dump</span>(<span>$new_arr</span>[0] + 1<span>);
</span><span>21</span><span> }
</span><span>22</span>  fuhuan(10,10);

isset() 、empty()与is_null的区别

1、当变量未定义时,is_null()和“参数本身”是不允许作为参数判断的,会报Notice警告错误;

2、empty,isset首先都会检查变量是否存在,然后对变量值进行检测。而is_null 和 “参数本身”只是直接检查变量值,是否为null,因此如果变量未定义就会出现错误!

3、isset():仅当null和未定义,返回false;

4、empty():""、0、"0"、NULL、FALSE、array(),未定义,均返回false;

5、is_null():仅判断是否为null,未定义 报警告;

6、变量本身作为参数,与empty()一致,但接受未定义变量时,报警告;

求两个文件的相对路径

<span> 1</span> getpath('/a/b/c/d/e.php', '/a/d/12/34/c.php'<span>);
</span><span> 2</span><span> 3</span><span>function</span> getpath(<span>$a</span>, <span>$b</span><span>){
</span><span> 4</span><span>$aarr</span> = <span>explode</span>('/', <span>$a</span><span>);
</span><span> 5</span><span>$barr</span> = <span>explode</span>('/', <span>$b</span><span>);
</span><span> 6</span><span>$count</span> = <span>count</span>(<span>$barr</span>) - 2<span>;
</span><span> 7</span><span>$pathinfo</span> = ''<span>;
</span><span> 8</span><span>for</span>(<span>$i</span> = 1; <span>$i</span> <= <span>$count</span>; <span>$i</span>++<span>){
</span><span> 9</span><span>if</span>(<span>$aarr</span>[<span>$i</span>] == <span>$barr</span>[<span>$i</span><span>]){
</span><span>10</span><span>$pathinfo</span> .= '../'<span>;
</span><span>11</span>    }<span>else</span><span>{
</span><span>12</span><span>$pathinfo</span> .= <span>$barr</span>[<span>$i</span>] . '/'<span>;
</span><span>13</span><span>   }
</span><span>14</span><span>  }
</span><span>15</span><span>echo</span><span>$pathinfo</span><span>;
</span><span>16</span>  }

MVC的优缺点

1. MVC의 장점
(1) 런타임에 여러 모델을 동시에 생성하여 사용할 수 있습니다. 시간 조회수. 변경 전파 메커니즘은 모든 관련 뷰가 적시에 모델 데이터 변경 사항을 수신하도록 보장하여 모든 관련 뷰와 컨트롤러가 동기화되어 작동할 수 있도록 합니다.
(2) 뷰와 컨트롤러의 플러그 가능성으로 뷰와 컨트롤러 객체 교체 가능 필요에 따라 동적으로 열거나 닫을 수 있으며 객체도 런타임 중에 교체될 수 있습니다.
(3) 모델 이식성. 모델은 뷰와 독립적이므로 모델을 독립적으로 이식하여 새 플랫폼에서 작업할 수 있습니다. 필요한 것은 새 플랫폼의 뷰와 컨트롤러를 새로 수정하는 것뿐입니다.
(4) 잠재적인 프레임워크 구조. 단지 인터페이스 디자인을 위한 것이 아니라 이 모델을 기반으로 애플리케이션 프레임워크를 구축할 수 있습니다.
2. MVC의 단점
(1) 시스템 구조와 구현의 복잡성이 증가합니다. 단순한 인터페이스의 경우 MVC를 엄격하게 따르고 모델, 뷰 및 컨트롤러를 분리하면 구조가 복잡해지고 업데이트 작업이 너무 많이 발생하며 작업 효율성이 저하될 수 있습니다.
(2) 뷰와 컨트롤러 간의 연결이 너무 빡빡합니다. 뷰와 컨트롤러는 서로 분리되어 있지만 실제로는 밀접하게 연관되어 있는 구성 요소입니다. 뷰에는 컨트롤러가 존재하지 않고 적용 범위가 매우 제한적이며, 그 반대의 경우도 마찬가지이므로 독립적인 재사용이 어렵습니다.
(3) View의 모델 데이터 액세스가 비효율적입니다. 모델 작업 인터페이스에 따라 충분한 표시 데이터를 얻기 위해 뷰를 여러 번 호출해야 할 수도 있습니다. 변경되지 않은 데이터에 불필요하게 자주 액세스하면 운영 성능이 저하됩니다.
(4) 현재 일반적으로 고급 인터페이스 도구나 생성자는 MVC 모드를 지원하지 않습니다. MVC 요구 사항에 맞게 이러한 도구를 조정하고 별도의 구성 요소를 만드는 데 비용이 많이 들고 MVC를 사용하기가 어렵습니다.

세션과 쿠키(작동 메커니즘)의 연결 및 차이점, 세션 공유 문제 해결:

차이점과 연결:

Session_start()를 사용하여 Session을 호출하면 서버에서 을 생성합니다. Session동시에 파일은 기본값 PHPSESSID를 사용하여 Session ID 해시 값과 Session 이름을 생성하고 해당 변수를 PHPSESSID( 세션 이름) (기본값) 값은 128비트 해시 값입니다. 서버는 이 쿠키를 통해 클라이언트와 상호 작용합니다. Session 변수의 값은 PHP에 의해 내부적으로 직렬화되고 서버 시스템의 텍스트 파일에 저장됩니다. 기본적으로 쿨리입니다. 즉, 서버는 자동으로 http 헤더를 보냅니다: header('Set-Cookie: Session_name()=Session_id(); path=/ '); 즉, setcookie( Session_name(),Session_id()); 이 페이지에서 새 페이지로 이동하여 Session_start를 호출할 때 (), PHP는 해당 ID와 관련된 서버측 저장된 세션 데이터를 확인합니다. 찾을 수 없는 경우 새 데이터 세트를 만듭니다.

공유 방식:

1: 세션/' target='_blank'>데이터베이스를 사용하여 저장 세션, 데이터베이스를 사용하여 세션을 저장하세요. 서버가 다운되어도 괜찮습니다. 세션은 그대로 유지됩니다.

문제: 각 요청에 대해 데이터베이스를 읽고 쓰는 데 드는 비용이 적지 않습니다. 이 질문은 데이터베이스를 해싱하여 해결할 수 있습니다.

2: Memcached를 사용하여 Session을 저장하는 방법입니다. 이 방법은 데이터베이스와 유사하며 메모리 액세스 성능이 훨씬 좋습니다. 데이터 베이스.

문제: 프로그램을 맞춤화해야 하므로 Memcached에 저장된 데이터를 직렬화해야 하므로 비효율적이고 전원을 끄기가 쉽습니다. 또는 컴퓨터를 다시 시작하세요.

3: 通过加密的cookie,在A服务器上登录,在用户的浏览器上添加加密的cookie,当用户访问B服务器时,检查有无Session,如果没有,就检验 Cookie是否有效,Cookie有效的话就在B服务器上重建Session。简单,高效, 服务器的压力减小了,因为Session数据不存在服务器磁盘上。根本就不会出现Session读取不到的问题。

问题:网络请求占用很多。每次请求时,客户端都要通过cookie发送Session数据给服务器,Session中数据不能太多,浏览器对cookie 的大

小存在限制。不适合高访问量的情况,因为高访问量的情况下。

正则表达式

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 
匹配首尾空格的正则表达式:(^\s*)|(\s*$) 
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 
匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$ 
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 
匹配国内电话号码:(\d{3}-|\d{4}-)?(\d{8}|\d{7})? 
匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$

--------------------linux部分---------------------

core文件是什么,有什么用?

<span> core是unix系统的内核。当你的程序出现内存越界的时候,操作系统会中止你的进程,并将当前内存状态倒出到core文件中,以便进一步分析。程序员可以通过core文件来找出问题所在。它记录了程序挂掉时详细的状态描述。</span>
<span>什么是core dump Core的意思是内存, Dump的意思是扔出来, 堆出来。开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的,它可以做为调试程序的参考.
    core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump。如何使用core文件 gdb -c core文件路径 [应用程序的路径],进去后输入where回车, 就可以显示程序在哪一行当掉的, 在哪个函数中.</span>
<span>为什么没有core文件生成呢? core文件的生成跟你当前系统的环境设置有关系, 可以用下面的语句设置一下, 然后再运行程序便成生成core文件.</span>
<span>ulimit -c unlimited core文件生成的位置一般于运行程序的路径相同, 文件名一般为core.进程号</span>

不用core文件,程序出了问题产生信号是否知道?答:内核向进程发信号嘛。

共享内存除了文件映射还有什么方式?

共享内存对象映射。

二者有什么区别:

答:内存映射文件是由一个文件到一块内存的映射,使应用程序可以通过内存指针对磁盘上的文件进行访问,其过程就如同对加载了文件的内存的访问,因此内存文件映射非常适合于用来管理大文件。

请解释下列10个shell命令的用途
top、ps、mv、find、df、cat、chmod、chgrp、grep、wc

top:命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。 

ps:查看进程 

mv:移动或者更改文件 

find:在子目录中搜索匹配的文件 

df:linux中df命令参数功能:检查文件系统的磁盘空间占用情况。

cat:把一个或多个文件内容显示到标准输出 

chmod:改变文件属性 

chgrp:改变用户分组 

grep:在文件内进行搜索 

wc:命令的功能为统计指定文件中的字节数、字数、行数, 并将统计结果显示输出。

Linux文件属性有哪些?(共十位)

-rw-r--r--那个是权限符号,总共是- --- --- ---这几个位。

第一个短横处是文件类型识别符:-表示普通文件;c表示字符设备(character);b表示块设备(block);d表示目录 (directory);l表示链接文件(link);后面第一个三个连续的短横是用户权限位(User),第二个三个连续短横是组权限位 (Group),第三个三个连续短横是其他权限位(Other)。每个权限位有三个权限,r(读权限),w(写权限),x(执行权限)。如果每个权限位都 有权限存在,那么满权限的情况就是:-rwxrwxrwx;权限为空的情况就是- --- --- ---。

权限的设定可以用chmod命令,其格式位:chmod ugoa+/-/=rwx filename/directory。例如:

一个文件aaa具有完全空的权限- --- --- ---。

chmod u+rw aaa(给用户权限位设置读写权限,其权限表示为:- rw- --- ---)

chmod g r aaa (그룹에 대한 권한을 읽을 수 있도록 설정하고 해당 권한은 다음과 같이 표시됩니다: - --- r-- ---)

chmod ugo rw aaa(사용자, 그룹, 다른 사용자 또는 그룹이 읽고 쓸 수 있는 권한을 설정합니다. 권한은 다음과 같이 표현됩니다: - rw- rw- rw-)

aaa에게 전체 권한이 있는 경우 - rwx rwx rwx.

chmod u-x aaa(사용자 실행 권한 제거, 권한은 다음과 같이 표현됩니다: - rw- rwx rwx)

aaa - rwx r-x r-x에 사용자 정의 권한을 부여하려는 경우 명령은 다음과 같습니다.

chmod u=rwx, go=rx aaa

---------서버 부분------------ --- ------

아파치의 장점과 단점 비교 및 Nginx
1. Apache에 비해 nginx의 장점:
Apache. 고도로 모듈화된 설계, 모듈 작성이 비교적 간단함
동시성 방지, nginx는 요청을 비동기식 및 비차단 처리, 여러 연결(10,000 레벨)이 하나의 프로세스에 대응할 수 있으며 Apache 차단형이며 동기식 다중 프로세스 모델입니다. 높은 동시성에서 nginx는 낮은 리소스, 낮은 소비 및 높은 성능을 유지할 수 있습니다. 정적 파일 처리 잘함, Nginx 정적 처리 성능은 Apache

2보다 3배 이상 높음, Apache

nginx 대비 장점 :


Apache의 재작성은 nginx의 재작성보다 강력합니다. 기본적으로 생각할 수 있는 모든 모듈을 찾을 수 있으며 비교적 안정적이며 버그도 적습니다. .nginx에는 상대적으로 더 많은 버그가 있습니다

3: 이유: 이는 최신 epoll(Linux 2.6 커널) 및 kqueue를 사용하는 Nginx 때문입니다. (freebsd) 네트워크 I/O 모델이며 Apache는 전통적인 선택 모델을 사용합니다. 현재 Linux에서 높은 동시 액세스를 견딜 수 있는 Squid와

Memcached

는 모두 epoll 네트워크 I/O 모델을 사용합니다. 많은 수의 연결에 대한 읽기 및 쓰기를 처리하기 위해 Apache에서 사용하는 선택 네트워크 I/O 모델은 매우 비효율적입니다. cgi와 fastcgi의 차이점

cgi는 2000년 이전에는 일반적으로 웹서버를 많이 사용했습니다. 사용 정적 요청만 처리됩니다. 웹 서버는 요청 내용을 기반으로 외부 C 프로그램(또는 Perl 스크립트...)을 실행하기 위해 새로운 프로세스를 생성합니다. , 웹 서버는 사용자에게 콘텐츠를 전송하고 방금 분기된 프로세스도 종료됩니다. 사용자가 다음에 동적 스크립트를 변경하도록 요청하면 웹 서버는 새 프로세스를 다시 분기하고 주기가 계속됩니다.

나중에 더 발전된 방식이 등장했는데, 웹 서버에 내장 Perl 인터프리터나 PHP 인터프리터가 있을 수 있습니다. 즉, 이러한 인터프리터는 모듈로 만들어지고 웹 서버가 시작될 때 이러한 인터프리터를 시작합니다. 새로운 동적 요청이 들어오면 웹 서버는 이러한 Perl 또는 PHP 스크립트를 자체적으로 구문 분석하므로 프로세스를 다시 포크할 필요가 없고 효율성이 향상됩니다.

fastcgi의 작동 방식은 웹 서버가 요청을 받을 때 프로세스를 다시 포크하지 않는다는 것입니다(이 프로세스는 웹 서버가 시작될 때 시작되고 종료되지 않기 때문입니다). , 웹 서버가 이 프로세스에 직접 콘텐츠를 전달하고(프로세스 간 통신, 그러나 fastcgi는 다른 방법인 tcp 통신을 사용함), 이 프로세스는 요청을 받은 후 처리하고 결과를 웹 서버에 반환합니다. .마지막으로 종료하는 대신 다음 요청이 도착할 때까지 계속 기다립니다.

fastcgi와 cgi의 차이점은 다음과 같습니다.                                                                  처리의 프로세스 측면cgi 매개변수 읽기 처리를 위한 새로운 프로세스를 포크하고 데이터를 처리한 다음 수명 주기를 종료합니다fastcgi tcp를 사용하여 원격 시스템의 프로세스 또는 로컬 프로세스와 연결을 설정합니다. tcp 포트를 열려면
루프
에 들어가서 데이터 도착을 기다린 후 데이터를 처리합니다


예: 이제 서버에는 100,000개의 단어가 있습니다. 클라이언트는 매번 문자열을 보내고 이 문자열 앞에 붙은 단어 수를 묻습니다. 그런 다음 트리 트리를 구축하는 프로그램을 작성한 다음 사용자가 요청할 때마다 이 트리에서 직접 검색할 수 있습니다. 그러나 cgi를 사용하면 이 요청 후에 트리가 사라지게 됩니다. 다음에 프로세스가 시작되면 새 트리 트리를 만들어야 합니다. 이는 너무 비효율적입니다. fastcgi 방법을 사용하면 프로세스가 시작될 때 이 강의의 트리 트리가 설정되고 나중에 트리 트리에서 지정된 접두사를 직접 쿼리할 수 있습니다.

select, poll, epoll의 차이점

select

select는 1983년 처음 등장 4.2BSD에서는 select() 시스템 호출을 통해 여러 파일 설명자 배열을 모니터링합니다. select()가 반환되면 배열의 준비된 파일 설명자 플래그 비트는 다음과 같습니다. 프로세스가 후속 읽기 및 쓰기 작업을 위해 이러한 파일 설명자 를 얻을 수 있도록 커널에 의해 수정됩니다.

select는 현재 거의 모든 플랫폼에서 지원되며 우수한 크로스 플랫폼 지원도 장점 중 하나입니다. 사실 이제부터는 이것이 남은 장점 중 하나입니다. . 하나.

select의 한 가지 단점은 단일 프로세스가 모니터링할 수 있는 파일 설명자 수에 최대 제한이 있다는 것입니다. Linux에서는 일반적으로 1024입니다. 매크로 정의를 수정하여 수정할 수 있습니다. 커널을 다시 컴파일해도 이 제한은 늘어납니다.

또한, select()가 유지하는 데이터 구조에는 파일 설명자의 개수가 늘어날수록 많은 수의 파일 설명자가 저장됩니다. , , 복사 오버헤드도 선형적으로 증가합니다. 동시에 네트워크 응답 시간 지연으로 인해 많은 수의 TCP 연결이 비활성화되어 있지만 select()를 호출하면 모든 소켓에 대해 선형 스캔이 수행되므로 이 역시 일정량의 오버헤드를 낭비하게 됩니다.

poll

poll은 1986년 System V Release 3에서 탄생했습니다. 본질적으로 select와 크게 다르지 않지만, poll은 그렇지 않습니다. 파일 설명자 수 제한이 가장 큽니다.

poll과 select도 많은 파일 설명자를 포함하는 배열이 사용자 모드와 커널 사이에서 통째로 복사된다는 단점이 있습니다. 주소 공간. 파일 설명자가 준비되었는지 여부에 관계없이 파일 설명자 수가 증가함에 따라 오버헤드가 선형적으로 증가합니다.

또한, select() 및 poll() 후에 프로세스가 IO 작업을 수행하지 않는 경우 준비된 파일 설명자 에 대해 프로세스에 알립니다. 그런 다음 이 파일 설명자 는 다음에 select() 및 poll()이 호출될 때 다시 보고되므로 일반적으로 준비 메시지가 손실되지 않습니다. 이 방법을 레벨 트리거라고 합니다.

epoll

리눅스 2.6이 되어서야 커널이 직접 지원하는 구현 방식, 즉 epoll이 등장했는데, 이는 거의 이전의 모든 기능을 포함하여 Linux 2.6에서 가장 성능이 뛰어난 다중 채널 I/O 준비 알림 방법으로 인식됩니다.

epoll은 수평 트리거링과 에지 트리거링을 모두 지원할 수 있습니다(Edge Triggered는 파일 설명자가 방금 준비된 프로세스를 알려주며 한 번만 말합니다. 조치를 취하지 않으면 다시 알림을 받지 않습니다. 이 방법을 에지 트리거링이라고 합니다. 이론적으로는 에지 트리거링의 성능이 더 높지만 코드 구현이 상당히 복잡합니다.

epoll은 또한 준비된 파일 설명자에만 알림을 보내고 준비된 파일 설명자를 얻기 위해 epoll_wait()를 호출할 때 반환은 그렇지 않습니다. 실제 디스크립터이지만 준비된 디스크립터 수를 나타내는 값입니다. epoll에서 지정한 배열에서 해당 개수의 파일 디스크립터만 가져오면 됩니다. 여기서도 메모리 매핑(mmap) 기술이 사용됩니다. 시스템 호출 중에 이러한 파일 설명자를 복사하는 오버헤드를 제거합니다.

epoll이 이벤트 기반 준비 상태 알림 방법을 채택한다는 또 다른 중요한 개선 사항이 있습니다. select/poll에서는 프로세스가 특정 메소드를 호출한 후에만 커널이 모니터링되는 모든 파일 디스크립터를 스캔하며, epoll은 파일 디스크립터 가 있는 경우 epoll_ctl()을 통해 미리 파일 디스크립터를 등록합니다. 준비가 되면 커널은 콜백과 유사한 콜백 메커니즘을 사용하여 이 파일 설명자 를 빠르게 활성화하고 프로세스가 epoll_wait()를 호출할 때 알림을 받습니다.

Memcache와 Redis의 차이점

  1. Redis에서는 모든 데이터가 항상 메모리에 저장되지 않는 것이 Memcached와 비교했을 때 가장 큰 차이점입니다.
  2. Redis는 여러 면에서 데이터베이스의 특성을 갖고 있거나 데이터베이스 시스템인 반면, Memcached는 단순한 K/V 캐시에 불과합니다.
  3. 확장하려면 클러스터링 구현 방법(마스터-슬레이브, 해시)이 필요합니다.
  4. 100,000개가 넘는 데이터에서는 Memcached가 Redis보다 성능이 좋습니다.
  5. 메모리 사용 효율성을 이야기하고 간단한 키-값 저장을 사용한다면 Memcached가 메모리 활용도가 더 높고, Redis가 해시 구조를 사용한다면 키-값 저장소는 결합된 압축으로 인해 Memcached보다 메모리 사용량이 더 높습니다. 물론 이는 애플리케이션 시나리오와 데이터 특성에 따라 다릅니다.
  6. 데이터 지속성과 데이터 동기화에 대한 요구 사항이 있는 경우 Redis를 선택하는 것이 좋습니다. Memcached에는 이 두 가지 기능이 없기 때문입니다. 시스템을 업그레이드하거나 다시 시작한 후에 캐시된 데이터가 손실되지 않기를 바랄지라도 Redis를 선택하는 것이 현명합니다.
  7. 쓰기 성능에서는 Redis와 Memcache가 큰 차이가 없지만, 읽기 성능, 특히 배치 읽기 성능에서는 Memcache가 더 강합니다.

이상으로 내용의 측면을 포함한 PHP 인터뷰 요약을 소개하였습니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.