>  기사  >  백엔드 개발  >  PHP에서 중요한 PHP 지식 포인트를 공유하세요

PHP에서 중요한 PHP 지식 포인트를 공유하세요

小云云
小云云원래의
2018-03-16 16:08:195427검색

1. PHP의 자동 로드에 대해 간단히 설명하세요

PHP에서 클래스를 사용할 때 require나 include를 통해 사용하기 전에 먼저 로드해야 하지만 로딩에 영향을 미치는 두 가지 문제가 있습니다. 첫째는 이 클래스 파일이 어디에 저장되어 있는지 모른다는 것이고, 둘째는 이 파일을 언제 사용해야 할지 모르겠다는 점이다. 특히 프로젝트 파일이 많은 경우 각 파일의 시작 부분에 긴 요구 사항 목록을 작성하는 것은 불가능합니다.
자동 로드 로딩 메커니즘, new를 통해 클래스를 인스턴스화할 때 PHP는 정의된 자동 로드 기능을 통해 해당 파일을 로드합니다. 이 클래스 파일이 확장 또는 구현을 사용하고 다른 클래스 파일을 사용해야 하는 경우 PHP는 자동 로드를 다시 실행하여 검색하고 로드합니다. 클래스 파일에 대해 동일한 클래스 파일에 대한 요청이 두 번 발생하면 오류가 보고됩니다.

 2. 정적 변수의 장점과 단점은 무엇인가요?

정적 지역 변수의 특징: 1. 함수가 호출되고 종료될 때 변경되지 않습니다. 그러나 변수는 계속 존재하지만 사용할 수 없습니다. 이를 정의한 함수가 다시 호출되면 계속 사용할 수 있으며, 이전 호출 후 남은 값이 저장됩니다. 2. 정적 지역 변수는 한 번만 초기화됩니다. 3. 정적 속성은 문자값이나 상수로만 초기화할 수 있으며, 표현식은 사용할 수 없습니다. 지역 정적 변수가 초기값 없이 정의된 경우에도 시스템은 자동으로 초기값 0(숫자변수의 경우) 또는 null 문자(문자변수의 경우)를 할당합니다. 정적변수의 초기값은 0입니다. 함수가 여러 번 호출되는 경우 호출 간에 일부 변수의 값을 유지해야 할 경우 정적 지역 변수 사용을 고려하세요. 위의 목적을 달성하기 위해 전역 변수를 사용할 수도 있지만 전역 변수는 예상치 못한 부작용을 일으키는 경우가 있으므로 여전히 로컬 정적 변수를 사용하는 것이 좋습니다.

3. strtr과 str_replace의 차이점은 무엇이며 어떤 시나리오에서 사용됩니까? 그들이 사용했나요?

str_replace() 함수는 문자열의 일부 문자를 다른 문자로 바꿉니다(대소문자 구분).

strtr() 함수는 문자열의 특정 문자를 변환합니다.

5.6 버전의 str_replace는 strtr보다 10배 이상 효율적이고 7.0 버전은 기본적으로 동일한 효율성이지만 5.6의 str_replace는 7.0

4보다 3배 더 효율적입니다. 마법의 방법

__construct(): 클래스의 기본 생성자, __construct When()과 클래스와 동일한 이름의 메서드가 함께 나타나면 기본적으로 동일한 이름의 메서드 대신 __construct()가 호출됩니다.

__call(): 존재하지 않거나 액세스할 수 없는 메서드를 호출하면 __call($name, $arguments) 메서드가 호출됩니다.

__toString(): 객체를 인쇄할 때 직접 호출됩니다. echo $object;

__clone()과 같은: 객체가 복사될 때 직접 호출됩니다.

__isset(): 존재하지 않거나 액세스할 수 없는 속성에 isset() 또는empty()가 사용되면 __isset()가 호출됩니다.

__destruct(): 객체에 대한 모든 참조가 있을 때 클래스의 소멸자입니다. 삭제되거나 객체가 명시적으로 소멸될 때 실행됩니다.

5. 아래와 같이 어떤 결과가 출력되나요?

foreach ($array as $key => $item) 
{            $array[$key + 1] = $item + 2;            
echo "$item";        }        
print_r($array);
结果示例: $array = [3,6,7,8];
3678 //echo 输出数组内元素的值Array(   
 [0] => 3  //$key 保持不变    
 [1] => 5 //每次的$eky + 1,对应的值加2,    [2] => 8    [3] => 9    [4] => 10)

laravel

다른 프레임워크와 비교한 laravel의 장점과 단점

laravel

