php面试中常被问到的问题--欢迎留言补充

整理自己的项目 -- 问到的概率大
问项目的具体内容,遇到的挑战,具体解决办法。
为什么使用独立文件服务器?
    1,从服务器本身来说,单台的话会加大机器IO负载,多台( 负载均衡 )的话涉及到文件同步的问题
    2,浏览器对一个域名下的并发是有数量限制的,独立域名的文件服务器会加快响应
    3,防止域名污染,请求图片的时候是不用带上cookie
memcache与redis的区别,redis的优势之处。怎样解决memcache命中率低的问题,问了在实际项目中memcache命中率。
    redis丰富的数据结构,支持持久化,支持同步。提供命中率一般都是把数据细粒度化,分级组合缓存。
    memcache命中率查看:telnet连接上去 执行status命令 get_hits/cmd_get * 100%
    https://yq.aliyun.com/articles/48955
svn与git 的区别,让说具体的工作流程,使用git 的好处,以及怎样处理冲突,基本的命令写了两个。
    最核心的区别Git是分布式的,而Svn不是分布的
数据库的存储引擎,myisam与innodb的区别,说出除了这两种外的其他存储引擎。
    区别:索引,事务,结构
    tokuDB,memory等
int 与bigint的区别,实际使用的时候主键选择哪个?int(10)与int(11)的区别,varchar与char的区别
    长度不一样,看情况数据多久使用bigint。 int(10) / int(11) 后面这个括号里的数字是显示长度,不会影响到存储,有zerofill的
    时候才有区别。varchar是变长 char是定长。
数据库设计,用户表与登录表分开的好处,
    冷热数据分开,提高速度因为活跃用户只是总用户的一小部分,
session与cookie的区别
分布式怎样解决session共享问题
  存储在独立的共享空间中(mysql,redis,memcache)
get与post的区别
  GET的语义是请求获取指定的资源。GET方法是安全、幂等、可缓存的(除非有     
  Cache-ControlHeader的约束),GET方法的报文主体没有任何语义。POST的语义是根据请求负荷(报文主体)对指定的资源做出处
  理,具体的处理方式视资源类型而不同。POST不安全,不幂等,(大部分实现)不可缓存。为了针对其不可缓存性,有一系列的
  方法来进行优化,以后有机会再研究(FLAG已经立起)。
php __autoload机制
  调用不存在的类的时候自动调用该函数,该函数内部实现通过类名(参数)查找类文件的方法
三次握手与四次挥手的过程(主要是画图),各个参数的含义
   SYN    SYN+ACK   ACK
http与https的区别,https怎样保准安全(结合ssl)
   http://www.jianshu.com/p/b894a7e1c779
   http://wetest.qq.com/lab/view/110.html
   http://www.barretlee.com/blog/2016/04/24/detail-about-ca-and-certs/
链表的结构体(线性和链式),插入一个元素的操作代码(纸上写)

排序部分,时间复杂度,写出一个排序算法。

二分查找的思想,时间复杂度
  
apache与ngiax的区别

nginx性能高,这得益于Nginx使用了最新的epoll(Linux2.6内核)和kqueue(freebsd)网络I/O模型,而Apache则使用的是传统的select模型。目前Linux下能够承受高并发访问的Squid、Memcached都采用的是epoll网络I/O模型。

apache基于进程,nginx基于线程
有一个ip日志文件每行一个ip,统计某一个ip出现的次数
    cat file |grep ip |wc -l
mysql的索引是那种数据结构,为什么使用这种数据结构。
    B+树
    B树的各种操作能使B树保持较低的高度,从而达到有效避免磁盘过于频繁的查找存取操作,从而有效提高查找效率
    http://blog.codinglabs.org/articles/theory-of-mysql-index.html
设计一个数据表,用来存储url信息,此表会经常发生插入删除操作,应用场景是查找某个url是否存在,请写出表结构,并加说明。
    id url md5
    md5列加索引,url长度普遍偏长,域名重复度高,前缀索引在这种场景下不太好,使用MD5 char 固定长度索引
比较单词a 和 b判断b单词的字母是否都在a中。
    $a = 'abc';
    $b = 'defc';
    
    $arr = str_split($a . $b);
    
    if (count($arr) != count(array_unique($arr))) {
        echo 'repeat';
    } else {
        echo 'no repeat';
    }
写一个timer类,用来统计应用程序的运行时间,并写出调用方法。
    class timer {
        private $checkPoint = [];
    
        public function __construct() {
            $this->checkPoint[] = time();
        }
    
        public function check() {
            $this->checkPoint[] = time();
        }
    
        public function show() {
            foreach ($this->checkPoint as &$item) {
                echo $item . PHP_EOL;
            }
        }
    }
    
    $time = new timer();
    sleep(2);
    $time->check();
    sleep(4);
    $time->check();
    sleep(3);
    $time->show();
