> 백엔드 개발 > PHP 튜토리얼 > PHP 면접 질문 공유

PHP 면접 질문 공유

WBOY
풀어 주다: 2016-07-30 13:31:11
원래의
1774명이 탐색했습니다.

1. nginx는 어떤 네트워크 프로토콜을 사용하나요?
nginx는 아래에서 위로, 전송 계층은 tcp/ip를 사용하고
fastcgi는 스케줄링을 담당합니다. process
2. 출력 결과가 나오지 않는데, 그 이유는 무엇인지, 이 문제를 해결하는 과정을 간략하게 설명합니다(팁: 구문에는 문제가 없습니다). )
서버에서 short_open_tag가 활성화되지 않았을 수 있습니다 = Off로 설정하면 php.ini가 짧은 태그 제어 매개변수를 켭니다. short_open_tag = On
3. 다음 프로그램의 출력 결과를 간략하게 설명하고 그 이유를 간략하게 설명합니다. , 이러한 유형의 문제를 해결하는 방법은 무엇입니까?
$tmp = 0 == "a"?
echo $tmp;
int 및 string 유형 강제로 인한 결과 1, 0==="a"
0 == 0은 true여야 합니다
PHP는 약한 유형입니다. .
$tmp = 0 === "a"? 1: 2;
echo $tmp; 이는 2입니다.
4. $str = "1109063 milo 1 ";
한 줄의 코드를 사용하여 문자열의 1109063을 $uid에, milo를 $user에, 1을 $type에 할당합니다.
공백은 다음과 같습니다.
list($uid, $user, $ type) =explod(" ", $str);
t는 다음과 같습니다.
list($uid, $user, $type) =explore("t", $str); uid, $user, $type ) = sscanf($str, "%d %s %d")
$n = sscanf($auth, "%dt%s %s", $id, $first, $last)
5. 다음 유형의 부호 있는 범위와 부호 없는 범위를 각각 나열합니다. TINYINT SMALLINT MEDIUMINT INT
TINYINT-2^7 - 2^7-10 ~ 2^8-1
SMALLINT-2 ^15 - 2^15 -1 0 ~ 2^16-1
MEDIUMINT-2^23 - 2^23-1 0 ~ 2^24-1
INT-2^31 - 2^31-1 0 ~ 2^32- 1
6. 다음 배열을 한 줄로 묶어보세요. i am milo! day up!
$arr = array(
'I ', 'AM' , 'MILO!', 'DAY', 'UP!'
)
?>$str = strtolower(" ",$arr) );
7. 다음 함수를 호출하여 함수를 가져오고 count 값을 가져옵니다.
function get_list($cnd = array(), &$count = false)
{
// $cnd 처리 및 데이터 할당
$datas = '콜백'
$count && $count = rand(1, 10000)
return $datas;
}
?> ;
$count=1;
$data = get_list($cnd,&$count);
echo $count; 세션 메커니즘, 장점을 간략하게 설명합니다.
mysql, memcache 및 쿠키는 고유한 상태 식별 코드를 유지합니다.
9. 다음 HTTP 상태 코드의 가능한 이유 및 처리 방법
200, 301, 404 , 502, 503
200
요청이 성공했으며 요청에서 예상하는 응답 헤더 또는 데이터 본문이 이 응답과 함께 반환됩니다.
301
요청한 리소스가 새 위치로 영구적으로 이동되었으며, 향후 이 리소스에 대한 참조는 이 응답에서 반환된 여러 URI 중 하나를 사용해야 합니다. 가능하다면 링크 편집 기능이 있는 클라이언트는 요청된 주소를 서버에서 반환된 주소로 자동으로 수정해야 합니다. 별도로 지정하지 않는 한 이 응답도 캐시 가능합니다. 새로운 영구 URI는 응답의 위치 필드에 반환되어야 합니다. HEAD 요청이 아닌 이상 응답 엔터티에는 새 URI에 대한 하이퍼링크와 간단한 설명이 포함되어야 합니다. GET 또는 HEAD 요청이 아닌 경우 요청 조건이 그에 따라 변경될 수 있으므로 브라우저는 사용자가 확인하지 않는 한 자동 리디렉션을 금지합니다. 참고: HTTP/1.0 프로토콜을 사용하는 일부 브라우저의 경우 보내는 POST 요청이 301 응답을 받으면 후속 리디렉션 요청은 GET 메서드가 됩니다.
404
요청이 실패했습니다. 요청한 리소스를 서버에서 찾을 수 없습니다. 상태가 일시적인지 영구적인지 사용자에게 알려주는 정보는 없습니다. 서버가 상황을 알고 있는 경우 410 상태 코드를 사용하여 일부 내부 구성 메커니즘 문제로 인해 이전 리소스를 영구적으로 사용할 수 없으며 점프 주소가 없음을 알려야 합니다. 404 상태 코드는 서버가 요청이 거부된 이유를 밝히고 싶지 않거나 다른 적절한 응답을 사용할 수 없는 경우 널리 사용됩니다.
502
게이트웨이나 프록시 역할을 하는 서버가 요청을 수행하려고 할 때 업스트림 서버로부터 잘못된 응답을 받았습니다.
503
임시 서버 점검 또는 과부하로 인해 현재 서버에서 요청을 처리할 수 없습니다. 이 상태는 일시적이며 일정 시간이 지나면 복원됩니다. 지연이 예상되는 경우 응답에는 지연을 나타내는 Retry-After 헤더가 포함될 수 있습니다. 이 Retry-After 메시지가 제공되지 않으면 클라이언트는 500 응답을 처리하는 것과 동일한 방식으로 이를 처리해야 합니다. 참고: 503 상태 코드가 존재한다고 해서 서버가 과부하되었을 때 이를 사용해야 한다는 의미는 아닙니다. 일부 서버는 단순히 클라이언트의 연결을 거부하려고 합니다.
200 OK 모든 것이 정상이며 GET 및 POST 요청에 대한 응답 문서가 따릅니다.
301 영구적으로 이동됨 클라이언트가 요청한 문서가 위치 헤더에 제공됩니다. 브라우저는 자동으로 새 URL에 액세스해야 합니다.
지정된 위치의 리소스를 찾을 수 없습니다. 이것도 일반적인 반응이다.
502 Bad Gateway 서버가 게이트웨이나 프록시 역할을 할 때 요청을 완료하기 위해 다음 서버에 접속하지만 서버에서 잘못된 응답을 반환합니다.
503 Service Unavailable 서버 점검이나 과부하로 인해 서버가 응답하지 못했습니다. 예를 들어, 데이터베이스 연결 풀이 가득 차면 서블릿이 503을 반환할 수 있습니다. 서버는 503을 반환할 때 Retry-After 헤더를 제공할 수 있습니다.
10. 다음 데이터베이스가 있습니다. 원래 mysql 확장을 사용하여 사용자 테이블
host: 192.168.0.254
port: 3306
user: one
pass: 조각
데이터베이스: db_user
테이블: 사용자
$link = mysql_connect("192.168.0.254:3306","one","piece") 또는 die('연결할 수 없습니다: '. mysql_error()) ;
mysql_select_db('db_user',$link);
$query = mysql_query("사용자 제한 10에서 * 선택")
while($rs = mysql_fetch_array($query,MYSQL_ASSOC) ))
{}
11. autoload($class)를 사용하여 Lib 디렉터리의 클래스 자동 로드를 실현하고 하위 디렉터리와 호환 가능
$request->action = lcfirst(implode(array_map(
'ucfirst' ,
explode('-', strtolower($request->action))
)))
--------------- ----- --------------
함수 __autoload ($class)
{
$cls = strtolower(str_replace("_","/",$class))
if(file_exsits(LIB.$cls.'.php'))
{
include_once(LIB.$cls.'.php');
}
else
{
die("{$class} 클래스를 찾을 수 없음
}
}
defined("LIB",'/data/wwwroot/www.xx.com/lib/')
$author = new Lib_Author()
---- ----- ------------------- -----
함수 __authload($class)
{
$cls =explore("_",$class)
if(@is_dir($cls[1]))
{
if(@is_file($cls[2]))
{
include_once("CON_PATH".$cls[1].'/'.$cls[2].".php ");
}
else
{
dir('error');
}
}
else if(@is_file($cls[1].". php"))
{
include_once("CON_PATH".$cls[1].".php");
}
else
{
dir('error') ;
}
}
------------------------- -
함수 __autoload($class)
{
$cls =explore("_",$class)
$file = get_file($cls)
if($file= ='error')
{
die('error');
}
include_once($file)
}
function get_file($dir)
{
if(is_array( $dir))
{
foreach($dir as $k=>$v)
{
$tmpdir .= $v.'/'
if(is_dir(' CON_PATH'.$tmpdir))
{
continue();
}
else if(is_file('CON_PATH'.$tmpdir.".php"))
{
return 'CON_PATH'.$tmpdir.".php"
}
else
{
return 'error'; return 'error';
}
return 'error';
}
정의됨("CON_PATH","/data/wwwroot/www.xx.com/app/cntroller/"); 🎜>$sb = new 컨트롤러_sb()
------------------------- ---
function __autoload_my_classes($ classname)
{
# ... 여기에 클래스를 포함하는 논리
}
spl_autoload_register('__autoload_my_classes')
---- --------- --------------- ----
12. 오류를 캡처하고 출력하려면 set_error_handle을 사용하세요. 레벨은 직접 결정됩니다.
set_error_handle(callback,level)
function callback(int $errno, string $errstr [, string $ errfile [, int $errline [, array $errcontext ]] ] ){
}
function dealErrorHandler($errno,$errstr,$errfile,$errline)
{
switch($errno) {
case E_USER_ERROR:
echo "error [$errno] $errfile 파일의 $errline에 $errstr 치명적인 오류가 있습니다";
break
case E_USER_WARNING:
echo "내 경고 $errno] $errstr":
break;
case E_USER_NOTICE:
echo "내 공지[$errno] $errstr";
break;
기본값:
echo "unkonwn 오류 type :[$errno] $errstr";
break;
}
}
set_erro_handler(dealErrorHandler);
trigger_error("notice", E_USER_NOTICE);
trigger_error("warning ", E_USER_WARNING);
trigger_error("error" , E_USER_ERROR);
13. PHP 프로그램에서 알림 경고를 보호하는 두 가지 방법을 간략하게 설명합니다.
변수를 초기화하고, 파일 시작 부분에 오류 수준을 설정하거나 php.ini를 수정하여 error_reporting 설정
set_error_handler 및 @suppress 오류
1. 추가: error_reporting (E_ALL & ~E_NOTICE)
2. 또는 php.ini: error_reporting = E_ALL
을 다음으로 수정하세요: error_reporting = E_ALL & ~ E_NOTICE
3. error_reporting(0); 또는 php.inidisplay_errors=Off
14.instanceof의 역할,
Single Case 모드에서 자주 사용되지만 다른 모드도 사용됩니다
15. 바이너리로 표현하고 계산 과정을 간략하게 설명합니다
10-2
1023%2=1
511%2 =1 ​​​​
255%2 =1 ​​​​
127%2 =1
63%2 =1 ​​​​
31%2 =1 ​​​​
15%2 =1 ​​​​
7%2 =1 ​​​​
3%2 =1 ​​
1%2 =1 ​​
0 =0
------------------ ---------- --
1023
2^9=511
k=9
10 9 8 7 6 5 4 3 2 1
1 1 1 1 1 1 1 1 1 1
----------------------
1023 1
1023 -1/2=511 1
511-1/2=255 1
255-1/2=127 1
127-1/2=63 1
63-1/2=31 1
31-1/2= 15 1
15-1/2=7 1
7-1/2=3 1
3-1/2=1 1
-- ---------- --------
2-10
그냥 이진수를 사용하세요. 각 자리의 숫자는 가장 오른쪽 숫자부터 시작하고, 오른쪽의 첫 번째 숫자는 2의 0제곱을 곱하고, 두 번째 숫자는 2의 1제곱을 곱하고, 세 번째 숫자에 2의 2승을 곱하는 식입니다. 비유하자면 n번째 숫자에 2의 (n-1) 거듭제곱을 곱한 다음 결과를 더할 수 있습니다.
예를 들어. : 110011=1*2^0 1*2^1 0*2^2 0*2^3 1*2^4 1*2^5=51
이것도 공식으로 볼 수 있는데, *2^(n-1) An은 이진수의 가장 오른쪽부터 n번째 숫자를 나타냅니다.
An*2^(n-1) 공식을 사용하여 첫 번째, 두 번째, 세 번째, n번째 항을 계산하고 더합니다.
16. 다음 PHP 프로그램의 출력은 무엇입니까?
$str = "aatbbtcc"; c) =explore('t', $str);
echo $a,$b,$c
?>
aabbcc;//'t'는 t로 문자열을 자르지 않습니다. 따라서 폭발 후 배열이 됩니다(0=>"aatbbtcc"). . . , 't'는 "t"로 바꾸면 잘립니다.
17. 각각 어떤 오류 수준이 포함되고 반환이 필요합니까?
include는 시스템 경고를 표시하고 실행을 계속합니다. require는 시스템 경고를 표시하지만 오류를 발생시킵니다. 치명적인 오류가 발생하여 스크립트를 종료합니다.
18. 매개변수 개수가 불확실한(5 또는 50개) 기존 함수가 있는 경우 이 함수를 정의하는 방법
방법 1: PHP 내장 함수를 사용하지 않음
방법 2: 프롬프트 func_num_args() func_get_arg() unc_get_args()
function param()
{
$numargs = func_num_args()
echo "인수 개수: $numargs
n" ;
if ($numargs >= 2) {
echo "두 번째 인수: " . func_get_arg(1) . "
n";
}
$arg_list = func_get_args();
for ($i = 0; $i < $numargs; $i ) {
echo "$i 인수: " . ;br /> ;n";
}
}
param(1,2,3,4,5);
/**
2 * 예제 작성을 마치고 끝난 줄 알았는데, call_user_func_array()에 대해 묻는 사람을 만나서 매뉴얼을 읽어보았습니다.
3 * 위의 테스트 함수를 다음과 같이 단순화할 수 있다는 것을 알게 되었습니다. 다음 예는
4*/
5 함수 otest1( $a)
6 {
7 echo( '매개변수' )
8 }
9
10 function otest2 ( $a,$b)
11 {
12 echo( ' 두 개의 매개변수' );
13 }
14
15 function otest3 ( $a,$b,$c)
16 {
17 echo( '3' );
18 }
19
20 함수 otest ()
21 {
22 $args=func_get_args()
23 $num=func_num_args()
24 call_user_func_array( ' otest'.$num,$args );
25 }
26
27 otest(1,2)
19. 함수에서 전역 변수를 처리합니다. , 값을 변경하고 두 가지 방법을 사용하여 구현합니다(전역 및 참조&)
$var=1
function get_pra()
{
global $var = 'xxx ';
echo $var;
}
echo $var.'--'
get_pra()
echo $var; --------------------------
$test = 1;
$test1 = 2
function get_yinyong()
{
global $test1;
$GLOBALS["test"] = &$test1;
}
echo $test."n"
get_yinyong(); echo $test
------------------
20개를 무작위로 검색하는 경우가 많습니다. 표시할 사용자 테이블의 데이터입니다. SQL 함수 및 order by 문을 사용하는 방법을 간략하게 설명하세요.
테이블 사용자 필드 uid, 사용자 이름
사용자 테이블의 간격을 추정합니다. PHP를 사용하여 이 간격에서 임의의 숫자를 얻습니다. SQL 문이 이 ID보다 크거나 작으면 수십 개의 조각으로 제한합니다(데이터가 충분히 분산되지 않으면 10개 보장). 검색된 데이터의 셔플 기능은 중단됩니다. 배열, array_rand는 10
21을 가져옵니다. 다음 SQL 문의 uid가 특정 값을 얻을 수 있다고 가정합니다. 다음 명령문을 쿼리한 후 uid의 순서는 무엇입니까? 입력에서 uid 순서에 따라 정렬하는 방법
uid in(10, 1, 3, 8, 11, 4, 7)에서 사용자로부터 uid를 선택합니다.
인상적인 결과는 1,3,4입니다. 7,8,10,11의 오름차순에는 특별한 상황이 있습니다. 순서를 재활용해야 하는 경우 중간에 있는 일부 ID가 오름차순이 아닐 수 있기 때문입니다. uid in, id를 기반으로 쿼리 결과 배열의 값을 가져와 새 배열에 넣습니다.
22. PHP 사용 문자열의 문자를 **
preg_replace('/[a-zA- Z]*/','**',$str);
지정된 문자를 사용하면 str_replace(' ooxx','**',$str)
23. 아래 2.php에서는 왜 실행순서에 문제가 있나요? 1.php->2.php
cookie, cookie time time() 3600
24.PHP에서 자주 사용하는 json 인코딩 함수를 간략하게 설명해주세요. , json 디코딩 시 배열을 반환하는 방법
25. Mysql sql 문에 '/' 같은 단어가 있는 경우 sql 문의 각 부분은 반드시 특정 값으로 처리할 작업
mysql_real_escape_string
26.php
header('');
27.다음과 같은 여러 스크립트가 있는데, 2.php 결과
1.php
를 알려주세요. setcookie('test', 'cookie_test', 3600);
?>
2.php
$cookie = isset($_COOKIE 'test'])? $_COOKIE['test']: 'cookie';
echo $cookie;>
여기 있습니다
요약
a. 함수나 메서드에서 include 또는 include_once가 호출되지 않으면 출력 결과는 동일합니다.
b. 함수나 메소드에서 include 또는 include_once를 호출한 경우 두 번째 이후 호출에 대한 결과를 얻으려면 include_once 대신 include를 사용해야 합니다.
28. call_user_func의 함수를 간략하게 설명하세요.
함수나 클래스의 함수를 호출하고 첫 번째 매개변수의 값을 반환합니다. 비슷한 함수 call_user_func_array
29. Access에서는 nginx가 server_name www.120.net xxx.120.net
http://www.120.net/index.php 및 http://xxx에 액세스한다고 가정합니다. 120.net/index.php
$_SERVER["SERVER_NAME"] 및 $_SERVER["REQUEST_URI"]는 각각 무엇입니까?
www.120.net xxx.120.net
/index.php / index.php
30. Linux에서 파일의 속성은 drwxr-xr-x입니다. 숫자는 해당 권한을 나타냅니다.
디렉터리 권한은 755입니다. 소유자는 그룹에 대한 읽기, 쓰기 및 수정 권한을 가지고 있습니다. 읽기 및 수정 권한이 있는 g에 속합니다. o 그룹 외부의 사람들이 읽기 및 수정 권한을 가집니다.
31. 1Mbps 광대역의 이론적 다운로드 속도는 KBps로 계산됩니다.
1*1024/ 8
1M=1024KB
1KB=1024B
1B=8bit
2부
1. 싱글톤 팩토리 디자인 패턴 추상 클래스의 간단한 구현 예{ // 매개변수화된 팩토리 메소드 공용 정적 함수 Factory($type) { if (include_once 'Drivers /' . $type . '.php') {
$classname = 'Driver_' . $type
return new $classname;
새 예외 발생('드라이버를 찾을 수 없음');
}
}}// MySQL 드라이버 로드$mysql = 예::factory('MySQL')// SQLite 로드 드라이버
$sqlite = 예::factory ('SQLite');
definded('DRIVER','/data/wwwroot/www.want.com/core/driver/'); { 비공개 함수 __construct() { } 공개 정적 함수 팩토리($type) { if(include_once(DRIVER.$type.'.php')) { return exampleSon::singleton($type) } else { throw new Exception( "드라이버를 찾을 수 없습니다!"); } } }classExampleSonimplementsExample{ // 클래스의 인스턴스를 유지합니다. private static $instance; // 정적 프라이빗 클래스 인스턴스 // 프라이빗 생성자는 객체의 직접 생성을 방지합니다. () { echo '나는 생성되었습니다'; } // 싱글톤 메서드 public static function sington() { if (!isset(self::$instance)) { //정적 프라이빗 클래스 인스턴스가 설정되지 않은 경우 생성합니다 $ c = __CLASS__; //클래스 이름 가져오기 self: :$instance = new $c } return self::$instance; } // 예제 메소드 public functionbark() { echo 'Woof!' } // 인스턴스 복제 공용 함수 __clone() //허용되지 않음 Clone { Trigger_error('복제는 허용되지 않습니다.', E_USER_ERROR)
}} 키워드:
1 전용 정적 멤버 변수
2 __CLASS__ 현재 가져오기 클래스 이름
3 공용 정적 메서드 가져오기 Singleton
4 __clone() 메서드 재정의
----열 단어: 개인 정적 수량, 공용 정적 메서드---------
2. 일반적으로 사용되는 마술 방법의 예를 들고 그 기능을 설명하십시오. 개체를 인쇄할 때 사용자 정의 콘텐츠를 표시하는 방법은 무엇입니까?
마술 기능
1. __construct()
는 객체를 인스턴스화할 때 호출됩니다.
__construct와 해당 클래스 이름의 함수가 동시에 존재하는 경우 __construct가 호출되고 다른 하나는 호출되지 않습니다.
2. __destruct()
객체가 삭제되거나 객체 작업이 종료될 때 호출됩니다.
3. __call()
객체가 특정 메소드를 호출합니다.
메서드가 있으면 직접 호출됩니다.
존재하지 않으면 __call 함수가 호출됩니다.
4. __get()
객체의 속성을 읽을 때
속성이 존재하면 속성 값을 직접 반환합니다.
존재하지 않으면 __get 함수가 호출됩니다.
5. __set()
객체의 속성을 설정할 때
속성이 있으면 값을 직접 할당하고
없으면 __set 함수를 호출합니다.
6. __toString()
객체를 인쇄할 때 호출됩니다. 예를 들어 echo $obj; 또는 print $obj; __clone()
객체를 복제할 때 호출됩니다. 예: $t=new Test();$t1=clone $t;8. __sleep()
은 직렬화 전에 호출됩니다. 객체가 상대적으로 크고 직렬화하기 전에 몇 가지 항목을 삭제하려는 경우 이 기능을 고려할 수 있습니다.
9. __wakeup()
은 직렬화 해제 시 호출되며 일부 객체 초기화 작업을 수행합니다.
10. __isset()
객체의 속성이 존재하는지 확인할 때 호출됩니다. 예: isset($c->name).
11. __unset()
객체의 속성을 설정 해제할 때 호출됩니다. 예: unset($c->name).
12. __set_state()
var_export가 호출될 때 호출됩니다. __set_state의 반환 값을 var_export의 반환 값으로 사용합니다.
13. __autoload()
객체를 인스턴스화할 때 해당 클래스가 존재하지 않으면 이 메서드가 호출됩니다.
마법 상수
1. __LINE__
파일의 현재 줄 번호를 반환합니다.
2. __FILE__
파일의 전체 경로와 파일 이름을 반환합니다. 포함 파일에 사용되는 경우 포함 파일 이름을 반환합니다. PHP 4.0.2부터 __FILE__에는 항상 절대 경로가 포함되어 있지만 이전 버전에서는 때때로 상대 경로가 포함되어 있었습니다.
3. __FUNCTION__
함수 이름을 반환합니다(PHP 4.3.0에 새로 추가됨). PHP 5부터 이 상수는 정의된 대로 함수 이름을 반환합니다(대소문자 구분). PHP 4에서 이 값은 항상 소문자입니다.
4. __CLASS__
클래스 이름을 반환합니다(PHP 4.3.0의 새로운 기능). PHP 5부터 이 상수는 정의되었을 때 클래스의 이름을 반환합니다(대소문자 구분). PHP 4에서 이 값은 항상 소문자입니다.
5. __METHOD__
클래스의 메소드 이름을 반환합니다(PHP 5.0.0에 새로 추가됨). 정의된 대로 메서드의 이름을 반환합니다(대소문자 구분).
3. 클래스 정적 메소드와 인스턴스화 클래스 메소드의 비교 및 ​​장단점 ​​
4. 포럼이 있습니다
스레드 테이블은 주제, 제목 및 기타 정보를 기록합니다
게시물 테이블은 주제 내용, 답변 내용을 기록합니다. 및 기타 정보
스레드 테이블의 기본 키는 tid
posts 테이블의 기본 키는 pid, 주제 태그는 tid
tid를 통해 스레드와 게시물을 일대다 연결
이제 게시물의 데이터량이 1억개에 이르렀고, 스레드 테이블은 200만개, 하나의 주제에 대한 답변이 5개 정도 있습니다.
하위 테이블을 디자인하고, 게시물 테이블과 스레드 테이블을 mysql 테이블로 나누어주세요
5. 이제 mysql 메인 라이브러리/클러스터 라이브러리가 있습니다. PHP mysql 쿼리 시 문의하세요. PHP 프로그램에서 마스터-슬레이브 분리를 달성하는 방법은 무엇입니까? 마스터-슬레이브 배열 파일을 구성하면 어떤 이점이 있나요? , 여러 모델 기능을 직접 전송하고, 쿼리 및 인스턴스화를 위해 슬레이브 구성을 로드하고, 데이터 파기 작업 중에 인스턴스화를 위해 마스터를 로드합니다. 단점: 데이터 동기화가 약간 지연됩니다
6. UCenter의 Single Sign-On 메커니즘을 간략하게 설명합니다
소위 Single Sign-On은 로그를 달성하기 위해 사용자 센터를 공유하는 여러 사이트에 지나지 않습니다. 로그인과 로그아웃을 동시에 할 수 있습니다.
사실 결국 로그인하는 건 사용자인데 ajax를 사용하고(javascript는 src를 사용해 비동기식 크로스 도메인 호출을 한다) 사용자는 눈치 채지 못할 것이다.
그리고 p3p 헤더, 다른 도메인 이름, Single Sign-On(ucenter에서 사용하는 쿠키)을 사용하여 구현됩니다.
단점은 Ajax 클라이언트 요청을 사용한다는 점입니다. 애플리케이션이 10개 이상일 경우 로그인 속도가 느려집니다. 천천히.
7. Linux 관련 패키지가 있습니다. http://www.120.net/test-1.0.0.tar.gz
a. /usr/local/src
b. 소스 코드는 /usr/local/test 디렉토리
에 컴파일되어 설치됩니다. c. /usr/local/mysql 디렉토리에 있는 mysql 패키지에 의존합니다
다운로드, 컴파일 및 설치 프로세스
wget - c http://www .120.net/test-1.0.0.tar.gz/usr/local/srctar zxvf /usr/local/src/test-1.0.0.tar.gzcd /usr/local/src/test-1.0.0./configure --prefix=/usr/local/test --exec--prefix=/usr/local/mysqlmake testmake install
8. 데이터를 가져오는 함수 작성(캐시가 곧 만료되고 타임아웃이 잠김) )
a. 데이터 시간이 초과된 후 mysql로 ​​이동하여 가져오고 가져온 후 memcache를 업데이트합니다
b. 데이터를 가져오기 위해 mysql로 ​​이동하고 잠근 후 한 프로세스는 mysql로 ​​이동하여 데이터를 가져오고 다른 프로세스는 memcache에 데이터를 반환하게 합니다.
공용 함수 get_cache($key) { if($this->memcahe) { $var = $this->memcahe->get($this->pre.$key) $valid = $this-> ;memcahe->get($this->pre.$key.'_valid'); if($var && !$valid) { $lock = $this->memcahe->get($this-> ;pre.$key.'_lock'); if(!$lock) { $this->memcahe->set($this->pre.$key.'_lock', true, 0, 60); return false; } } return $var; } return false }
공용 함수 set_cache($key, $var = null, $expire = 0) { if($this->memcahe) { $expire = (int )$expire = ($expire ? $expire : $this->memcahe->set($this->pre.$key, $var, 0, $expire) 300); $this->memcahe->set($this->pre.$key.'_lock', false, 0, $expire); $this->memcahe->set($this- >pre.$key.'_valid', true, 0, $expire); return true; return false }
9. 큐와 스택의 원리를 간략하게 설명하면
배열 작동을 위해 큐는 선입선출이고, 큐에서 빼기는 열의 선두에만 있을 수 있으며, 큐는 열의 끝에만 들어갈 수 있고, 스택은 후입선출이며, 푸시와 팝은 다음과 같습니다. from the top of the stack
스택의 작동 원리는 무엇인가요?
스택은 후입선출 방식의 추상 데이터 구조입니다. 새 항목을 스택에 푸시하면 이미 스택에 있는 모든 항목이 스택 안으로 더 깊이 푸시됩니다. 마찬가지로 스택에서 항목을 제거하면 스택의 다른 항목이 스택의 맨 위로 이동됩니다. 스택의 맨 위에 있는 항목만 스택에서 제거될 수 있으며 항목은 스택에 푸시된 순서와 동일한 순서로 스택을 떠납니다. 자판기의 물건을 싣고 픽업하는 과정을 다시 생각해 보면 이해가 될 것입니다.
10. arrayaccess는 다음과 같이 정의됩니다. 이를 사용하여 배열을 구현합니다.
ArrayAccess {
/* Methods */
abstract public boolean offsetExists ( string $offset )
abstract public mix offsetGet ( string $offset )
abstract public void offsetSet ( string $offset , string $value )
abstract public void offsetUnset ( string $offset )
}
class Single Implements ArrayAccess{ private $name; $_Instance = null ; 전용 함수 __construct() { } 정적 함수 load() { if(null == self::$_Instance) { self::$_Instance = new Single() } return self::$_Instance; 공용 함수 setName( $name) { $this->name = $name; } 공용 함수 getName() { return $this->name } /*** 네 가지 메소드 구현 * 요소가 정의되었는지 여부를 식별하는 데 사용되는 offsetExists() * 요소의 값을 반환하는 데 사용되는 offsetGet() * 요소의 새 값을 설정하는 데 사용되는 offsetSet() * offsetUnset(), 사용 요소 및 해당 값 삭제 **/ 공용 함수 offsetSet($offset, $ value) { if (is_null($offset)) { $this->container[] = $value } else { $this->container[$offset] = $value } } 공용 함수 offsetGet($offset) { return isset( $this->container[$offset]) ? $this->container[$offset] : null } 공개 함수 offsetExists($offset) { return isset($this->container[$offset ]); } 공개 함수 offsetUnset($offset) { unset($this->container[$offset]) }}$s = Single::load();$s->setName("jack"); $s[" name"] = "mike";echo $s->getName(); //jackecho $s["name"] //mike
11.coreseek 설치 디렉터리는 /usr이라고 가정합니다. /local/coreseek
구성 파일은 /usr/local/coreseek/etc/test.conf
인덱스 이름은 post입니다
a. 인덱스를 생성합니다
b. 서비스를 시작합니다
. c. 인덱스 재구축(재구축 프로세스 중에 검색 보장 서비스는 계속 사용 가능)
indexer -c /usr/local/coreseek/etc/test.conf --allsearchd -c /usr/local/coreseek/etc /test.conf indexer -c /usr/local/coreseek/etc /test.conf --all --rotate12 게시물 테이블이 있고 테이블에서 스핑크스 증분 준실시간 인덱싱을 사용한다고 가정합니다.
"메인 인덱스 증분 인덱스" 방법을 사용하는 간단한 구현이 있는데, 데이터베이스에 카운팅 테이블을 추가하여 메인 인덱스가 재구축될 때마다 인덱싱된 테이블의 마지막 데이터 ID를 기록하여 이 ID 이후의 데이터만 기록되도록 합니다. 증분 인덱싱 시 인덱싱이 필요하며, 매번 메인 인덱스가 재구축됩니다. 이 테이블은 매번 업데이트됩니다.
13. PHP 코드:
$i = 97;$a = ($i ) ( $i) $i ;$b = (--$i) ($i--) $i 6; 🎜>echo "$i, $a, $b"; 출력 결과는 무엇입니까?
97, 295, 299
97
97 99 99
98 98 97 6
14. 다음 코드는 클라이언트 IP를 얻는 데 사용됩니다. if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $onlineip = getenv('HTTP_CLIENT_IP');} elseif( getenv ('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), '알 수 없음')) { $onlineip = getenv('HTTP_X_FORWARDED_FOR');} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR') , '알 수 없음')) { $onlineip = getenv('REMOTE_ADDR');} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], ' 알 수 없음 ')) { $onlineip = $_SERVER['REMOTE_ADDR'];} 그러나 HTTP_로 시작하는 요청 헤더는 클라이언트가 위조할 수 있는 정보입니다. 리버스 프록시 환경에서 PHP가 위조된 HTTP_CLIENT_IP를 수신하지 않도록 하는 방법입니다. , HTTP_X_FORWARDED_FOR 값?
15. 예를 들어 구글, 바이두 등 대형 웹사이트의 경우, 서로 다른 클라이언트(예: 휴대폰, PC)를 사용해 동일한 URL에 접속하면 표시되는 페이지가 달라지는 원리는 무엇인가요? 실용적인 해결책을 제시할 수 있다면 보너스 포인트입니다.
user_agent로 쉽게 판단할 수 있지만 매우 예비적입니다.
가능하다면 서버나 모바일 단말기 특성이나 wap 게이트웨이 허용 정보 등을 이용하세요.
16.magic_quotes_gpc 및 Magic_quotes_runtime 값은 어떻게 해야 합니까? ​​​프로덕션 환경에서 php.ini를 다음으로 설정하시겠습니까? onoff17.File_get_contents는 PHP가 원격 http 인터페이스를 호출할 때 사용할 수 있습니다. 그러나 원격 호스트에 연결할 수 없거나 응답이 너무 느리면 로컬 PHP 프로세스가 오랫동안 중단되어 안정성에 영향을 미칩니다. PHP 프로세스가 오랜 시간이 걸릴 때 시간 초과를 방지하는 방법은 무엇입니까?
file_get_contents에서 시간 초과를 설정할 수 있습니다. $ctx = stream_context_create(array( 'http' => array( 'timeout' => 1
)
)
);
file_get_contents("http://www.want.com/", 0, $ctx)
curl을 사용하여 원격 http 인터페이스를 얻을 수도 있습니다. . 또한 시간 초과를 설정해야 합니다. cur_setopt($s,CURLOPT_TIMEOUT,$timeout);
18. 위의 질문과 동일합니다. DNS 쿼리가 너무 느려지고 시간 초과가 발생하는 것을 방지하는 방법은 무엇입니까? 19. mysql 문자 세트 세트 이름 * 명령으로 설정되는 시스템 변수는 무엇입니까? (ACE) A. Character_set_client B. Character_set_system C. Character_set_results D. Character_set_server E. Character_set_connection F. Character_set_database20. 다음 조합 규칙 중 대소문자를 구분하지 않는 것은 무엇입니까? (A) A. utf8_general_ci B. utf8_general_cs C. utf8_general_bin21. XSS 공격을 방지하는 방법
strip_tags를 처음에 필터링하거나 고유한 필터 함수를 작성하여 특수 태그를 처리하고 이를 ASCII 코드로 바꿀 수 있습니다. CSRF 공격을 방지하려면
웹 애플리케이션 측의 CSRF 취약점을 방어하기 위해 일반적으로 tokenf 방법이 더 신뢰할 수 있습니다.

이상으로 PHP 면접 질문 공유와 관련된 내용을 소개하였습니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되었으면 좋겠습니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