Расчесывание знаний PHP на собеседовании

PHP

Об авторе

Я выложил вчера эту статью на Сифу, и в 10 часов вечера я увидел много лайков, избранных и внимания.На самом деле, я чувствую себя виноватым, потому что статья, которую я искал работу, не разбиралась в последнее время . Это довольно популярно видеть, и поскольку новая работа в основном улажена, компания в настоящее время находится в процессе нормальной передачи, и я планирую разобраться с этим знанием до следующих выходных.Спасибо за ваши лайки, подборки и внимание. работать вместе.

Кроме того, мой собственный блог здесь, ха-ха:www.linganmin.cn

Алгоритмы и структуры данных

B-дерево и B+дерево

  • BTree
    B-дерево — это сбалансированное дерево поиска с несколькими ответвлениями, предназначенное для дисков или других устройств хранения данных.По сравнению с двоичным деревом каждый внутренний узел B-дерева имеет несколько ветвей, то есть несколько ответвлений.

    Справочная статья:www.jianshu.com/p/da5...

  • B+Tree
    Дерево B+ является вариантом дерева B, а также деревом многостороннего поиска.

    Справочная статья:www.jianshu.com/p/da5...

Алгоритм сортировки

  • Быстрая сортировка Быстрая сортировка — очень часто используемый и эффективный алгоритм.Идея состоит в том, чтобы сначала выбрать линейку и использовать ее для фильтрации всей очереди, чтобы гарантировать, что элементы слева не больше ее, а элементы справа не меньше его

    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;
        }

компьютерная сеть

Разница между TCP/UDP

  • TCP
    TCP — это ориентированный на установление соединения, надежный протокол связи транспортного уровня на основе потока байтов.
    Ориентирован на TCP-соединение, предоставляя надежные услуги передачи данных
    Заголовок TCP 20 байт
    Логический канал связи TCP является полнодуплексным надежным каналом.
    Соединения TCP могут быть только точка-точка
  • UDP
    UDP — это протокол транспортного уровня без установления соединения в эталонной модели, который предоставляет ориентированные на транзакции простые и ненадежные службы доставки информации.
    UDP без установления соединения, ненадежный
    Накладные расходы заголовка UDP составляют 8 байт.
    Логический канал связи UDP является ненадежным каналом
    UDP не имеет механизма перегрузки, поэтому перегрузка сети не снизит эффективность отправки исходного хоста.
    UDP поддерживает интерактивную связь «один к одному», «многие к одному» и «многие ко многим».

Три рукопожатия, четыре волны, почему три рукопожатия и четыре волны

В протоколе TCP/IP протокол TCP предоставляет услуги надежного соединения.Соединение устанавливается с помощью трехэтапного рукопожатия.После завершения трехэтапного рукопожатия клиент и сервер начинают передавать данные. Проще говоря: когда A и B устанавливают TCP-соединение, сначала A отправляет SYN (запрос синхронизации) к B, затем B отвечает SYN+ACK (ответ на запрос синхронизации), и, наконец, A отвечает подтверждением ACK, так что TCP-соединение (трехстороннее рукопожатие) Все готово.

  • Трехстороннее рукопожатие TCP

    Так называемое трехстороннее рукопожатие означает, что при возобновлении TCP-соединения клиент и сервер должны отправить в общей сложности три пакета.
    Целью трехэтапного рукопожатия является подключение к указанному порту сервера, возобновление TCP-соединения, синхронизация серийных номеров обеих сторон и обмен информацией о размере окна TCP.
    Схема трехстороннего рукопожатия TCP:
    1. первое рукопожатие
      Клиент отправляет пакет с флагом SYN TCP равным 1, указывающим порт сервера, к которому клиент намеревается подключиться, и порядковый номер инициализации, который хранится в поле порядкового номера заголовка пакета.
    2. второе рукопожатие
      Сервер отвечает на пакет подтверждения, то есть флаг SYN и флаг ACK равны 1, а порядковый номер подтверждения устанавливается равным ISN клиента плюс 1, то есть X+1.
    3. третье рукопожатие
      Клиент снова отправляет пакет подтверждения, флаг SYN равен 0, флаг ACK равен 1, а поле порядкового номера, отправленное сервером, +1 отправляется другой стороне в поле подтверждения, а +1 ISN написано в поле данных.

