> 백엔드 개발 > PHP 튜토리얼 > [토혈] 이직에 도움이 되는 PHP 핵심 기술 면접 질문 28가지!

[토혈] 이직에 도움이 되는 PHP 핵심 기술 면접 질문 28가지!

풀어 주다: 2023-04-10 21:52:02
앞으로
20633명이 탐색했습니다.

이 기사는 PHP 핵심 기술에 대한 28가지 면접 질문을 정리하고 공유하여 PHP 핵심 기술에 대한 심층적인 이해를 제공합니다. 면접 중 함정을 빠르게 피할 수 있으며 취업에 필수적입니다. 모두에게 도움이 되길 바랍니다!

[토혈] 이직에 도움이 되는 PHP 핵심 기술 면접 질문 28가지!

관련 추천: "2022 PHP 면접 질문 요약(모음)"

1 oop이 무엇인가요?

답변: oop은 객체지향 프로그래밍이고 객체지향 프로그래밍은 컴퓨터입니다 프로그래밍 아키텍처, OOP의 기본 원칙은 컴퓨터 프로그램이 서브루틴으로 작동할 수 있는 단일 단위 또는 개체로 구성된다는 것입니다.

OOP에는 세 가지 주요 특징이 있습니다

1. 캡슐화: 정보 은닉이라고도 하며, 클래스의 사용과 구현을 분리하고 외부 접촉을 위해 일부 인터페이스와 메서드만 남기거나 개발 방법을 위해 일부만 노출하는 것을 의미합니다. 인원이 사용합니다. 따라서 개발자는 특정 구현 프로세스보다는 이 클래스가 사용되는 방식에만 주의하면 됩니다. 이를 통해 MVC 작업 분담과 협력을 달성하고 프로그램 간의 상호 의존성을 효과적으로 방지하며 코드 모듈 간의 느슨한 결합을 달성할 수 있습니다.

2. 상속: 하위 클래스는 상위 클래스의 속성과 메서드를 자동으로 상속하며 새 속성과 메서드를 추가하거나 일부 속성과 메서드를 다시 작성할 수 있습니다. 상속은 코드 재사용성을 높여줍니다. PHP는 단일 상속만 지원합니다. 즉, 하위 클래스는 하나의 상위 클래스만 가질 수 있습니다.

3. 다형성: 하위 클래스는 상위 클래스의 속성과 메서드를 상속하고 일부 메서드를 다시 작성합니다. 따라서 여러 하위 클래스가 동일한 메서드를 사용하더라도 이러한 하위 클래스에 의해 인스턴스화된 개체는 동일한 메서드를 호출한 후 완전히 다른 결과를 얻을 수 있습니다.

다형성은 소프트웨어의 유연성을 향상시킵니다.

1. 유지관리가 용이함

객체지향적 사고로 설계되어 가독성이 뛰어나며, 요구사항이 변경되더라도 유지관리가 로컬 모듈에서만 이루어지므로 매우 편리합니다. 유지 비용이 저렴합니다.

2. 고품질

설계 시 이전 프로젝트 분야에서 테스트를 거친 기존 클래스를 재사용하여 시스템이 비즈니스 요구 사항을 충족하고 높은 품질을 갖도록 할 수 있습니다.

3. 높은 효율성

소프트웨어 개발 중에는 실제 사물이 추상화되고 디자인 요구 사항에 따라 클래스가 생성됩니다. 이 방법을 사용하여 문제를 해결하는 것은 일상생활과 자연스러운 사고방식에 가깝고, 이는 소프트웨어 개발의 효율성과 품질을 필연적으로 향상시킬 것입니다.

4. 확장이 용이함

상속성, 캡슐화, 다형성의 특성으로 인해 응집력은 높고 결합도는 낮은 시스템 구조를 자연스럽게 설계하여 시스템을 보다 유연하게 만들고 확장하기 쉽게 하며 비용을 절감합니다.

2 두 배열을 병합하는 방법에는 여러 가지가 있습니다. 유사점과 차이점을 비교해 보세요.

방법:

1, array_merge()

2, '+'

3, array_merge_recursive

유사점 차이점:

array_merge는 단순히 배열을 병합합니다.

array_merge_recursive 두 배열을 병합합니다. 배열에 정확히 동일한 데이터가 있으면 재귀적으로 병합합니다.

array_combine 및 '+': 두 배열을 병합하면 전자의 값이 사용됩니다. 새로운 배열의 키로

3 PHP의 is_writeable() 함수에 버그가 있습니다. 디렉터리/파일이 쓰기 가능한지 여부를 정확하게 확인할 수 없습니다. 디렉터리/파일이 완전히 쓰기 가능한지 확인하는 함수를 작성하세요.

답변: 버그는 두 가지 측면에서 존재합니다.

1. Windows에서 파일에 읽기 전용 속성만 있는 경우 is_writeable() 함수가 false를 반환하면 파일에 반드시 쓰기가 가능한 것은 아닙니다.

디렉토리인 경우 해당 디렉토리에 새 파일을 생성하고 파일을 열어 확인합니다.

파일인 경우 파일을 열어(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;
    }
}
로그인 후 복사

4 PHP의 가비지 수집 메커니즘은 무엇인가요?

PHP는 자동으로 메모리를 관리하고 더 이상 필요하지 않은 개체를 지울 수 있습니다. PHP는 참조 카운팅이라는 간단한 가비지 수집 메커니즘을 사용합니다.

각 개체에는 참조 카운터가 포함되어 있으며 각 참조는 개체에 연결되어 있으며 카운터는 1씩 증가합니다. 참조가 생활 공간을 벗어나거나 NULL로 설정되면 카운터가 1씩 감소합니다. 객체의 참조 카운터가 0에 도달하면 PHP는 더 이상 객체를 사용할 필요가 없다는 것을 알고 객체가 차지하는 메모리 공간을 해제합니다.

5 가능한 한 효율적으로 표준 URL에서 파일 확장자를 검색하는 함수를 작성하세요.

예: http://www.startphp.cn/abc/de/fg.php?id=1 php 또는 .php