장점: 세계 최대의 사용자 수, 완전한 문서, 명확하게 구성된 프레임워크 구조, 참조할 수 있는 수많은 타사 확장 패키지, 숙련된 개발 도구의 개발 효율성이 높으면 대규모 웹사이트의 공동 개발에 적합합니다. Composer 확장은 자동으로 로드됩니다. 미들웨어

단점: 일반 프레임워크보다 약간 복잡하고 시작하기가 느리지만 타사 패키지에 대한 많은 참조가 있지만 일부 시나리오에서는 클래스에서 일부 메서드만 사용하므로 코드가 약간 중복되는 것처럼 보입니다.

ThinkPHP

장점: MVC 및 객체 지향 기반의 빠르고 간단한 경량 PHP 개발 프레임워크이며 Apache2 오픈 소스 라이센스로 출시되며 뛰어난 성능과 최소한의 코드를 유지하면서 간단하고 실용적인 디자인 원칙을 준수합니다. , 개발 경험과 사용 편의성에 특별한 주의를 기울이고 독창적인 기능과 특징이 많이 포함되어 WEB 애플리케이션 개발을 강력하게 지원합니다. 간단하고 명확하며 편리하고 빠르게 시작할 수 있습니다

단점: 객체 지향 설계가 부족하고 버전 5는 기본적으로 객체 지향이며 프레임워크 커뮤니티와 관련된 보조 도구가 거의 없습니다

Mysql

1. int(10) 및 int(11) 차이점

BIT[M] 비트 필드 유형, M은 1~64 범위의 값당 비트 수를 나타냅니다. M을 무시하면 기본값은 1

TINYINT [( M)] [UNSIGNED] [ZEROFILL] M 기본값은 4입니다. 매우 작은 정수. 부호 있는 범위는 -128부터 127까지입니다. 부호 없는 범위는 0~255입니다.

SMALLINT[(M)] [UNSIGNED] [ZEROFILL] M의 기본값은 6입니다. 작은 정수. 부호 있는 범위는 -32768부터 32767까지입니다. 부호 없는 범위는 0~65535입니다.

MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] M의 기본값은 9입니다. 중간 크기의 정수. 부호 있는 범위는 -8388608부터 8388607까지입니다. 부호 없는 범위는 0~16777215입니다.

INT[(M)] [UNSIGNED] [ZEROFILL] M의 기본값은 11입니다. 일반 크기의 정수입니다. 부호 있는 범위는 -2147483648부터 2147483647까지입니다. 부호 없는 범위는 0~4294967295입니다.

BIGINT[(M)] [UNSIGNED] [ZEROFILL] M의 기본값은 20입니다. 큰 정수. 부호 있는 범위는 -9223372036854775808부터 9223372036854775807까지입니다. 부호 없는 범위는 0~18446744073709551615입니다.

참고: 여기서 M은 데이터베이스에 저장된 특정 길이를 나타내지 않습니다. 과거에는 int(3)가 3개 길이의 숫자만 저장할 수 있는 반면 int(11)은 11개 길이의 숫자만 저장할 수 있다고 잘못 인식되었습니다. , 이것은 완전히 잘못된 것입니다. 실제로 int(3)이든 int(11)이든 int 유형을 사용하도록 선택하면 int(3)를 사용할 때 10을 입력하면 데이터베이스에 4바이트의 길이가 저장됩니다. 기본적으로 저장 비트 010이 제공됩니다. 이는 3이 기본 길이를 나타냄을 의미합니다. 3자리 미만인 경우 불완전한 길이를 처리하는 데 도움이 됩니다.
**int(M) M은 최대 표시 너비를 나타냅니다. 최대 유효 표시 너비는 255입니다. 선택적 표시 너비 지정은 표시 너비가 지정된 열 너비보다 작은 경우 왼쪽부터 너비를 채우는 데 사용됩니다. 표시 너비는 열 내에 담을 수 있는 값의 범위를 제한하지 않으며, 열의 지정된 너비를 초과하는 값의 표시를 제한하지도 않습니다.

2. 인덱스 왼쪽 원칙:

문자열 일치 시 와일드카드로 시작하지 않고 왼쪽을 고정해야 하며 필드 인덱스가 작동합니다.

복합 인덱스, 왼쪽 필드를 고정하면 , 인덱스가 일치하는 경우 오른쪽의 인덱스만 유효합니다. 복합 인덱스 키워드 정렬은 왼쪽 필드를 기준으로 하기 때문에 왼쪽 필드가 동일할 경우 오른쪽 필드를 기준으로 정렬됩니다.

3. 인덱스 생성의 장점과 단점:

장점:

인덱스를 생성하면 시스템 성능이 크게 향상될 수 있습니다.