Простое объяснение трехстороннего рукопожатия TCP:
Ссылаться на:GitHub.com/jawIL/блог.…

  • помахал четыре раза

    Для разрыва соединения TCP требуется отправить четыре пакета, поэтому это называется четырьмя волнами. Либо клиент, либо сервер могут активно инициировать действие размахивания.
    Поскольку соединения TCP являются полнодуплексными, каждое направление должно быть закрыто отдельно. Принцип заключается в том, что когда сторона завершает свою задачу по передаче данных, она может отправить FIN для разрыва соединения в этом направлении. Получение FIN означает только то, что в этом направлении нет потока данных, TCP-соединение все еще может отправлять данные после получения FIN. Сторона, которая выключится первой, выполнит активное выключение, а другая сторона выполнит пассивное выключение.
  • Почему три рукопожатия и четыре волны?
    Это связано с тем, что сокет в состоянии LISTEN сервера может отправить ACK и SYN в одном сообщении после получения запроса на возобновление соединения сообщения SKY. Но при закрытии соединения, при получении уведомления FIN сообщения другой стороны, он просто имеет в виду, что у другой стороны нет данных для отправки вам, но не обязательно все ваши данные отправляются другой стороне, поэтому вам не нужно немедленно закрыть сокет, то есть вы также можете отправить некоторые данные другой стороне, а затем отправить другой стороне сообщение FIN, чтобы указать, что вы согласны с тем, что соединение теперь может быть закрыто, поэтому сообщения ACK и FIN здесь в основном отправили отдельно.

Длинные и короткие соединения

Перед реальной операцией чтения и записи TCP должно быть установлено соединение между сервером и клиентом. Когда операция чтения и записи завершена, обе стороны могут разорвать соединение, когда оно им больше не нужно. Соединение установлено. через трехстороннее рукопожатие, а для освобождения требуется четыре раза взмахнуть руками, поэтому для установления каждого соединения требуются ресурсы и время.

  • Короткое TCP-соединение

    1. Клиент инициирует запрос на подключение к серверу
    2. Сервер получает запрос, и две стороны устанавливают соединение.
    3. клиент отправляет сообщение на сервер
    4. сервер отвечает клиенту
    5. После завершения чтения и записи любая из двух сторон может инициировать операцию закрытия.
      Как правило, клиент инициирует операцию закрытия первым, потому что общий сервер не закроет соединение сразу после ответа клиенту.

Таким образом, короткие соединения обычно передают только одну операцию чтения и записи между клиентом и сервером. Короткие соединения относительно просты в управлении. Все существующие соединения являются полезными соединениями и не требуют дополнительных методов управления.

  • Длинное соединение

    1. Клиент инициирует соединение с сервером
    2. После того, как сервер получает запрос, две стороны устанавливают соединение.
    3. клиент отправляет сообщение на сервер
    4. сервер отвечает клиенту
    5. Одно чтение и запись завершены, соединение не закрыто
    6. Последующие операции чтения и записи
  • Процесс работы длинного/короткого соединения

    1. Этапы работы для короткого соединения:
      Установить соединение -> передача данных -> закрыть соединение
    2. Этапы работы для длинного соединения:
      установить соединение -> передача данных -> (сохранить соединение) -> передача данных -> закрыть соединение
  • Плюсы и минусы длинных/коротких соединений

    1. Длинные соединения могут сэкономить больше операций установления и закрытия TCP, сократить потери ресурсов, сэкономить время и больше подходят для длинных соединений для клиентов, которые часто запрашивают ресурсы.
    2. Серверу проще управлять короткими соединениями, а все существующие соединения являются полезными соединениями без дополнительных средств контроля.