新浪微博一年产生的数据量是多少,应该怎么存储这些数据。
    历史数据归档, 使用压缩比高的引擎比如tokudb
状态吗:204,304,404的含义,可以参考(http://tool.oschina.net/commons?type=5)
介绍你了解的开源项目

索引的最左原则,可以参考(http://blog.csdn.net/shangxiaoxue/article/details/7514187)
    针对联合索引的
浏览器输入url到页面呈现,经过的过程, 和用到的协议
mc 与 redis的区别,内存管理方面。
    http://www.voidcn.com/article/p-nletigkh-yx.html
    都是提前申请一大块内存,mc是把这块内存切成大小不一的块(通过增长因子),会有内存浪费,但是存取快
    redis是把这块内存的大小存在内存开始处,通过指针操作
微博中reids的应用场景,redis的内存分配机制,为什么使用redis不适用MC,mc与redis的并发哪个较高
    mc并发高,它是多线程的
array_map() 的使用场景,array_merge(),合并数组之后的键名变换情况
    array_map() 为数组每一个元素应用回调函数
    array_merge() 数字键不会覆盖   字符串键会覆盖
php几个编码函数区别(json_encode, http_build_query, urlencode等区别)
    json_encode  把数组转成json
    http_build_query 数组转查询字符串
    urlencode url编码 -_.之外的都转换为%加连个数字空格转+号
正则表达式中 . * + / ? 的含义
    
    ? 0 个或1个
    * 表示0到多个
    + 表示1到多个
    . 匹配除换行符外的所有单个的字符
    / 定界
给定一个数字,2进制转换成16进制
    http://www.cnblogs.com/gaizai/p/4233780.html#_labelConvert33
打印前一天的日期时间格式:2016.03.18 10:15:12,打印上个月的最后一天的日期
    function getPrevMonthFirstDay($date) { 
        return date('Y-m-d', strtotime(date('Y-m-01', $date) . ' -1 month')); 
    } 
    
    function getPrevMonthLastDay($date) { 
        return date('Y-m-d', strtotime(date('Y-m-01', $date) . ' -1 day')); 
    } 
PHP发送请求的方法,有什么不同点
    curl  file_get_content
写出10个mysql 的字段类型,说明使用场景

一个数据表,70个字段,10G的数据量,每天50w的数据增量,说出有哪些优化的方法
    拆字段
    10天一分区 或者 分表
写一个定时任务,每天2点到8点,每隔10分钟调用一次PHP脚本 /data/www/test.php
    */10 2-8 * * *
    
使用正则表达式判断ip的合法性,要考虑全面

redis中数据存储方式,各种数据结构应用的场景,redis做消息队列与专业的消息队列有什么区别和优势
    redis队列是轻量级的队列,不支持消息持久化
你对GO语言的理解,速度快吗?快在哪?

抓取 a.html页面,把含有a便签中的href全部抓取,如果url含有guazi.com就把该条url标题上guazi,然后再抓取该链接对应的页面,这样不断的遵化你抓取,你怎样解决死循环问题和页面抓取效率问题
一个日志文件,打印某一时刻的并发数(记录日志的条数)

一个数组按照固定的值排序(按照id排序)
$a = [
  ['abc'] => ['id' => 1, 'value' => 233],
  ['bcd'] => ['id' => 2, 'value' => 463]
]

数据库索引建立的原则

打印日志文件中,出现最多的前100个IP

php 和其他语言不同的地方,PHP中弱类型的实现

C语言中结构体和共用体的区别,每个占用做少内存(二者已给出)

有没有自己写的一些作品,或者开源的东西

秒杀怎么设计,注意点是什么

有没有学习新的东西,比如新的技术,语言


介绍一个最深刻的项目,说出技术点

coding:一个数组 0 - n-1,已经排好序,打印出满足 a[i]+a[j] = c 的所有i和j,说出时间复杂度

以后有什么打算,学习的目标或者是自己的规划目标

1、写一个类,一个单例类,输入两个数组,$arr1, $arr2,每个数组中存有整数(0-9),这个类提供两个方法,一个是排序$arr1,一个是把两个数组当成两个大数然后进行相减,返回结果(第一个数组如果是[5, 2, 3, 4] ,相当于数字:5234)
数据库中两个笛卡尔积在join中的体现,说出left join的中间过程
网站打开慢的原因和解决办法
讲解项目的架构,redis在项目中的使用情况

数据库事务原理,是否使用过

数据库优化,索引建立原则

数据库事务的含义

redis与MC的区别,redis支持的数据结构有哪些

框架使用,优缺点
是否使用过前端框架,js,jquery是否学习过

给两个数组得到交集,各自的差集

给两张表,得到各自的交集和差集
数据库索引的字段,哪些会用到索引,该怎样查看。
PHP短标签,怎样开启。结束标签有什么影响
    因为php只能运行在php标签里面的脚本,在脚本之外的所有字符,包括你看不见的空格或者回车,制表符号
    都是作为输出内容会response到客户端的。这样就有可能会产生意想不到的事情。比如说joyqi说的问题,
    不过这个还好问题不是很大,但是假如你在一个文件里面使用了header函数,这个文件同时又包含了另外一个文件
    并且被包含的文件的php标签外有空字符,这个时候会报header already send的错误。
div 怎样实现三栏式布局
php 各个框架的应用,php的安全相关
数据库的优化,怎样保证大数据量的数据库访问正常
数据库集群的特点和数据同步的机制
什么是响应式设计
    自适应不同屏幕大小。应用 CSS3 的媒体查询(Media Queries),创建一个包含适应各种设备尺寸样式的 
    CSS。一旦页面在特定的设备上加载,此时,会先检测设备的视口大小,然后加载特定于设备的样式。即为不同的媒体类型设
    定专有的样式表。
js闭包是什么? 
    闭包就是能够读取其他函数内部变量的函数。
    function f1(){
    var n=999;
    function f2(){
      alert(n); 
    }
    return f2;
  }
  var result=f1();
  result(); // 999
  
  一个是前面提到的可以读取函数内部的变量
  另一个就是让这些变量的值始终保持在内存中。
mysql与mysqli的区别有哪些? 
    mysql扩展是最早的一套面向过程的api,支持功能相对比较少
    mysqli 是mysql的增强版,支持面向对象,各种新特性
    pdo是数据驱动层,把数据层和应用层隔离开
php多态是什么?
    多态是指在面向对象中能够根据使用类的上下文来重新定义或改变类的性质和行为。    
    http://www.qttc.net/201208172.html
http状态码:200、202、301、404、500
    网上一查一堆
memcache与mongoDB、Redis各自的使用场景是什么? 
    参考: https://segmentfault.com/q/1010000002588088/a-1020000002589415

    memcache多线程,数据结构简单,适合扛量,数据不可以持久化,不可以同步
    redis单线程,数据结构丰富,支持持久化,同步
    mongodb文档类型存储,适合存储集合类型的数据,如文章评论
    
1条微薄要推送给100万个粉丝该怎么处理? 
    写队列中,根据数量(100万)动态调整消费者
假设给你5台机器,请大致的描述一下,如何使用你所熟悉的开源软件,搭建一个日PV 3万左右的中型网站
    前面2台nginx  中间一个cache   后面一主一从mysql
说说你所了解的搜索引擎包含那些技术?
      爬虫(采集)、切词(分词)、索引(存储)、查询以及其他相关技术
使用过Memcache缓存吗,如果使用过,能够简单的描述一下它的工作原理吗?
       Memcahce是把所有的数据保存在内存当中,采用hash表的方式,
       每条数据又key和value组成,每个key是独一无二的,当要访问某个值的时候先按照找到值,然后返回结果。
       Memcahce采用LRU算法来逐渐把过期数据清除掉。
原型链了不了解?
    http://www.cnblogs.com/shuiyi/p/5305435.html
for与foreach哪个更快?
    foreach是通过GetEnumerator获得一个IEnumerator对象,通过IEnumerator对象执行MoveNext()方法和获取Current属性进行遍历的。
    由于Enumerator中,做了版本检查处理的工作,所以使用foreach是线程安全
    在一些全局的,多线程可以访问的数据结构对象,使用foreach。而对本地变量,则使用for,效率和安全兼顾!
    发现对于10W级以上的数组,foreach效率会更高,但对于1W级的数组,还是for效率高
表设计三大范式
    1.第一范式(确保每列保持原子性)
        所有字段值都是不可分解的原子值
    2.第二范式(确保表中的每列都和主键相关)
        也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
    3.第三范式(确保每列都和主键列直接相关,而不是间接相关)
        每一列数据都和主键直接相关,而不能间接相关。
数据库设计经验,为什么进行分表? 分库?一般多少数据量开始分表? 分库? 分库分表的目的? 什么是数据库垂直拆分? 水平拆分? 分区等等?可以举例说明

    随着数据量增大首先考虑的是分库,按业务把相关模块的表放到一个库中。
    
    数据再大的时候就需要考虑分表(横向,纵向)
    
    分区主要是用于时间顺序明显的场景,比如日志

web开发方面会遇到哪些缓存? 分别如何优化?
    文件缓存,内存缓存,对象缓存
给你256M的内存,对10G的文件进行排序(文件每行1个数字),如何实现?对10G的文件进行查找如何实现?统计10G文件每个关键字出现的次数如何实现?

考察大文件处理  就是文件一下load到内存肯定不行 方法也就是分段读,具体实现也就是下面2中方法,没发现其他方法

方法一:生成器
function getRows($file) {
    $handle = fopen($file, 'rb');
    if ($handle === false) {
        throw new Exception();
    }
    //feof()函数检测是否到达文件末尾
    while (feof($handle) === false) {
        //fgetcsv()一次读取csv文件的一行
        yield fgetcsv($handle);
    }
    fclose($handle)
}

foreach (getRows('data.csv') as $row) {
    print_r($row);
}

方法二:文件指针
从你的经验方面谈一下如何构建高性能web站点? 需要哪些环节? 步骤? 每个步骤需要注意什么如何优化等?

    同上,具体场景具体分析。
为什么要对数据库进行主从分离? 

    因为顺序读写比随机读写快 
如何处理多服务器共享session?

    存储session到memcache、redis中
一个10G的表,你用php程序统计某个字段出现的次数,思路是?

    表指的是文件的话参考上面的生成器做法
    表指的是数据库里的表的话 加上索引 一条SQL没啥问题

会告诉你一个nginx日志例子,用你认为最佳的编程语言统计一下http响应时间超过1秒的前10个url?

    awk
给你两个路径a和b,写一个算法或思路计算a和b差距几层并显示a和b的交集?

给你一个url,在nginx配置一下rewrite指定到某个具体路径?

一个php文件的解释过程是? 一般加速php有哪些?  提高php整体性能会用到哪些技术?

opcache

session和cookie生存周期区别? 存储位置区别?

session存储在服务器位置上,可以通过php.ini里面配置session相关配置
cookie存储在客户端上的上(其实可以分两种:
1,持久性cookie,设置了cookie的时间,以文件方式存在硬盘上,
2,会话cookie,没有设置cookie时间,cookie的生命周期也就是关闭浏览器前就消失,一般不会保存在硬盘,而是保存在内存上)
require、include、require_once、include_once区别? 加载区别? 如果程序按需加载某个php文件你如何实现?

包含的文件有错误
include()会产生一个警告,
require()则导致一个致命的错误(出现错误,脚本停止执行)

对include()语句来说,在执行文件时每次都要进行读取和评估;

include 产生一个 warning ,而 require 直接产生错误中断;
require 在运行前载入;
include 在运行时载入;
require_once 和 include_once 可以避免重复包含同一文件。

chrome号称为多线程的,所以多线程和多进程的区别为?

进程是资源分配最小单位

线程是cpu调度最下单位

同一进程下的线程共享内存数据

php在2011年底出现hash碰撞,hash碰撞原理为? 如何进行修复?

http://blog.codinglabs.org/articles/hash-collisions-attack-on-php.html

前提: php是用单链表解决hash冲突的

原理: 哈希表碰撞攻击就是通过精心构造数据,使得所有数据全部碰撞,人为将哈希表变成一个退化的单链表,此时哈希表各种操作的时间均提升了一个数量级,因此会消耗大量CPU资源,导致系统无法快速响应请求,从而达到拒绝服务攻击(DoS)的目的。

POST攻击
当然,一般情况下很难遇到攻击者可以直接修改PHP代码的情况,但是攻击者仍可以通过一些方法间接构造哈希表来进行攻击。例如PHP会将接收到的HTTP POST请求中的数据构造为$_POST,而这是一个Array,内部就是通过Zend HashTable表示,因此攻击者只要构造一个含有大量碰撞key的post请求,就可以达到攻击的目的。具体做法不再演示。

POST攻击的防护

针对POST方式的哈希碰撞攻击,目前PHP的防护措施是控制POST数据的数量。在>=PHP5.3.9的版本中增加了一个配置项max_input_vars,用于标识一次http请求最大接收的参数个数,默认为1000。因此PHP5.3.x的用户可以通过升级至5.3.9来避免哈希碰撞攻击。5.2.x的用户可以使用这个patch:http://www.laruence.com/2011/12/30/2440.html。

另外的防护方法是在Web服务器层面进行处理,例如限制http请求body的大小和参数的数量等,这个是现在用的最多的临时处理方案。具体做法与不同Web服务器相关,不再详述。

其它防护

上面的防护方法只是限制POST数据的数量,而不能彻底解决这个问题。例如,如果某个POST字段是一个json数据类型,会被PHP json_decode,那么只要构造一个超大的json攻击数据照样可以达到攻击目的。理论上,只要PHP代码中某处构造Array的数据依赖于外部输入,则都可能造成这个问题,因此彻底的解决方案要从Zend底层HashTable的实现动手。一般来说有两种方式,一是限制每个桶链表的最长长度;二是使用其它数据结构如红黑树取代链表组织碰撞哈希(并不解决哈希碰撞,只是减轻攻击影响,将N个数据的操作时间从O(N^2)降至O(NlogN),代价是普通情况下接近O(1)的操作均变为O(logN))。

web不安全因素有哪些? 分别如何防范?

https://zhuanlan.zhihu.com/p/28821512

sql注入

xss

csrf
    
假如两个单链表相交,写一个最优算法计算交点位置,说思路也可以?

    http://www.jianshu.com/p/9a953e4ad2cd

    相交:俩单列表都包含同一个节点(不是节点值相同),那么交点之后的值肯定也是一样的了
    
    单列表无环:
        如果两条单链表相交,则将链表B,连接到链表A后面,如图所示(上面的链表是A,下面的链表是B),会形成环路,且链表B的表头一定在环上。因此我们只需要从链表B开始遍历,如果可以回到链表B的头结点,则说明两条链表相交。
        时间复杂度:O(len(A)+len(B))


        单链表相交,意味着相交结点具有相同的内存地址,且相交结点后的所有结点是两个链表共有的。因此如果两个链表相交,则最后一个节点肯定是相同的,因此只需要判断两个链表的最优一个节点是否相同。
        时间复杂度: O(len(A)+len(B))
nginx负载均衡有哪些? 如果其中一台服务器挂掉,报警机制如何实现?

Nginx负载均衡有4种方案配置
    
    轮询 Round Robin,根据Nginx配置文件中的顺序,依次把客户端的Web请求分发到不同的后端服务器上

    最少连接 least_conn; Web请求会被转发到连接数最少的服务器上。

    IP地址哈希 ip_hash;

    基于权重 weight
    
    fair。这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。

    url_hash。此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。
    
报警机制如何实现,实在不get不到考点,一般这种服务的原理就是俩机器之间有心跳检测,调度服务器收不到心跳就认为宕机就会被踢掉
可以引入监控平台如zabbix,能更好的监控。
nginx设置缓存js、css、图片等信息,缓存的实现原理是?
    一:nginx作为源服务器
    location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
      expires 1M;
      access_log off;
      add_header Cache-Control "public";
    }
    请求直接打到源服务器,会通过配置产生如下的响应头
    HTTP/1.1 200 OK
    Server: nginx/1.4.6 (Ubuntu)
    Date: Fri, 05 Sep 2014 23:25:04 GMT
    Content-Type: text/css
    Last-Modified: Fri, 05 Sep 2014 22:46:39 GMT
    Expires: Sat, 05 Sep 2015 23:25:04 GMT
    Cache-Control: max-age=31536000  过期时间
    Cache-Control: public   谁都可以缓存

    二:nginx作为缓存服务器,在源服务器之前,类似于varnish,可以配置为单纯的转发,下面配置会解析源服务器响应并缓存
    proxy_cache_path /tmp/nginx levels=1:2 keys_zone=my_zone:10m inactive=60m;
    proxy_cache_key "$scheme$request_method$host$request_uri";
    
    server {
        # Note that it's listening on port 80
        listen 80 default_server;
        root /var/www/;
        index index.html index.htm;
    
        server_name example.com www.example.com;
    
        charset utf-8;
    
        location / {
            proxy_cache my_zone;
            add_header X-Proxy-Cache $upstream_cache_status;
    
            include proxy_params;
            proxy_pass http://172.17.0.18:9000;
        }
    }
如何提高缓存命中率? 如何对缓存进行颗粒化?
    细粒度,分层
php的内存回收机制是?
    5.3是引用计数,之后对引用计数做了优化,算法没看懂网上也没找到将明白的文章
    
    1、并不是每次refcount减少时都进入回收周期,只有根缓冲区满额后在开始垃圾回收。
    2、可以解决循环引用问题。
    3、可以总将内存泄露保持在一个阈值以下。
memcache magent 分布式设计?

redis 分布式设计,如何设计?

mongo 集群架构是怎样的?

转载于:https://my.oschina.net/anyeshe/blog/1550238

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值