고유 인덱스를 통해 데이터베이스 테이블의 각 데이터 행에 대한 고유성이 보장될 수 있습니다.

검색 속도 대폭 향상

테이블 간 연결 가속화

데이터 검색을 위해 그룹화 및 정렬 절을 사용할 때 쿼리에서 그룹화 및 정렬 시간을 줄입니다.

인덱스를 사용하면 쿼리 프로세스 중에 최적화 숨기기를 사용하여 시스템을 개선할 수 있습니다. 성능

단점:

인덱스를 생성하고 유지하는 데 시간이 걸리며, 이는 데이터 양에 따라 증가합니다.

인덱스는 물리적 공간을 차지합니다.

테이블에서 데이터를 추가, 삭제 또는 수정할 때 인덱스를 동적으로 유지해야 합니다. , 이는 데이터 유지 관리를 감소시킵니다. 4. mysql 마스터와 슬레이브 서버 간에 데이터가 어떻게 동기화되는지 설명해주세요. 어떤 종류의 SQL이 마스터와 슬레이브의 동기화에 실패하게 합니까?

네트워크 지연

mysql 마스터-슬레이브 복제는 binlog 기반의 비동기 복제이기 때문에 binlog 파일은 네트워크를 통해 전송됩니다. 물론 네트워크 지연은 특히 데이터 동기화가 발생할 때 마스터-슬레이브 동기화의 대다수 이유입니다. 전산실 전반에 걸쳐 발생할 확률이 매우 높으므로 읽기와 쓰기를 분리하고 비즈니스 계층에서 초기 설계에 주의하십시오.

마스터와 슬레이브 머신의 로드가 일관되지 않습니다

mysql 마스터-슬레이브 복제는 마스터 데이터베이스에서 1개의 io 스레드를 시작하고 위에서 1개의 sql 스레드와 1개의 io 스레드를 시작하므로 머신 중 하나의 로드는 다음과 같습니다. 매우 높음, 너무 바빠서 스레드 중 하나에 대한 리소스가 부족하고 마스터-슬레이브 불일치가 발생합니다.

max_allowed_packet 설정이 일치하지 않습니다

마스터 데이터베이스에 설정된 max_allowed_packet이 슬레이브 데이터베이스의 설정보다 큽니다. 마스터 데이터베이스에서 대규모 SQL 문을 실행할 수 있는 경우 슬레이브 데이터베이스의 설정이 너무 작아서 실행할 수 없습니다. , 마스터-슬레이브 불일치가 발생합니다.

자동 증가 키에서 시작하는 키 값과 자동 증가 단계 설정의 불일치로 인해 발생하는 마스터-슬레이브 불일치.

mysql 비정상적인 다운타임이 발생한 경우 sync_binlog=1 또는 innodb_flush_log_at_trx_commit=1이 설정되지 않은 경우 binlog 또는 Relaylog 파일이 손상되어 마스터-슬레이브 불일치가 발생할 가능성이 매우 높습니다.

마스터-슬레이브 동기화는 mysql 자체의 버그로 인해 발생합니다.

버전이 일치하지 않습니다. 특히 상위 버전이 마스터이고 하위 버전이 슬레이브인 경우 마스터 데이터베이스에서 지원되는 기능이 슬레이브 데이터베이스에서는 지원되지 않습니다

5. 다음과 같은 순서 테이블이 있습니다. 가장 많이 구매한 것을 찾으세요 사용자 2명

user_id

goods

100000 100 Apple

100001 100 Apple

100002 101 Orange

100003 102 Apple

100004 102 바나나

sql:

SELECT order_id,user_id,COUNT( order_id) AS count FROM order GROUP BY user_id ORDER BY count DESC 제한 2

Linux


웹 서비스가 느린지 확인하는 방법

top: 시스템 성능 확인

Nginx: 추가 마지막 필드까지 $request_time

List PHP 페이지는 3초 이상 걸리는 페이지를 요청하고, 나타나는 횟수를 세고, 처음 100개 항목을 표시합니다.

cat access.log|awk '($NF > 1 && $7~/.php/){print $7}'|sort -n| uniq -c|sort -nr|head -100

코드로 구현, 쓰기 시작 시간, 끝 쓰기 시간


포괄적

1. AES와 RSA 사이:

RSA는 비대칭 암호화, 공개 키 암호화, 개인 키 암호 해독이며 그 반대도 마찬가지입니다. 단점: 실행 속도가 느리고 하드웨어로 구현하기가 어렵습니다. 일반적인 개인 키 길이는 512비트, 1024비트, 2048비트, 4096비트입니다. 길이가 길수록 보안은 강화되지만 키 생성 속도가 느려지고 암호화 및 복호화에 더 많은 시간이 소요됩니다.