Что происходит от ввода доменного имени в браузере до отображения страницы

  • Разрешение доменного имени DNS
    Сначала находим локальный файл hosts, проверяем взаимосвязь между соответствующим ip доменного имени, если она есть, вы хотите отправить запрос на ip адрес, но не заходить на сервер DNS.
  • установить TCP-соединение
    Получив IP-адрес сервера, отправьте запрос на сервер, трижды выполните рукопожатие и установите TCP-соединение.
    Простое понимание трехстороннего рукопожатия:
    Клиент: Здравствуйте, не дома, я вам экспресс
    Сервер: Да, принесите сюда
    Клиент: Хорошо, пошли
  • отправить HTTP-запрос
    После установления соединения с сервером вы можете инициировать запрос к серверу. Конкретное содержимое запроса можно просмотреть в браузере.
  • Сервер обрабатывает запрос
    После того, как сервер получает запрос, веб-сервер (Apache, Nginx) обрабатывает запрос, веб-сервер анализирует запрос пользователя, знает, какие файлы ресурсов необходимо вызвать, а затем обрабатывает запрос пользователя и параметры через соответствующие файлы ресурсов, и вызывает базу данных и т.д. Результат возвращается в браузер через веб-сервер
  • вернуть результат ответа
    В результате ответа будет код состояния HTTP, например всем известные 200, 404, 500 и т.д.
    Коды состояния состоят из трех цифр и фраз причины, которые можно условно разделить на пять категорий:
    1XX Информационный код статуса Получен запрос обрабатывается
    2XX код состояния успеха Запрос обрабатывается нормально
    Код состояния перенаправления 3XX Дополнительные действия, необходимые для выполнения запроса
    4XX Код состояния ошибки клиента Сервер также не может обработать запрос
    5XX код состояния ошибки сервера Ошибка обработки запроса сервера
  • закрыть TCP-соединение
    Во избежание занятия и потребления ресурсов как сервером, так и клиентом, когда между двумя сторонами нет запроса или ответа, любая из сторон может инициировать запрос на закрытие. , для закрытия TCP-соединения требуется четыре взмаха рук.
    Простая аналогия:
    Клиент: приятель, у меня нет данных для передачи сюда, давай закроем соединение
    Сервер: Хорошо, позвольте мне посмотреть, есть ли еще данные на моей стороне.
    Сервер: Брат, у меня нет данных для передачи тебе, мы можем закрыть соединение
    Клиент: хорошо
  • Браузер анализирует HTML
  • Отрисовка макета браузера

Шаблоны проектирования

Шаблон проектирования — это набор повторно используемых, наиболее известных, классифицированных и каталогизированных сводок опыта разработки кода. Шаблоны проектирования используются для повторного использования кода, облегчения его понимания другими и обеспечения надежности кода.

одноэлементный шаблон

Шаблон singleton очень полезен, когда вам нужно гарантировать, что существует только один экземпляр объекта. Он дает контроль над созданием объектов в одной точке, и в любой момент времени существует только один экземпляр приложения. Классы Singleton не должны создавать экземпляры вне класса. Одноэлементный класс должен иметь следующие факторы:

  • Должен иметь уровень доступаprivateКонструктор для предотвращения создания экземпляра класса по желанию
  • Должна иметь статическую переменную, содержащую экземпляр класса
  • должен иметь общедоступный статический метод для доступа к этому экземпляру, который обычно называетсяgetInstance()
  • должен иметь частный пустойcloneметод предотвращения клонирования экземпляров

Простой пример:


class Single
{
    public static $_instance;

    private function __construct()
    {
    }

    private function __clone()
    {
    }