<?php
    // 方案一
    function getExt1($url){
        $arr = parse_url($url);
        //Array ( [scheme] => http [host] => www.startphp.cn [path] => /abc/de/fg.php [query] => id=1 )
        $file = basename($arr[&#39;path&#39;]);
        $ext = explode(&#39;.&#39;, $file);
        return $ext[count($ext)-1];
    }
    // 方案二
    function getExt2($url){
        $url = basename($url);
        $pos1 = strpos($url,&#39;.&#39;);
        $pos2 = strpos($url,&#39;?&#39;);
        if (strstr($url,&#39;?&#39;)) {
            return substr($url,$pos1+1,$pos2-$pos1-1);
        } else {
            return substr($url,$pos1);
        }
    }
    $path = "http://www.startphp.cn/abc/de/fg.php?id=1";
    echo getExt1($path);
    echo "<br />";
    echo getExt2($path);
?>
로그인 후 복사

6 정규식을 사용하여 마크업 언어(html 또는 xml) 조각을 추출합니다.

코드 세그먼트에 지정된 태그의 지정된 속성 값(속성의 불규칙성을 고려해야 함) 크기와 같은 값 쓰기를 구분하지 않으며 속성 이름 값과 등호 사이에 공백이 있습니다.) 여기서는 테스트 태그의 attr 속성 값을 추출해야 한다고 가정합니다. 태그가 포함된 문자열을 직접 구성해 주세요(Tencent)

.

<?php
    header("content-type:text/html;charset=utf-8");
    function getAttrValue($str,$tagName,$attrName){
        $pattern1="/<".$tagName."(s+w+s*=s*([&#39;"]?)([^&#39;"]*)())*s+".$attrName."s*=s*([&#39;"]?)([^&#39;"]*)()(s+w+s*=s*([&#39;"]?)([^&#39;"]*)(9))*s*>/i";
        $arr=array();
        $re=preg_match($pattern1,$str,$arr);
        if($re){
            echo"<br/>$arr[6]={$arr[6]}";
        }else{
            echo"<br/>没找到。";
        }
    }
    // 示例
    $str1="<test attr=&#39;ddd&#39;>";
    getAttrValue($str1,"test","attr");//找test标签中attr属性的值,结果为ddd
    $str2="<test2 attr=&#39;ddd&#39;attr2=&#39;ddd2&#39;t1="t1 value"t2=&#39;t2 value&#39;>";
    getAttrValue($str2,"test2","t1");//找test2标签中t1属性的值,结果为t1 value
?>
로그인 후 복사

7 php中WEB上传文件的原理是什么,如何限制上传文件的大小?

上传文件的表单使用post方式,并且要在form中添加enctype='multipart/form-data'。

一般可以加上隐藏域:<input type=hidden name=&#39;MAX_FILE_SIZE&#39; value=dddddd>,位置在file域前面。

value的值是上传文件的客户端字节限制。可以避免用户在花时间等待上传大文件之后才发现文件过大上传失败的麻烦。

使用file文件域来选择要上传的文件,当点击提交按钮之后,文件会被上传到服务器中的临时目录,在脚本运行结束时会被销毁,所以应该在脚本结束之前,将其移动到服务器上的某个目录下,可以通过函数move_uploaded_file()来移动临时文件,要获取临时文件的信息,使用$_FILES。

限制上传文件大小的因素有:

客户端的隐藏域MAX_FILE_SIZE的数值(可以被绕开)。

服务器端的upload_max_filesizepost_max_sizememory_limit。这几项不能够用脚本来设置。

自定义文件大小限制逻辑。即使服务器的限制是能自己决定,也会有需要个别考虑的情况。所以这个限制方式经常是必要的。

8 请说明 PHP 中传值与传引用的区别,什么时候传值什么时候传引用?

按值传递:函数范围内对值的任何改变在函数外部都会被忽略

按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改

优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。

9 MySQL数据库中的字段类型varchar和char的主要区别是什么?

Varchar是变长,节省存储空间,char是固定长度。查找效率要char型快,因为varchar是非定长,必须先查找长度,然后进行数据的提取,比char定长类型多了一个步骤,所以效率低一些。

10 静态化如何实现的?伪静态如何实现?

1、 静态化指的是页面静态化,也即生成实实在在的静态文件,也即不需要查询数据库就可以直接从文件中获取数据,指的是真静态。

实现方式主要有两种:一种是我们在添加信息入库的时候就生成的静态文件,也称为模板替换技术。一种是用户在访问我们的页面时先判断是否有对应的缓存文件存在,如果存在就读缓存,不存在就读数据库,同时生成缓存文件。

2、伪静态不是真正意义上的静态化,之所以使用伪静态,主要是为了SEO推广,搜索引擎对动态的文件获取难度大,不利于网站的推广。

实习原理是基于Apache或Nginx的rewrite

主要有两种方式:

一种是直接在配置虚拟机的位置配置伪静态,这个每次修改完成后需要重启web服务器。

另一种采用分布式的,可以在网站的根目录上创建.htaccess的文件,在里面配置相应的重写规则来实现伪静态,这种每次重写时不需要重启web服务器,且结构上比较清晰。

11 如何处理负载,高并发?

1、HTML静态化

效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。

2、图片服务器分离

把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如七牛等

3、数据库集群和库表散列及缓存

数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。

4、镜像:

尽量减少下载,可以把不同的请求分发到多个镜像端。

5、负载均衡:

Apache的最大并发连接为1500,只能增加服务器,可以从硬件上着手,如F5服务器。当然硬件的成本比较高,我们往往从软件方面着手。

12 PHP7的新特性?

标量类型声明:PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 callable (PHP 5.4,即可以是函数,包括匿名函数),现在也可以使用 string、int、float和 bool 了。

반환 값 유형 선언: 반환 유형 선언에 대한 지원이 추가되었습니다. 매개변수 유형 선언과 유사하게 반환 유형 선언은 함수의 반환 값 유형을 지정합니다. 사용 가능한 유형은 매개변수 선언에서 사용 가능한 유형과 동일합니다.

NULL 병합 연산자: 일상생활에서 삼항식과 isset()을 동시에 사용하는 상황이 많기 때문에, NULL 병합 연산자는 변수가 존재하고 그 값이 NULL이 아니면 자체 값을 반환하고, 그렇지 않으면 반환합니다. 그것은 두 번째 피연산자입니다.

사용 향상: 이제 동일한 네임스페이스에서 가져온 클래스, 함수 및 상수를 단일 use 문을 통해 한 번에 가져올 수 있습니다. 익명 클래스: 이제 새 클래스를 통해 익명 클래스 인스턴스화를 지원합니다.

13 일반적인 PHP 보안 공격 SQL 주입:

사용자는 SQL 문을 사용하여 일반적인 SQL 실행에 영향을 주는 양식 필드를 입력합니다.

Prevent: mysql_real_escape_string()을 사용하여 데이터를 필터링합니다. 각 데이터가 올바른 데이터 유형인지 수동으로 확인합니다. 준비된 문 및 바인드 변수를 사용합니다. 매개변수화된 SQL: 데이터베이스에 연결하고 데이터에 액세스하도록 설계할 때 필요합니다. 값이나 데이터를 채우고, 매개변수(Parameter)를 사용하여 값을 제공하고, @ 또는?를 사용합니다. 매개변수를 나타냅니다.

XSS 공격: 사용자가 클라이언트 측 스크립트(일반적으로 JavaScript)가 포함된 일부 데이터를 웹 사이트에 입력하는 크로스 사이트 스크립팅 공격입니다. 필터링하지 않고 다른 웹페이지로 데이터를 출력하면 이 스크립트가 실행됩니다.

예방: XSS 공격을 방지하려면 PHP의 htmlentities() 함수를 사용하여 필터링하고 브라우저에 출력합니다.

CSRF: 사이트 간 요청 위조, 페이지에서 사이트의 신뢰할 수 있는 사용자인 것처럼 보이지만 가짜인 요청을 하는 경우

예방: 일반적으로 사용자가 양식에서 왔는지, 그리고 해당 사용자가 모든 양식과 일치하는지 확인하세요. 보내주신 양식입니다. 기억해야 할 두 가지 사항: 각 세션의 ID 업데이트, 사용자에 대한 SSL 사용 등 사용자 세션에 적절한 보안 조치를 사용하십시오. 또 다른 일회용 토큰을 생성하여 양식에 포함하고 세션(세션 변수)에 저장한 후 제출 시 확인하세요. laravel의 _token

코드 주입: 코드 주입은 유효하지 않은 데이터를 처리하여 컴퓨터 취약점을 악용하여 발생합니다. 문제는 일반적으로 파일 포함을 통해 실수로 임의의 코드를 실행할 때 발생합니다. 잘못 작성된 코드로 인해 원격 파일이 포함되고 실행될 수 있습니다. 많은 PHP 함수와 마찬가지로 require에는 URL이나 파일 이름이 포함될 수 있습니다.

코드 삽입을 방지하고 php.ini에서 허용_url_fopen 및 허용_url_include를 비활성화합니다. 이렇게 하면 원격 파일 요구/포함/fopen이 비활성화됩니다.

14 객체 지향 기능이란 무엇입니까?

주로 캡슐화, 상속 및 다형성이 포함됩니다. 4가지 측면인 경우 추상화를 추가합니다.

캡슐화:

캡슐화는 소프트웨어 구성 요소가 우수한 모듈성을 갖도록 보장하는 기반입니다. 캡슐화의 목표는 소프트웨어 구성 요소의 높은 응집력과 낮은 결합을 달성하고 프로그램 상호 의존성으로 인한 변경의 영향을 방지하는 것입니다.

상속:

클래스를 정의하고 구현할 때 기존 클래스를 기반으로 할 수 있으며, 이 기존 클래스에서 정의한 콘텐츠를 자체 콘텐츠로 사용할 수도 있고, 여러 개의 새로운 콘텐츠를 추가할 수도 있습니다. 특별한 요구에 더 적합하도록 원래 메서드를 수정합니다. 이것이 상속입니다. 상속은 하위 클래스가 상위 클래스 데이터와 메서드를 자동으로 공유하는 메커니즘입니다. 이는 소프트웨어의 재사용성과 확장성을 향상시키는 클래스 간의 관계입니다.

다형성:

다형성은 프로그램에서 정의된 참조 변수가 가리키는 특정 유형과 참조 변수를 통해 발행된 메소드 호출이 프로그래밍 중에 결정되는 것이 아니라 프로그램 실행 중에 결정된다는 것을 의미합니다. 참조 변수가 가리키는 클래스 인스턴스 객체가 무엇인지, 참조 변수가 발행한 메서드 호출을 구현하는 클래스는 프로그램 실행 중에 결정되어야 합니다.

추상:

추상이란 어떤 사물의 유사점과 공통점을 찾아 클래스로 분류하는 것입니다. 이 수업은 이러한 사물의 유사점과 공통점만 고려하고 현재 주제와 그러한 측면은 무시합니다. 목표와 관련이 없는 부분은 현재 목표와 관련된 측면에 집중하세요. 예를 들어, 개미와 코끼리를 보고 그들이 얼마나 비슷한지 상상할 수 있다면 그것이 추상입니다.

15 ​​​​SQL 문을 최적화하는 방법은 무엇입니까? (몇개 선택)

(1) Where 절에서: Where 테이블 사이의 연결은 다른 Where 조건보다 먼저 작성되어야 하며, 최대 레코드 수를 필터링할 수 있는 조건은 Where 끝에 작성되어야 합니다. 절입니다. HAVING이 마지막입니다.

(2) IN을 EXISTS로 바꾸고 NOT IN을 NOT EXISTS로 바꿉니다.

(3) 인덱스 열에 계산을 사용하지 마세요

(4) 인덱스 열에 IS NULL 및 IS NOT NULL을 사용하지 마세요

(5) 쿼리를 최적화하려면 전체 테이블 스캔을 최대한 피해야 합니다. 먼저 고려해야 할 사항은 다음과 같습니다. where 및 order by와 관련된 열에 대한 인덱스를 만듭니다.

(6) where 절의 필드에 대해 null 값 판단을 피하십시오. 그렇지 않으면 엔진이 인덱스 사용을 포기하고 전체 테이블 스캔을 수행합니다.

(7) where 절의 필드에 표현식을 작성하지 마십시오. 이렇게 하면 엔진이 인덱스 사용을 포기하고 전체 테이블 스캔을 수행하게 됩니다

16 MySQL 데이터베이스는 출판 시스템의 저장소로 사용됩니다. 하루에 50,000개 이상의 항목이 증가하는데 3년의 운영 및 유지 관리가 필요할 것으로 예상됩니다.

(1) 데이터베이스 구조를 잘 설계하고, 부분적인 데이터 중복을 허용하고, 조인 쿼리를 피하여 효율성을 높이세요.

(2) 적절한 테이블 필드 데이터 유형과 스토리지 엔진을 선택하고 적절하게 인덱스를 추가합니다.

(3) mysql 마스터-슬레이브 복제 읽기-쓰기 분리를 수행합니다.

(4) 데이터 테이블을 테이블로 나누어 단일 테이블의 데이터 양을 줄이고 쿼리 속도를 향상시킵니다.

(5) redis, memcached 등과 같은 캐싱 메커니즘을 추가합니다.

(6) 자주 변경되지 않는 페이지에 대해 정적 페이지를 생성합니다(예: ob 캐싱).

(7) 효율적인 SQL을 작성합니다. 예를 들어 SELECT * FROM TABEL은 SELECT field_1, field_2, field_3 FROM TABLE로 변경됩니다.

17 트래픽이 많은 웹 사이트의 경우 페이지 방문 통계 문제를 해결하기 위해 어떤 방법을 사용합니까?

(1) 서버가 현재 트래픽을 지원할 수 있는지 확인합니다.

(2) 데이터베이스 액세스를 최적화합니다.

(3) 사진의 핫링크 등 링크(핫링크)에 대한 외부 접근을 금지합니다.

(4) 제어 파일 다운로드.

(5) 로드 밸런싱을 수행하고 다른 호스트를 사용하여 오프로드합니다.

(6) 검색 통계 소프트웨어를 사용하여 방문 횟수를 파악하고 타겟 최적화를 수행합니다.

18 mysql 엔진에서 MyISAM과 InnoDB의 차이점에 대해 어떻게 이해하고 계시나요?

InnoDB와 MyISAM은 MySQL을 사용할 때 많은 사람들이 가장 일반적으로 사용하는 두 가지 테이블 유형입니다. 두 테이블 유형 모두 특정 애플리케이션에 따라 고유한 장점과 단점이 있습니다. 기본적인 차이점은 MyISAM 유형은 트랜잭션 처리와 같은 고급 처리를 지원하지 않는 반면 InnoDB 유형은 지원한다는 것입니다. MyISAM 유형 테이블은 성능을 중시하며 InnoDB 유형에 비해 실행 시간은 빠르지만 트랜잭션 지원을 제공하지 않는 반면, InnoDB는 트랜잭션 지원 및 외래 키와 같은 고급 데이터베이스 기능을 제공합니다.

다음은 몇 가지 세부 사항과 구체적인 구현 차이점입니다.

MyISAM과 InnoDB의 차이점은 무엇입니까?

1. 저장 구조

MyISAM: 각 MyISAM은 디스크에 3개의 파일로 저장됩니다. 첫 번째 파일의 이름은 테이블 이름으로 시작하고 확장자는 파일 형식을 나타냅니다. .frm 파일은 테이블 정의를 저장합니다. 데이터 파일 확장자는 .MYD(MYData)입니다. 인덱스 파일의 확장자는 .MYI(MYIndex)입니다.

InnoDB: 모든 테이블은 동일한 데이터 파일(또는 여러 파일 또는 독립적인 테이블 공간 파일)에 저장됩니다. InnoDB 테이블의 크기는 일반적으로 2GB인 운영 체제 파일 크기에 의해서만 제한됩니다.

2. 저장 공간

MyISAM: 압축이 가능하며 저장 공간이 더 작습니다. 세 가지 다른 저장 형식을 지원합니다: 정적 테이블(기본값이지만 데이터 끝에 공백이 없어야 하므로 제거됩니다.), 동적 테이블 및 압축 테이블.

InnoDB: 더 많은 메모리와 스토리지가 필요하며 데이터 및 인덱스 캐싱을 위해 메인 메모리에 자체 전용 버퍼 풀을 설정합니다.

3. 이식성, 백업 및 복구

MyISAM: 데이터가 파일 형식으로 저장되므로 플랫폼 간 데이터 전송에 매우 편리합니다. 백업 및 복구 중에 테이블에 대한 작업을 개별적으로 수행할 수 있습니다.

InnoDB: 무료 솔루션에는 데이터 파일 복사, binlog 백업 또는 mysqldump 사용이 포함되는데, 이는 데이터 볼륨이 수십 기가바이트에 도달하면 상대적으로 고통스럽습니다.

4. 트랜잭션 지원

MyISAM: 각 쿼리는 원자적이고 실행 시간이 InnoDB 유형보다 빠르지만 트랜잭션 지원을 제공하지 않습니다.

InnoDB: 트랜잭션 지원, 외래 키 및 기타 고급 데이터베이스 기능을 제공합니다. 트랜잭션(커밋), 롤백(롤백) 및 충돌 복구 기능을 갖춘 트랜잭션 안전(ACID 호환) 테이블입니다.

5. AUTO_INCREMENT

MyISAM: 다른 필드와 공동 인덱스를 생성할 수 있습니다. 엔진의 자동 증가 열은 인덱스여야 합니다. 결합된 인덱스인 경우 자동 증가 열이 첫 번째 열일 필요는 없습니다. 이전 열에 따라 정렬한 후 증분할 수 있습니다.

InnoDB: InnoDB에는 이 필드만 있는 인덱스가 포함되어야 합니다. 엔진의 자동 증가 열은 인덱스여야 하며, 복합 인덱스인 경우에는 복합 인덱스의 첫 번째 열이기도 해야 합니다.

6. 테이블 잠금 차이점

MyISAM: 사용자가 myisam 테이블을 작동할 때, 잠긴 테이블이 삽입 동시성 상황을 충족하면 자동으로 테이블을 잠급니다. 테이블 끝에 새 데이터를 삽입할 수 있습니다.

InnoDB: 트랜잭션 및 행 수준 잠금을 지원하는 것은 innodb의 가장 큰 기능입니다. 행 잠금은 다중 사용자 동시 작업의 성능을 크게 향상시킵니다. 그러나 InnoDB의 행 잠금은 WHERE의 기본 키에서만 유효합니다. 기본 키가 아닌 WHERE는 전체 테이블을 잠급니다.

7. 전체 텍스트 인덱스

MyISAM: FULLTEXT 유형의 전체 텍스트 인덱스를 지원합니다.

InnoDB: FULLTEXT 유형의 전체 텍스트 인덱스를 지원하지 않지만 innodb는 스핑크스 플러그인을 사용하여 전체 텍스트 인덱스를 지원할 수 있습니다. 효과가 더 좋습니다.

8. 테이블 기본 키

MyISAM: 인덱스와 기본 키가 없는 테이블이 존재할 수 있도록 합니다. 인덱스는 행이 저장되는 주소입니다.

InnoDB: 기본 키 또는 비어 있지 않은 고유 인덱스가 설정되지 않은 경우 6바이트 기본 키(사용자에게 표시되지 않음)가 자동으로 생성됩니다. 데이터는 기본 인덱스의 일부이며 추가 인덱스는 값을 저장합니다. 기본 인덱스의

9. 테이블의 특정 행 수

MyISAM: 테이블의 총 행 수를 저장합니다. 테이블에서 개수(*)를 선택하면 값이 직접 제거됩니다.

InnoDB: 테이블의 총 행 수는 저장되지 않습니다. 테이블에서 select count(*)를 사용하면 전체 테이블을 탐색하므로 많은 비용이 소모됩니다. 그러나 wehre 조건을 추가한 후에는 myisam 및 innodb도 같은 방식으로 처리합니다.

10. CURD 연산

MyISAM: SELECT를 많이 수행한다면 MyISAM이 더 나은 선택입니다.

InnoDB: 데이터에서 INSERT 또는 UPDATE를 많이 수행하는 경우 성능상의 이유로 InnoDB 테이블을 사용해야 합니다. DELETE는 InnoDB보다 성능이 좋지만 DELETE FROM 테이블을 사용하면 InnoDB는 테이블을 다시 생성하지 않고 행 단위로 삭제합니다. InnoDB에서 많은 양의 데이터가 있는 테이블을 지우려면 가장 좋습니다. truncate table 명령을 사용합니다.

11. 외래 키

MyISAM: 지원되지 않음

InnoDB: 지원됨

위의 분석을 통해 기본적으로 MyISAM 엔진을 대체하기 위해 InnoDB를 사용하는 것을 고려할 수 있습니다. 그 이유는 InnoDB 자체에 트랜잭션 등 좋은 기능이 많이 있기 때문입니다. 지원, 저장 절차, 뷰, 행 수준 잠금 등 동시성이 많은 경우 InnoDB의 성능이 MyISAM보다 확실히 훨씬 뛰어날 것이라고 믿습니다. 또한, 어떤 테이블도 만능은 아닙니다. 업무 유형에 맞게 적절한 테이블 유형을 선택해야만 MySQL의 성능 이점을 극대화할 수 있습니다. 매우 복잡한 웹 애플리케이션이 아니거나 중요하지 않은 애플리케이션인 경우에도 MyISAM을 고려할 수 있습니다. 이 특정 상황을 직접 고려해 볼 수 있습니다.

19 Redis와 Memache 캐시의 차이점

요약 1:

1. 데이터 유형

Redis는 풍부한 데이터 유형을 가지며 세트 목록 및 기타 유형을 지원합니다.

memcache는 간단한 데이터 유형을 지원합니다. 그리고 고객이 필요합니다

2. Persistence

redis는 데이터 랜딩 영구 저장소를 지원합니다.

memcache는 데이터 영구 저장소를 지원하지 않습니다.

3.redis는 마스터-슬레이브 복제를 지원합니다. mode

Memcache는 배포를 위해 일관된 해싱을 사용할 수 있습니다

값 크기가 다릅니다

memcache는 메모리 캐시이고 키 길이는 250자 미만이며 단일 항목의 저장 공간은 1M 미만입니다. 가상 머신에 적합

4. 데이터 일관성이 다릅니다.

redis는 단일 스레드 모델을 사용하여 데이터가 순서대로 제출되도록 합니다.

memcache는 데이터 일관성을 보장하기 위해 cas를 사용해야 합니다. CAS(Check and Set)는 동시성 일관성을 보장하는 메커니즘이며 "낙관적 잠금" 범주에 속합니다. 원칙은 매우 간단합니다. 버전 번호를 가져와 작동하고 버전 번호를 비교하고 일치하면 작동합니다. 일관성이 없으면 작업을 포기하세요

5 .cpu 사용률

redis 단일 스레드 모델은 하나의 CPU만 사용할 수 있으며 여러 redis 프로세스를 열 수 있습니다

요약 2:

1. , 모든 데이터가 항상 메모리에 저장되는 것은 아니며 이것이 Memcached와 비교할 때 가장 큰 차이점입니다.

2.Redis는 단순 k/v 형태의 데이터를 지원할 뿐만 아니라 리스트, 세트, ​​해시 등의 데이터 구조에 대한 저장도 제공합니다.

3.Redis는 데이터 백업, 즉 마스터-슬레이브 모드에서의 데이터 백업을 지원합니다.

4.Redis는 데이터 지속성을 지원하므로 데이터를 디스크 메모리에 보관하고 다시 시작할 때 사용하기 위해 다시 로드할 수 있습니다.

개인적으로 가장 본질적인 차이점은 Redis가 여러 면에서 데이터베이스의 특성을 갖고 있거나 데이터베이스 시스템인 반면, Memcached는 단순한 K/V 캐시에 불과하다는 점이라고 생각합니다

요약 3:

Redis와 memecache의 차이점은 다음과 같습니다.

1. 저장 방법:

memecache는 정전 후 데이터가 메모리 크기를 초과할 수 없습니다. 하드 디스크에 저장되므로 데이터가 하드 디스크에 저장됩니다.

2. 데이터 지원 유형:

redis는 memecache보다 훨씬 더 많은 데이터 지원을 제공합니다.

3. 기본 모델이 다릅니다.

새 버전의 Redis는 VM 메커니즘을 자체적으로 직접 구축합니다. 왜냐하면 일반 시스템이 시스템 기능을 호출하면 이동 및 요청에 일정 시간이 낭비되기 때문입니다.

4. 다양한 운영 환경:

redis는 현재 공식적으로 Linux만 지원하므로 다른 시스템에 대한 지원이 필요하지 않습니다. 이러한 방식으로 나중에 Microsoft 팀이 시스템 환경을 최적화하는 데 에너지를 더 잘 소비할 수 있습니다. 그것에 대한 패치를 작성했습니다. 그러나 트렁크에 배치되지는 않습니다

memcache는 캐시로만 사용할 수 있습니다. 캐시

redis의 내용은 MongoDB와 다소 유사하며, master- 슬레이브 설정 가능

20 redis 메시지 대기열에서 선입선출을 사용할 때 주의해야 할 점은 무엇입니까?

답변: 일반적으로 목록은 대기열 작업을 구현하는 데 사용됩니다. 모든 작업은 균일하게 선입선출됩니다. 특정 작업의 우선순위를 지정하려면 대기열에 우선순위 개념이 있어야 상위 수준 작업의 우선순위를 지정할 수 있습니다. 이를 달성하는 몇 가지 방법:

1)单一列表实现:队列正常的操作是 左进右出(lpush,rpop)为了先处理高优先级任务,在遇到高级别任务时,可以直接插队,直接放入队列头部(rpush),这样,从队列头部(右侧)获取任务时,取到的就是高优先级的任务(rpop)

2)使用两个队列,一个普通队列,一个高级队列,针对任务的级别放入不同的队列,获取任务时也很简单,redis的BRPOP命令可以按顺序从多个队列中取值,BRPOP会按照给出的 key 顺序查看,并在找到的第一个非空 list 的尾部弹出一个元素,redis> BRPOP list1 list2 0

list1 做为高优先级任务队列
list2 做为普通任务队列

这样就实现了先处理高优先级任务,当没有高优先级任务时,就去获取普通任务
方式1  最简单,但实际应用比较局限,方式3可以实现复杂优先级,但实现比较复杂,不利于维护
方式2  是推荐用法,实际应用最为合适
로그인 후 복사

21 Redis如何防止高并发?

答:其实redis是不会存在并发问题的,因为他是单进程的,再多的命令都是一个接一个地执行的。我们使用的时候,可能会出现并发问题,比如获得和设定这一对。Redis的为什么 有高并发问题?Redis的出身决定等

Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘。由于单线程所以redis本身并没有锁的概念,多个客户端连接并不存在竞争关系,但是利用jedis等客户端对redis进行并发访问时会出现问题。发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成。

同时,单线程的天性决定,高并发对同一个键的操作会排队处理,如果并发量很大,可能造成后来的请求超时。

在远程访问redis的时候,因为网络等原因造成高并发访问延迟返回的问题。

解决办法

在客户端将连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。

服务器角度,利用setnx变向实现锁机制。

22 做秒杀用什么数据库,怎么实现的?

答:因为秒杀的一瞬间,并发非常大,如果同时请求数据库,会导致数据库的压力非常大,导致数据库的性能急剧下降,更严重的可能会导致数据库服务器宕机。

这时候一般采用内存高速缓存数据库redis来实现的,redis是非关系型数据库,redis是单线程的,通过redis的队列可以完成秒杀过程。

23 什么情况下使用缓存?

答:当用户第一次访问应用系统的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据--ticket;

用户再访问别的应用的时候,就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把 ticket送到认证系统进行校验,检查ticket的合法性。如果通过校验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。

实现主要技术点:

1、两个站点共用一个数据验证系统

2、主要通过跨域请求的方式来实现验证及session处理。

24 如何解决异常处理?

答: 抛出异常:使用try…catch,异常的代码放在try代码块内,如果没有触发异常,则代码继续执行,如果异常被触发,就会 抛出一个异常。Catch代码块捕获异常,并创建一个包含异常信息的对象。$e->getMessage(),输出异常的错误信息。

解决异常:使用set_error_handler函数获取异常(也可以使用try()和catch()函数),然后使用set_exception_handler()函数设置默认的异常处理程序,register_shutdown_function()函数来执行,执行机制是,php要把调入的函数调入到内存,当页面所有的php语句都执行完成时,再调用此函数

25 权限管理(RBAC)的实现?

1.首先创建一张用户表:id name auto(保存格式为:控制器-方法)

2.然后在后台中创建一个基类控制器,控制器里封装一个构造方法,当用户登陆成功后,使用TP框架中封装好的session函数获取保存在服务器中的session id,然后实例化模型,通过用户id获取保存在数据表中的auth数据,使用explode函数分割获取到的数据,并使用一个数组保存起来,然后使用TP框架中封装好的常量获取当前控制器和方法,然后把他们组装成字符串,使用in_array函数进行判断该数组中是否含有当前获取到的控制器和方法,如果没有,就提示该用户没有权限,如果有就进行下一步操作

26 프로모션 제품이 과판매되지 않도록 하는 방법은 무엇입니까?

답변: 이 문제는 개발 중에 직면한 어려움이었습니다. 과판매의 주된 이유는 주문량이 우리가 원하는 제품 수와 일치하지 않기 때문입니다. 결과적으로 매번 주문량이 프로모션 제품 수보다 많았습니다. 그 당시 우리 팀은 이를 달성하기 위해 오랫동안 논의하고 몇 가지 계획을 세웠습니다.

첫 번째 계획. : 각 주문 전 판촉물 수량이 충분한지 판단하여 부족할 경우 주문이 불가하며, 재고 변경 시 조건을 추가하였고, 재고가 있는 상품만 변경하였습니다. 0보다 큼. 당시에는 스트레스 테스트를 위해 ab를 사용했습니다. 동시성이 500을 초과하면 방문 횟수가 2000을 초과하면 여전히 과매도 조건이 발생합니다. 그래서 우리는 그것을 부인했습니다.

두 번째 해결책: 문제를 해결하기 위해 mysql 트랜잭션과 배타적 잠금을 사용합니다. 먼저, 배타적 잠금을 사용하여 구현된 innoDB로 데이터베이스의 스토리지 엔진을 선택했는데, 여전히 공유 잠금이 있는 것으로 나타났습니다. 과매도 현상이 발생합니다. 한 가지 문제는 우리가 높은 동시성 테스트를 수행할 때 데이터베이스 성능에 큰 영향을 미치고 데이터베이스에 큰 부담을 주게 되어 결국 우리에게 거부당했다는 것입니다.

세 번째 옵션: 파일 잠금 구현을 사용합니다. 사용자가 판촉물을 집으면 먼저 파일 잠금이 실행되어 다른 사용자가 진입하는 것을 방지합니다. 사용자가 판촉물을 집은 후에는 파일 잠금이 해제되고 다른 사용자가 조작할 수 있습니다. 이렇게 하면 과매도 문제를 해결할 수 있지만 파일에 대한 I/O 오버헤드가 많이 발생합니다.

마지막으로 redis queue를 사용하여 구현했습니다. 홍보할 제품의 수는 대기열의 Redis에 저장됩니다. 사용자가 홍보 제품을 가져올 때마다 해당 제품이 과매출되지 않도록 대기열에서 데이터 조각이 삭제됩니다. 이는 운영이 매우 편리하고 매우 효율적입니다. 결국 우리는

27 쇼핑몰에서 플래시 세일을 구현합니까?

답변: 급한 구매와 플래시 세일은 오늘날 매우 일반적인 응용 시나리오입니다. 그리고 해결해야 할 주요 문제는 두 가지입니다:

  • 데이터베이스의 높은 동시성으로 인한 압력

  • 경쟁 상태에서 올바른 재고 감소("과매도" 문제)를 해결하는 방법

첫 번째 질문은 Redis를 사용하는 등 데이터베이스를 직접 운영하지 않고 급하게 구매를 처리하기 위해 캐싱을 사용한다고 생각하기 쉽습니다.

두 번째 질문의 경우 redis 대기열을 사용하여 완료하고 즉시 판매할 제품을 대기열에 넣을 수 있습니다. 팝 작업은 원자적이므로 많은 사용자가 동시에 도착하더라도 대기열에 실행됩니다. 물론, 스냅업 페이지를 정적으로 만들고 Ajax를 통해 인터페이스를 호출하는 등의 다른 측면도 고려해야 합니다. 사용자가 여러 번 가져오는 경우 대기열과 러시 결과 대기열 및 인벤토리 대기열을 추가해야 합니다.

동시성이 높은 경우 사용자를 대기열에 입력하고 스레드 루프를 사용하여 대기열에서 사용자를 제거한 후 해당 사용자가 이미 급매 결과 대기열에 있는지 확인합니다. 그렇지 않으면 스냅업되지 않으며 인벤토리가 1만큼 감소합니다. 데이터베이스 쓰기, 사용자를 결과 대기열에 넣습니다.

28 부하와 높은 동시성을 어떻게 처리하나요?

답변: 저비용, 고성능, 높은 확장성의 관점에서 볼 때 다음과 같은 솔루션이 있습니다.

1. HTML 정적화

사실 가장 효율적이고 비용이 가장 적게 드는 방법은 순수 정적화라는 것은 누구나 알고 있습니다. 따라서 우리는 웹사이트 페이지에 정적 페이지를 사용하려고 최선을 다합니다. 이 간단한 방법이 실제로 가장 효과적인 방법입니다.

2. 사진 서버 분리

사진 등 대규모 트래픽의 오버헤드를 최소화하기 위해 사진을 별도로 저장합니다. 황소 타기 등 일부 관련 플랫폼에 배치할 수 있습니다.

3. 및 라이브러리 테이블 해싱 및 캐시

데이터베이스의 동시 연결은 100입니다. 하나의 데이터베이스로는 충분하지 않습니다. 읽기-쓰기 분리, 마스터-슬레이브 복제 및 데이터베이스 클러스터링으로 시작할 수 있습니다. 또한 데이터베이스 액세스를 최소화하기 위해 Memcache 및 Redis와 같은 캐시 데이터베이스를 사용할 수 있습니다.

4. 미러링:

다운로드를 최대한 줄이고 다양한 요청을 여러 미러에 배포합니다.

5. 로드 밸런싱:

Apache의 최대 동시 연결 수는 1500입니다. F5 서버와 같은 하드웨어로만 시작할 수 있습니다. 물론 하드웨어 비용이 상대적으로 높기 때문에 소프트웨어 측면에서 시작하는 경우가 많습니다.

로드 밸런싱은 기존 네트워크 구조를 기반으로 구축되어 네트워크 장치 및 서버의 대역폭을 확장하고 처리량을 늘리며 네트워크 데이터 처리 기능을 향상시키는 동시에 네트워크 성능을 향상시키는 저렴하고 효과적이며 투명한 방법을 제공합니다. 유연성과 가용성. 현재 가장 널리 사용되는 로드 밸런싱 소프트웨어는 Nginx, LVS 및 HAProxy입니다.

다음 세 가지 유형의 장점과 단점을 각각 이야기해 보겠습니다.

Nginx의 장점은 다음과 같습니다.

네트워크의 7번째 계층 위에서 작업하면 http 애플리케이션에 대한 몇 가지 전환 전략을 세울 수 있습니다. , 도메인 이름, 디렉토리 구조와 같은 일반 규칙은 HAProxy보다 더 강력하고 유연하며, 이는 Nginx가 현재 널리 사용되는 주요 이유 중 하나입니다. 이것만으로도 LVS보다 훨씬 더 많은 상황에서 활용될 수 있습니다.

Nginx는 이론적으로 ping이 가능한 한 로드 기능을 수행할 수 있습니다. 반대로 LVS는 네트워크 안정성에 대한 의존도가 더 높습니다.

Nginx는 설치 및 구성이 비교적 간단하고, 기본적으로 로그에 오류를 인쇄하는 것이 더 편리합니다. LVS의 구성 및 테스트에는 상대적으로 오랜 시간이 걸리며 LVS는 네트워크에 크게 의존합니다.

높은 부하 압력을 견딜 수 있고 안정적입니다. 하드웨어가 나쁘지 않다면 일반적으로 수만 개의 동시성을 지원할 수 있으며 부하 정도는 LVS보다 상대적으로 작습니다.

Nginx는 웹 페이지 처리 시 서버에서 반환하는 상태 코드, 시간 초과 등의 내부 서버 오류를 포트를 통해 감지할 수 있으며, 오류를 반환하는 요청을 다른 노드에 다시 제출하지만 이를 지원하지 않는다는 단점이 있습니다. URL 감지. 예를 들어, 사용자가 파일을 업로드하고 있는데 업로드 프로세스 중에 업로드를 처리하는 노드가 실패하는 경우 Nginx는 재처리를 위해 업로드를 다른 서버로 전환하고 대용량 파일이 업로드되면 LVS의 연결이 직접 끊어집니다. 중요한 파일은 사용자가 불만족할 수 있습니다.

Nginx는 탁월한 로드 밸런서/역방향 프록시 소프트웨어일 뿐만 아니라 강력한 웹 애플리케이션 서버이기도 합니다. LNMP는 최근 몇 년 동안 매우 인기 있는 웹 아키텍처이기도 하며 트래픽이 많은 환경에서도 안정성이 매우 좋습니다.

Nginx는 이제 웹 역가속 캐시로서 점점 더 성숙해지고 있으며 기존 Squid 서버보다 빠릅니다. 역방향 프록시 가속기로 사용하는 것을 고려해 볼 수 있습니다.

Nginx는 중간 수준의 역방향 프록시로 사용할 수 있습니다. 이 수준에서 Nginx에는 기본적으로 Nginx와 비교할 수 있는 유일한 것이 있습니다. 그러나 lighttpd에는 아직 Nginx의 전체 기능이 없습니다. 구성이 명확하지 않고 읽기 쉽지도 않습니다. 커뮤니티 정보도 Nginx보다 훨씬 덜 활성화되어 있습니다.

Nginx는 정적 웹 페이지 및 이미지 서버로도 사용할 수 있으며 이 분야에서의 성능은 타의 추종을 불허합니다. Nginx 커뮤니티도 매우 활발하며 많은 타사 모듈이 있습니다.

Nginx의 단점은 다음과 같습니다.

Nginx는 http, https 및 이메일 프로토콜만 지원하므로 적용 범위가 더 작습니다.

백엔드 서버의 상태 확인은 포트를 통한 감지만 지원하고 URL을 통한 감지는 지원하지 않습니다. Session의 직접 보유는 지원하지 않으나, ip_hash를 통해 해결할 수 있습니다.

LVS: Linux 커널 클러스터를 사용하여 확장성(Scalability), 신뢰성(Reliability) 및 관리성(Manageability)이 우수한 고성능, 고가용성 로드 밸런싱 서버를 구현합니다.

LVS의 장점은 다음과 같습니다.

로드 저항이 강하고 배포용으로만 네트워크의 4번째 계층 이상에서 작동하며 트래픽이 생성되지 않습니다. 이 기능은 또한 로드 밸런싱 소프트웨어, 메모리 및 메모리에서 가장 강력한 성능을 결정합니다. CPU 리소스 소비는 상대적으로 낮습니다.

구성 가능성이 상대적으로 낮다는 것이 단점이자 장점입니다. 너무 많이 구성할 수 있는 것이 없기 때문에 접촉이 많이 필요하지 않아 인적 오류가 발생할 가능성이 크게 줄어듭니다.

부하 저항이 강하고 LVS+Keepalived와 같은 완전한 이중 머신 핫 백업 솔루션을 갖추고 있기 때문에 안정적으로 작동합니다. 하지만 우리가 프로젝트 구현에서 가장 많이 사용하는 것은 LVS/DR+Keepalived입니다.

트래픽이 없습니다. LVS는 요청만 분배하며 트래픽이 자체적으로 나가지 않습니다. 이는 밸런서 IO의 성능이 대규모 트래픽에 영향을 받지 않도록 보장합니다.

LVS는 레이어 4에서 작동하므로 http, 데이터베이스, 온라인 채팅방 등을 포함한 거의 모든 애플리케이션의 로드 밸런싱을 수행할 수 있습니다.

LVS의 단점은 다음과 같습니다.

소프트웨어 자체는 정규식 처리를 지원하지 않으며 동적 데이터와 정적 데이터를 분리할 수 없으며 현재 많은 웹사이트가 이와 관련하여 강력한 요구를 갖고 있습니다. 이것이 Nginx/HAProxy+Keepalived의 장점입니다. .

웹 사이트 애플리케이션이 상대적으로 큰 경우 LVS/DR+Keepalived는 구현하기가 더 복잡합니다. 특히 그 뒤에 Windows Server 시스템이 있는 경우 구현, 구성 및 유지 관리 프로세스가 상대적으로 더 복잡합니다. HAProxy+Keepalived는 훨씬 간단합니다.

HAProxy 기능은 다음과 같습니다.

HAProxy는 가상 호스트도 지원합니다.

HAProxy의 장점은 세션 보존 및 쿠키 안내 지원과 같은 Nginx의 일부 단점을 보완할 수 있으며, 지정된 URL을 획득하여 백엔드 서버의 상태 감지도 지원합니다.

HAProxy는 LVS와 유사하며 순전히 효율성 측면에서 로드 밸런싱 소프트웨어일 뿐입니다. HAProxy는 Nginx보다 로드 밸런싱 속도가 더 좋고 동시 처리에서도 Nginx보다 좋습니다.

HAProxy는 TCP 프로토콜의 로드 밸런싱 전달을 지원합니다. 이는 MySQL 읽기의 로드 밸런싱을 지원하고 백엔드 MySQL 노드를 감지 및 로드 밸런싱할 수 있습니다. LVS+Keepalived를 사용하여 MySQL 마스터와 슬레이브의 로드 밸런싱을 수행할 수 있습니다.

HAProxy에는 다양한 로드 밸런싱 전략이 있습니다. HAProxy의 로드 밸런싱 알고리즘에는 현재 다음과 같은 8가지 유형이 있습니다.

1 라운드 로빈(간단한 폴링)은 말할 것도 없이 기본적으로 로드 밸런싱에 사용되는 것입니다. 즉, 가중치를 기준으로 주의를 기울이는 것이 좋습니다.

3 연결이 가장 적은 항목이 먼저 처리된다는 의미인 최소 conn은 주의를 기울이는 것이 좋습니다.

4 소스는 요청 소스 IP를 기반으로 한다는 의미입니다. Nginx의 IP_hash 메커니즘과 유사하며 이를 세션 솔루션으로 사용합니다. 문제를 해결하는 방법에 주의하는 것이 좋습니다

⑤ ri는 요청된 URI를 나타냅니다.

⑥ rl_param은 요청된 URl 매개변수를 나타냅니다. 'balance url_param'에는 URL 매개변수 이름이 필요합니다.

7 hdr(name)은 HTTP 요청 헤더를 기반으로 각 HTTP 요청을 잠그는 것을 나타냅니다.

8 rdp-cookie(이름)은 쿠키(이름)를 기반으로 각 TCP 요청을 잠그고 해시하는 것을 의미합니다.

Nginx와 LVS 비교 요약:

Nginx는 네트워크의 7번째 계층에서 작동하므로 도메인 이름, 디렉터리 구조 등과 같은 http 애플리케이션 자체에 대한 전환 전략을 구현할 수 있습니다. LVS에는 이 기능이 없으므로 Nginx는 이것만으로도 LVS보다 훨씬 더 많은 상황에서 사용할 수 있지만 Nginx의 이러한 유용한 기능을 사용하면 LVS보다 조정이 더 쉬워지므로 너무 많이 터치하고 터치해야 하는 경우가 많습니다. 인간이 유발한 문제가 발생할 가능성도 더 커질 것입니다.

Nginx는 네트워크 안정성에 덜 의존합니다. 이론적으로 ping이 성공하고 웹페이지 액세스가 정상이면 Nginx에 연결할 수 있다는 점이 Nginx의 큰 장점입니다! Nginx는 내부 네트워크와 외부 네트워크가 모두 있는 노드인 경우 백업 라인이 있는 단일 시스템과 동일합니다. 현재 서버는 네트워크 환경에 더 많이 의존합니다. 동일한 네트워크 세그먼트와 LVS는 직접 모드를 사용하여 오프로드 효과를 더욱 보장합니다.

또한 LVS가 Visual IP로 사용하려면 호스팅 제공업체로부터 IP를 하나 이상 추가로 신청해야 합니다. 자체 IP를 VIP로 사용할 수는 없는 것 같습니다. 훌륭한 LVS 관리자가 되려면 더 이상 HTTP만큼 간단하지 않은 네트워크 통신에 대해 많은 지식을 습득하고 후속 조치를 취해야 합니다.

Nginx는 설치와 구성이 비교적 간단하고, 기본적으로 로그에 오류를 출력할 수 있기 때문에 테스트하기도 매우 편리합니다. LVS의 설치, 구성 및 테스트에는 상대적으로 오랜 시간이 걸립니다. LVS는 네트워크에 크게 의존하기 때문에 구성 문제가 아닌 네트워크 문제로 인해 실패하는 경우가 많습니다. 해결하기가 더 어렵습니다.

Nginx는 높은 로드를 견딜 수 있고 안정적이지만 로드와 안정성이 낮습니다. LVS에는 여러 수준이 있습니다. Nginx는 모든 트래픽을 처리하므로 시스템 IO에 의해 제한되며 자체 버그는 여전히 피할 수 없습니다.

Nginx는 웹 페이지를 처리하는 서버에서 반환된 상태 코드, 시간 초과 등과 같은 내부 서버 오류를 감지할 수 있으며 오류를 반환하는 요청을 다른 노드에 다시 제출합니다. 현재 LVS의 ldirectd는 서버의 내부 상태 모니터링도 지원할 수 있지만 LVS의 원칙으로 인해 요청을 다시 보낼 수 없습니다. 예를 들어, 사용자가 파일을 업로드하고 있는데 업로드 프로세스 중에 업로드를 처리하는 노드가 실패하는 경우 Nginx는 재처리를 위해 업로드를 다른 서버로 전환하고 대용량 파일이 업로드되면 LVS의 연결이 직접 끊어집니다. 중요한 파일이 있으면 사용자가 짜증을 낼 수 있습니다.

Nginx의 비동기 요청 처리는 노드 서버의 로드를 줄이는 데 도움이 될 수 있습니다. Apache를 사용하여 직접 외부 서비스를 제공하는 경우 협대역 링크가 많으면 Apache 서버가 많은 양의 메모리를 차지하므로 해제할 수 없습니다. 하나 더 Nginx를 Apache 프록시로 사용하면 Nginx에 의해 협대역 링크가 차단되므로 Apache에 너무 많은 요청이 쌓이지 않아 리소스 사용량이 상당히 줄어듭니다. Squid를 사용하면 이와 관련하여 동일한 효과가 있습니다. Squid 자체가 캐시하지 않도록 구성되어 있어도 Apache에는 여전히 매우 유용합니다.

Nginx는 http, https 및 이메일(이메일 기능은 덜 일반적으로 사용됨)을 지원할 수 있으며, LVS는 이 점에서 Nginx보다 더 많은 애플리케이션을 지원합니다. 사용 측면에서 일반적으로 프런트 엔드에서 채택하는 전략은 LVS입니다. 즉, DNS의 방향은 LVS 이퀄라이저여야 합니다. LVS의 장점은 이 작업에 매우 적합합니다.

데이터베이스 IP, 웹 서비스 서버 IP 등과 같은 중요한 IP 주소는 LVS에서 가장 잘 호스팅됩니다. 이러한 IP 주소는 시간이 지남에 따라 점점 더 널리 사용됩니다. 따라서 이러한 중요한 IP를 LVS에 넘겨 호스팅하는 것이 가장 안전합니다. 그렇게 하면 필요한 VIP 수가 더 많아진다는 단점이 있습니다.

Nginx는 LVS 노드 머신으로 사용될 수 있습니다. 첫째, Nginx의 기능을 활용할 수 있습니다. 둘째, Nginx의 성능을 활용할 수 있습니다. 물론 이 수준에서는 Squid를 직접 사용할 수도 있습니다. Squid의 기능은 Nginx에 비해 훨씬 약하고 성능도 Nginx에 비해 떨어집니다.

Nginx는 중간 수준 프록시로도 사용할 수 있습니다. 이 수준에서 Nginx는 기본적으로 Nginx를 흔들 수 있는 유일한 것은 lighttpd입니다. 그러나 lighttpd는 아직 Nginx의 전체 기능을 구현할 수 없습니다. 구성이 그렇게 명확하지 않고 읽기 쉽지 않습니다. 또한, 중간 에이전트의 IP도 중요하므로, 중간 에이전트에게도 VIP와 LVS를 갖는 것이 가장 완벽한 솔루션입니다.

특정 애플리케이션을 자세히 분석해야 합니다. 상대적으로 작은 웹사이트(일일 PV가 천만 미만)인 경우에는 Nginx를 사용하는 것이 좋습니다. 대규모 웹 사이트나 중요한 서비스의 경우 시스템이 걱정되지 않으면 LVS 사용을 고려해야 합니다.

추천 학습: "

PHP 비디오 튜토리얼"

위 내용은 [토혈] 이직에 도움이 되는 PHP 핵심 기술 면접 질문 28가지!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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