AES 대칭 암호화, 가장 긴 키는 256비트에 불과하며 실행 속도가 빠르고 하드웨어 구현이 쉽습니다. 대칭 암호화이기 때문에 전송하기 전에 통신 당사자 모두에게 키를 알려야 합니다.

AES加密数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥 长度不足时,会补齐)

总结:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。

RBAC:基于角色的访问控制

一个用户属于多个角色

角色拥有多个动作的权限

用户是否具有某些动作的权限

表:用户表、角色表、动作表,用户角色关联表、角色动作关联表

MongoDB

MongoDB数据类型:

String(字符串): mongodb中的字符串是UTF-8有效的。

Integer(整数): 存储数值。整数可以是32位或64位,具体取决于您的服务器。

* Boolean(布尔): 存储布尔(true/false)值。

Double(双精度): 存储浮点值。

Min/ Max keys(最小/最大键): 将值与最低和最高BSON元素进行比较。

Arrays(数组): 将数组或列表或多个值存储到一个键中。

Timestamp(时间戳): 存储时间戳。

Object(对象): 嵌入式文档。

Null (空值): 存储Null值。

Symbol(符号): 与字符串相同,用于具有特定符号类型的语言。

Date(日期): 以UNIX时间格式存储当前日期或时间。

Object ID(对象ID) : 存储文档ID。

Binary data(二进制数据): 存储二进制数据。

Code(代码): 将JavaScript代码存储到文档中。

Regular expression(正则表达式): 存储正则表达式

算法

1. 排序算法

* 快速排序

快速排序是十分常用的高效率的算法,其思想是:我先选一个标尺,用它把整个队列过一遍筛选,以保证其左边的元素都不大于它,其右边的元素都不小与它function quickSort($arr){  // 获取数组长度

 $length = count($arr);  // 判断长度是否需要继续二分比较
  if($length <= 1){    return $arr;
  }  // 定义基准元素
  $base = $arr[0];  // 定义两个空数组,用于存放和基准元素的比较后的结果
  $left = [];
  $right = [];  // 遍历数组
  for ($i=1; $i < $length; $i++) { 
    // 和基准元素作比较
    if ($arr[$i] > $base) {
      $right[] = $arr[$i];
    }else {
      $left[] = $arr[$i];
    }
  }  // 然后递归分别处理left和right
  $left = quickSort($left);
  $right = quickSort($right);  // 合并
  return array_merge($left,[$base],$right);
  
}

冒泡排序

思路:法如其名,就像冒泡一样,每次从数组中冒出一个最大的数
比如:2,4,1
第一次冒出4:2,1,4
第二次冒出2:1,2,4

function bubbleSort($arr){  // 获取数组长度
  $length = count($arr);  // 第一层循环控制冒泡轮次
  for ($i=0; $i < $length-1; $i++) { 
    
    // 内层循环控制从第0个键值和后一个键值比较,每次冒出一个最大的数
    for ($k=0; $k < $length-$i; $k++) { 
      if($arr[$k] > $arr[$k+1]){
        $tmp = $arr[$k+1];
        $arr[$k+1] = $arr[$k];
        $arr[$k] = $tmp;
      }
    }
  }  return $arr;
}

选择排序

思路:每次选择一个相应的元素,然后将其放到指定的位置

function selectSort($arr){   
 // 实现思路  // 双重循环完成,外层控制轮数,当前的最小值,内层控制比较次数  // 获取长度  $length = count($arr);  
 for ($i=0; $i < $length - 1; $i++) { 
   // 假设最小值的位置    $p = $i;  
   // 使用假设的最小值和其他值比较,找到当前的最小值    for ($j=$i+1; $j < $length; $j++) { 
     // $arr[$p] 是已知的当前最小值  
     // 判断当前循环值和已知最小值的比较,当发下更小的值时记录下键,并进行下一次比较      if ($arr[$p] > $arr[$j]) {        $p = $j; // 比假设的值更小
     }
   }  
   // 通过内部for循环找到了当前最小值的key,并保存在$p中    // 判断 日光当前$p 中的键和假设的最小值的键不一致增将其互换    if ($p != $i) {      $tmp = $arr[$p];      $arr[$p] = $arr[$i];      $arr[$i] = $tmp;
   }
 }  // 返回最终结果
 return $arr;
}

相关推荐:

PHP中的运算符及PHP知识基础

关于PHP知识点的详细介绍

对PHP知识的有关介绍介绍

위 내용은 PHP에서 중요한 PHP 지식 포인트를 공유하세요의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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