    public static function getInstance()
    {
        if (!self::$_instance) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    public function sayHi()
    {
        echo "Hi \n";
    }
}

$single = Single::getInstance();
$single->sayHi();

заводской узор

Заводской шаблон решает, как не пройтиnewКак создать экземпляр объекта

Фабричный шаблон — это класс, который имеет несколько методов для создания объектов для вас, вы можете использовать фабричный класс для создания объектов без использованияnew. Таким образом, если вы хотите изменить тип создаваемого объекта, вам нужно только изменить фабрику, и весь код, использующий фабрику, изменится автоматически.

Шаблон фабрики часто используется вместе с интерфейсами, поэтому приложению не нужно знать конкретные детали этих созданных классов, поскольку фабрика возвращает класс, поддерживающий определенный интерфейс, его можно удобно использовать.

Простой пример:



/**
 * 抽象出一个人的接口
 * Interface Person
 */
interface Person
{
    public function showInfo();
}

/**
 * 一个继承于抽象人接口的学生类
 * Class Student
 */
class Student implements Person
{
    public function showInfo()
    {
        echo "这是一个学生 \n";
    }
}

/**
 * 一个继承于抽象人接口的老师类
 * Class Teacher
 */
class Teacher implements Person
{
    public function showInfo()
    {
        echo "这是一个老师 \n";
    }
}

/**
 * 人类工厂
 * Class PersonFactory
 */
class PersonFactory
{
    public static function factory($person_type)
    {
        // 将传入的类型首字母大写
        $class_name = ucfirst($person_type);

        if(class_exists($class_name)){
            return new $class_name;
        }else{
            throw  new Exception("类:$class_name 不存在",1);
        }
    }
}

// 需要一个学生
$student = PersonFactory::factory('student');
echo $student->showInfo();

// 需要一个老师的时候
$teacher = PersonFactory::factory('teacher');
echo $teacher->showInfo();

связанные с кешем

Разница между Redis и Memcached

  • И Redis, и Memcache хранят данные в памяти, оба являются базами данных в памяти. Но Memcache также может кэшировать другие вещи, такие как изображения, видео
  • Redis не только поддерживает простые данные типа k/v, но также обеспечивает хранение таких структур данных, как список, набор и хэш.
  • Виртуальная память, когда заканчивается физическая память, Redis может подкачивать некоторые значения, которые давно не использовались, на диск
  • Политика истечения срока действия, memcache указывается в установленное время, напримерset key1 0 0 8То есть он никогда не истекает, а redis может быть установлен по истечении срока действия, например:expire name 10
  • Распределенный, настройте кластер memcache, используйте magent в качестве одного главного и нескольких подчиненных; Redis также может быть одним ведущим и несколькими подчиненными.
  • Хранилище в безопасности, после зависания memcache данные пропадают, redis можно регулярно сохранять на диск (persistence)
  • Аварийное восстановление, данные не могут быть восстановлены после зависания memcache, данные redis можно восстановить через aof после потери данных
  • Redis поддерживает резервное копирование данных, то есть резервное копирование данных в режиме master-slave.
  • Сценарии применения разные: помимо базы данных nosql, Redis также можно использовать для очередей сообщений, стеков данных и кэшей данных. Memcache подходит для кэширования операторов SQL, наборов данных, временных данных пользователя, данных и сеансов отложенных запросов и т. д.

Какие структуры данных есть у Redis

  • String
    Строковый тип — это самая основная структура данных Redis.Во-первых, ключ — это строковый тип, а несколько других структур построены на основе строкового типа.
    Тип строки на самом деле может быть строкой, числом, двоичным (изображение, аудио), а максимальный размер не может превышать 512 МБ.
    используемые сцены:

    1. тайник
      Самый классический сценарий использования строк — это Redis в качестве уровня кеша и mysql в качестве уровня хранения.Большая часть запрашиваемых данных получается из Redis.Поскольку Redis обладает характеристиками поддержки высокого параллелизма, кеш обычно может ускорить чтение и запись и уменьшить бэкэнд Эффект давления
    2. прилавок
      Многие приложения будут использовать Redis в качестве основного инструмента технологии, который может реализовать функции быстрой технологии и кэширования запросов.
    3. общий сеанс
      С учетом балансировки нагрузки распределенная служба будет балансировать доступ к пользовательской информации на разных серверах.Если пользователь обновит доступ один раз, ему нужно будет снова войти в систему.Чтобы избежать этой проблемы, можно использовать Redis для централизованного управления В этом режиме, если гарантируется высокая доступность и масштабируемость Redis, каждый раз, когда пользователь обновляет или запрашивает данные для входа, они получаются непосредственно от Redis.
    4. Ограничение скорости
      В целях безопасности пользователю предлагается вводить проверочный код мобильного телефона при каждом входе в систему. Во избежание частого доступа к интерфейсу SMS частота получения проверочного кода в минуту будет ограничена.
  • Hash
    В Redis тип хэша означает, что сам ключ представляет собой структуру пары ключ-значение, напримерvalue = {{field1,value1}...{fieldn,valuen}}
    используемые сцены:

    1. Хэш-структура более интуитивно понятна, чем информация кэша сериализации строк, и она более удобна для операций обновления.
  • list
    Тип списка используется для хранения нескольких упорядоченных строк. Каждая строка в списке становится элементом. Список может хранить до 2 элементов в степени 32 минус 1. В Redis вы можете вставлять (push) и выталкивать (pop) в список, а также можете получить список элементов в указанном диапазоне. Список — это относительно гибкая структура данных, которая может действовать как стек и очередь.
    используемые сцены:

    1. очередь сообщений
      редисlpush+brpopОчередь блокировки может быть реализована комбинацией команд.Клиент-производитель используетlpushВставьте элементы слева от списка, используемые несколькими клиентами-потребителями.brpopКоманда блокирует элементы в конце списка, а несколько клиентов обеспечивают высокую доступность балансировки потребляемой нагрузки.
    2. Список советов

      lpush+lpop=Stack(栈)
      lpush+rpop=Queue(队列)
      lpush+ltrim=Capped Collection(有限集合)
      lpush+brpop=Message Queue(消息队列)
  • set
  • sortedset

Является ли Redis однопоточным и почему?

Поскольку ЦП не является узким местом Redis, узким местом Redis, скорее всего, является машинная память или пропускная способность сети. Так как однопоточность легко реализовать и ЦП не станет узким местом, логично принять однопоточное решение на долгое время.

Конечно, один процесс Redis не может использовать несколько ядер, но это не очень ресурсоемкий сервис. Если производительности одного ядра недостаточно, можно открыть еще несколько процессов.

Метод развертывания redis, master-slave, cluster

Справочная статья:segmentfault.com/a/11...

Sentinel режим Redis

Справочная статья:www.cnblogs.com/xifen...

Стратегия сохранения Redis

  • RDB (сохранение моментальных снимков)
  • AOF (сохранение файла только для добавления)

Справочная статья:segmentfault.com/a/11...

Основы PHP

  1. Разница между двойными кавычками и одинарными кавычками

    • Двойные кавычки объясняют переменные, одинарные кавычки не объясняют переменные
    • Вставьте одинарные кавычки в двойные кавычки. Если в одинарных кавычках есть переменная, переменная будет объяснена
    • За именем переменной в двойных кавычках должен следовать специальный символ, отличный от цифры, буквы или символа подчеркивания, или оно должно быть заключено в {}, иначе часть, стоящая за именем переменной, будет рассматриваться как целое, что приведет к синтаксической ошибке.
    • Используйте одинарные кавычки как можно чаще для одинарных кавычек, одинарные кавычки более эффективны, чем двойные кавычки
  2. Разница между методами отправки GET и POST

    • GET генерирует один TCP-пакет, POST генерирует два TCP-пакета;
      Для запросов GET браузер отправляет заголовок http и данные вместе, а сервер отвечает 200 (возвращает данные).
      Для POST браузер сначала отправляет заголовок, сервер отвечает 100 continue, браузер отправляет данные, а сервер отвечает 200 ok (возвратные данные).
    • GET безвреден, когда браузер отступает, а POST снова отправляет запрос
    • Запросы GET будут активно кэшироваться браузером, а запросы POST — нет, если только они не установлены вручную.
    • Параметры запроса GET будут полностью сохранены в истории браузера, а параметры POST не будут сохранены.
    • Запросы GET могут быть закодированы только в URL-адресе, а POST поддерживает несколько методов кодирования.
    • GET менее безопасен, чем POST, потому что параметры отображаются непосредственно в URL-адресе, поэтому его нельзя использовать для передачи конфиденциальной информации.
  3. Как получить реальный ip клиента
    $_SERVER['REMOTE_ADDR'] или getenv('REMOTE_ADDR')
    можно использоватьip2long()преобразовать в числа
  4. Разница между include и require
    require является безусловным включением, т. е. если require добавляется в процесс, то require будет выполняться первым независимо от того, истинно условие или нет. выполнение программы будет прекращено.
    у include есть возвращаемое значение, а у require нет (может быть из-за этого require быстрее, чем include), если подключаемый файл не существует, будет выдано сообщение об ошибке, но программа продолжит выполнение

    Примечание: требование является фатальным, если включаемый файл не существует или имеет синтаксическую ошибку, а включение не является

  5. В чем преимущества AJAX
    Ajax — это технология асинхронной передачи, которую можно реализовать с помощью javascript или платформы JQuery для обеспечения частичного обновления, снижения нагрузки на сервер и улучшения взаимодействия с пользователем.
  6. Как повысить эффективность программы при разработке программы

    • Оптимизируйте оператор SQL, постарайтесь не использовать select * в операторе запроса и используйте какое поле для проверки какого поля;
    • Меньшее использование подзапросов можно заменить соединениями таблиц;
    • Используйте менее нечеткие запросы;
    • Создайте индекс в таблице данных;
    • Генерировать кеш для часто используемых данных в программе;
  7. Разница между SESSION и COOKIE

    • Место хранения: сессия хранится на сервере, куки хранятся в браузере
    • Безопасность: безопасность сеанса выше, чем cookie
      Ссылка на ссылку:www.zhihu.com/questio...
  8. Разница между isset и empty

    • Функция isset() обычно используется для определения того, установлена ​​ли переменная.
      Возвращает FALSE, если переменная не существует
      Также возвращает FALSE, если переменная существует и ее значение равно NULL.
      Возвращает TRUE, если переменная существует и значение не равно NULL.
    • Функция empty() проверяет, пуста ли переменная.
      Возвращает TRUE, если переменная не существует
      Возвращает TRUE, если переменная существует и ее значение равно "", 0, "0", NULL, , FALSE, array(), var $var; и объект без каких-либо свойств
      Возвращает FALSE, если переменная существует и значение не равно "", 0, "0", NULL, , FALSE, array(), var $var; и объект без каких-либо атрибутов
  9. База Данных Три Парадигмы

    • Первая нормальная форма: 1NF — это атомарное ограничение на атрибуты, которое требует, чтобы атрибуты были атомарными и неразложимыми;
    • Вторая нормальная форма: 2НФ — уникальное ограничение на запись, требующее, чтобы запись имела уникальный идентификатор, то есть уникальность сущности;
    • Третья нормальная форма: 3NF — это ограничение на избыточность полей, то есть ни одно поле не может быть получено из других полей, и это требует, чтобы поля не имели избыточности.
  10. Разница между первичным ключом, внешним ключом и индексом

    • определение
      Первичный ключ — однозначно идентифицирует запись, не может иметь дубликатов и не может быть пустым.
      Внешний ключ — внешний ключ таблицы является первичным ключом другой таблицы, внешний ключ может иметь дубликаты и может быть нулевым.
      Индекс -- поле не имеет повторяющихся значений, но может иметь нулевое значение.
    • эффект
      Первичный ключ — используется для обеспечения целостности данных.
      Внешние ключи — используются для установления связей с другими таблицами.
      Индекс - для повышения скорости сортировки запросов
    • номер
      Первичный ключ - может быть только один первичный ключ
      Внешние ключи — таблица может иметь несколько внешних ключей.
      Индексы — таблица может иметь несколько уникальных индексов.
  11. Разница между кучей и стеком
    Стек — это пространство памяти, выделяемое во время компиляции, поэтому ваш код должен иметь четкое определение размера стека;
    Куча — это область памяти, которая динамически выделяется во время выполнения программы.Вы можете определить размер выделяемой памяти кучи в соответствии с работой программы.

Компоновщик пакетов PHP и спецификации автозагрузки

Адрес обучения композиторов:docs.phpcomposer.com/0...

Отображение автозагрузки в composer.json

В настоящее времяPSR-0автозагрузка,PSR-4автозагрузка,classmapгенерировать иfilesИмпорт поддерживается,PSR-4является предпочтительным методом, поскольку он обеспечивает большую простоту использования.

  • PSR-4
    PSR-4 указывает, как указать путь к файлу для автоматической загрузки класса, а также указывает расположение автоматически загружаемого файла. На первый взгляд это дубликат PSR-0, но на самом деле некоторое дублирование функций действительно имеет место. Разница в том, что спецификация PSR-4 относительно чистая, удаляя контент, совместимый с предыдущими версиями PHP 5.3.
    Самая большая разница между PSR-4 и PSR-0 заключается в том, что определение символа подчеркивания отличается.В PSR-4 использование символов подчеркивания в именах классов не имеет особого значения, в то время как в правилах PSR-0 символы подчеркивания преобразуются в символ разделения каталогов

    Под ключом PSR-4 вы можете определить сопоставление между пространствами имен и путями при автозагрузке таких классов, какFoo\\Bar\\BazКогда пространство именFooуказывает наsrc/каталог означает, что автозагрузчик будет искать каталог с именемsrc/Bar/Baz.phpфайл и цитируйте его.

    Префикс пространства имен должен начинаться с\\end, чтобы избежать конфликтов между похожими префиксами. Во время установки и обновления все ссылки PSR-4 объединяются в одну.key=>valueмассив, который можно найти в сгенерированном файлеvendor/composer/autoload_psr4.phpнайти в.

    пример:

    {
      "autoload": {
        "psr-4": {
          "App\\": "App/" // 命名空间App映射到目录App
        }
      }
    }
  • classmap
    classmapВсе комбинации ссылок будут созданы во время установки и обновления и сохранены вvendor/composer/autoload_classmap.phpв файле.
    Вы можете использовать classmap для создания не следующей поддержки для пользовательской загрузкиPSR-4Библиотека канонических классов, чтобы настроить каталог, на который она указывает, чтобы можно было точно искать файл класса.

    пример:

    {
      "autoload": {
        "classmap": ["src/", "lib/", "Something.php"]
      }
    }
  • Files
    Если вы хотите явно указать, что определенные файлы должны загружаться при каждом запросе, вы можете использоватьfilesПолевая загрузка. Обычно используется как метод загрузки библиотеки функций.

    пример:

    {
      "autoload": {
        "files": ["src/MyLibrary/functions"]
      }
    }

PHP-фреймворк

связанные с Laravel

Связанный с интерфейсом

JavaScript

VueJS

  • Принцип двусторонней привязки данных VueJ

Linux

Корс перекрестный домен

Основной принцип CORS — сообщить браузеру, что запрос является законным, установив HTTP-запрос и вернув заголовок. Это включает настройки как на стороне сервера, так и на стороне браузера: инициирование запроса (заголовок HTTP-запроса) и правильный ответ сервера на запрос (заголовок ответа HTTP).

Справочная статья:zhuanlan.zhihu.com/p/...