• 面试题

  • mysql 索引背后的数据结构及算法原理

  • 分布式,负载均衡
  • 排序算法
  • 设计模式

  • linux 命令

  • 正则出字符串中的 ip

    ((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)
  • cookie 和session 的区别

    • cookie数据存放在客户的浏览器上,session数据放在服务器上。
    • cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
    • session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能 考虑到减轻服务器性能方面,应当使用COOKIE。
    • 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
  • session 存储机制

    • php中的session中的内容并不是放在内存中的,而是以文件的方式来存储的,存储方式就是由配置项session.save_handler来进行确定的,默认是以文件的方式存储。
      // 在php.ini中的配置项
      session.save_path=""   --设置session的存储路径
      session.save_handler="" --设定用户自定义存储函数,如果想使用PHP内置会话存储机制之外的可以使用本函数(数据库等方式)
      session.auto_start   boolen --指定会话模块是否在请求开始时启动一个会话,默认为0不启动
      session.serialize_handler   string --定义用来序列化/反序列化的处理器名字。默认使用php
  • session 的同步

    • 问题所在:多台服务器,用户在A服务器上登录了,存入 session 信息,然后访问网站的某些页面没准跳到B服务器上去了,如果这个时候B服务器上没有 session 信息又没有做特殊处理,可能就会出问题了。
    • 解决方法:
      • 是存储在memcached或者MySQL中,那就很容易了,指定到同样的位置即可,如果是文件形式的,你可以用NFS统一存储。
      • 通过加密的cookie来实现,用户在A服务器上登录成功,在用户的浏览器上种上一个加密的cookie,当用户访问B服务器时,检查有无session,如果有当然没问题,如果没有,就去检验cookie是否有效,cookie有效的话就在B服务器上重建session。
      • 在负载均衡那一层保持会话,把访问者帮定在某个服务器上,他的所有访问都在那个服务器上就不需要session同步了,这些都是运维层面的东西。
  • 什么是 MVC ?

    • MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式。
    • MVC把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
    • MVC的目的是实现一种动态的程序设计,便于后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。
    • 除此之外,此模式通过对复杂度的简化,使程序结构更加直观。
    • MVC各部分的职能:
      • 模型Model – 管理大部分的业务逻辑和所有的数据库逻辑。模型提供了连接和操作数据库的抽象层。
      • 控制器Controller - 负责响应用户请求、准备数据,以及决定如何展示数据。
      • 视图View – 负责渲染数据,通过HTML方式呈现给用户。
    • MVC流程图 image
    • 一个典型的Web MVC流程:
      • Controller截获用户发出的请求;
      • Controller调用Model完成状态的读写操作;
      • Controller把数据传递给View;
      • View渲染最终结果并呈献给用户。
    • 附: 摘自 http://www.awaimai.com/128.html
  • 什么是 ORM ?

    • ORM:object relation mapping,即对象关系映射,简单的说就是对象模型和关系模型的一种映射。为什么要有这么一个映射?很简单,因为现在的开发语言基本都是oop的,但是传统的数据库却是关系型的。为了可以靠贴近面向对象开发,我们想要像操作对象一样操作数据库。
  • HTTP 状态码

    • 1xx: 信息
    • 2xx: 成功
      • 200 OK 请求成功(其后是对GET和POST请求的应答文档。)
    • 3xx: 重定向
      • 301 Moved Permanently 所请求的页面已经转移至新的url。
      • 302 Found 所请求的页面已经临时转移至新的url。
      • 304 Not Modified 表示资源未被修改
    • 4xx: 客户端错误
      • 400 Bad Request 服务器未能理解请求。
      • 401 Unauthorized 被请求的页面需要用户名和密码。
      • 403 Forbidden 对被请求页面的访问被禁止。
      • 404 Not Found 服务器无法找到被请求的页面。
      • 405 Method Not Allowed 请求行中指定的请求方法不能被用于请求相应的资源
    • 5xx: 服务器错误
      • 500 Internal Server Error 请求未完成。服务器遇到不可预知的情况。
      • 502 Bad Gateway 请求未完成。服务器从上游服务器收到一个无效的响应。
      • 503 请求未完成。服务器临时过载或当机。
      • 504 Gateway Timeout 网关超时。
    • 可参考
  • 访问一个网页经历了哪些过程

    1. 根据域名查询域名的IP。浏览器缓存->操作系统缓存->本地域名服务器缓存->域名服务器。
    2. 得到IP后发起基于TCP的HTTP请求。如果浏览器存储了该域名下的cookie,那么会把cookie放入HTTP请求头里。
    3. TCP被包装为IP包,通过网络(可能经过很多路由器、交换机)发送到IP地址对应的服务器。这个服务器可能只是一个反向代理服务器,如果是,则HTTP请求被转交给内网中真实的某一个服务器(可能有多个服务器)。
    4. 服务器分析HTTP请求,生成HTTP响应(可能是HTML、图片等)后,将响应发送给客户端浏览器。
    5. 浏览器得到响应后,根据响应内容显示结果。如果响应的是图片,则将图片”画“在浏览器页面上;如果是HTML,则渲染HTML并”画“在浏览器页面上,在分析HTML时,若发现引用了其他资源,例如css、图片等,则发起HTTP请求,得到响应资源。
      • 有待优化
  • Http Header

    • Accept 能够接受的回应内容类型(Content-Types)。参见内容协商。 Accept: text/plain
    • Accept-Charset 能够接受的字符集 Accept-Charset: utf-8
    • Accept-Encoding 能够接受的编码方式列表。参考HTTP压缩。 Accept-Encoding: gzip, deflate
    • Accept-Language 能够接受的回应内容的自然语言列表。参考 内容协商 。 Accept-Language: en-US
    • Accept-Datetime 能够接受的按照时间来表示的版本 Accept-Datetime: Thu, 31 May 2007 20:35:00 GMT
    • Authorization 用于超文本传输协议的认证的认证信息 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
    • Cache-Control 用来指定在这次的请求/响应链中的所有缓存机制 都必须 遵守的指令
    • Connection 该浏览器想要优先使用的连接类型 Connection: keep-alive Connection: Upgrade
    • Cookie 之前由服务器通过 Set- Cookie (下文详述)发送的一个 超文本传输协议Cookie Cookie: $Version=1; Skin=new;
    • Content-Length 以 八位字节数组 (8位的字节)表示的请求体的长度 Content-Length: 348
    • Content-MD5 请求体的内容的二进制 MD5 散列值,以 Base64 编码的结果 Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==
    • Content-Type 请求体的 多媒体类型 (用于POST和PUT请求中) Content-Type: application/x-www-form-urlencoded
    • Date 发送该消息的日期和时间(按照 RFC 7231 中定义的"超文本传输协议日期"格式来发送) Date: Tue, 15 Nov 1994 08:12:31 GMT
    • Host 服务器的域名(用于 虚拟 主机 ),以及服务器所监听的 传输控制协议端口 号。如果所请求的端口是对应的服务的标准端口,则 端口 号可被省略。自超文件传输协议版本1.1(HTTP/1.1)开始便是必需字段。Host: en.wikipedia.org:80 Host: en.wikipedia.org
    • 详情查看: 维基百科:HTTP头字段列表
  • XML,JSON 格式,SOAP/WebService 了解点更好
    • XML(Extensible Markup Language)是一种用来编码文档的标记语言,人和机器都能够快速理解XML文档的含义。它的其中一个目标就是能在互联网上广泛应用,现在XML已经被广泛地应用在各种应用、WEB服务和网站中。   - JSON(JavaScript Object Notation)是一种轻量级的数据格式,它以”name / value”的格式来传输数据对象,JSON的目的就是为了能替代XML,现在也有很多编程语言支持JSON格式了。   
  • PHP 中的Session 要如何確保其效率

  • PHP的垃圾收集机制是怎样的?

    • PHP 作为脚本语言是页面结束即释放变量所占内存的。
    • 当一个 PHP 线程结束时,当前占用的所有内存空间都会被销毁,当前程序中所有对象同时被销毁。
    • GC进程一般都跟着每起一个SESSION而开始运行的.gc目的是为了在session文件过期以后自动销毁删除这些文件。
    • 在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾。PHP会将其在内存中销毁;这是PHP 的GC垃圾处理机制,防止内存溢出。
    • 执行这些函数也可以起到回收作用 __destruct /unset/mysql_close /fclose
    • php对session有明确的gc处理时间设定 session.gc_maxlifetime
    • 如果说有垃圾,那就是整体的程序在框架使用中,会多次调用同一文件等等造成的非单件模式等。所以在出来的时候,必要的用_once 引用,在声明类的时候使用单件模式。还有简化逻辑等等。
    • 如果妄想让PHP自己本身管理内存,进行垃圾管理。呵呵。好像PHP还办不到,对于析构函数,ANDI在他的书里写的很明白。可有可无,不可置否。而内存管理的东西一般都是桌面程序更多去考虑的。
  • PHP网站的主要攻击方式有哪些?

    • 命令注入(Command Injection)
    • eval 注入(Eval Injection)
    • 客户端脚本攻击(Script Insertion)
    • 跨网站脚本攻击(Cross Site Scripting, XSS)
    • SQL 注入攻击(SQL injection)
    • 跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)
    • Session 会话劫持(Session Hijacking)
    • Session 固定攻击(Session Fixation)
    • HTTP 响应拆分攻击(HTTP Response Splitting)
    • 文件上传漏洞(File Upload Attack)
    • 目录穿越漏洞(Directory Traversal)
    • 远程文件包含攻击(Remote Inclusion)
    • 动态函数注入攻击(Dynamic Variable Evaluation)
    • URL 攻击(URL attack)
    • 表单提交欺骗攻击(Spoofed Form Submissions)
    • HTTP 请求欺骗攻击(Spoofed HTTP Requests)
  • 框架中什么是单一入口和多入口 , 单一入口的优缺点?

    • 多口就是通过访问不同的文件来完成用户请求。单一入口只 web 程序所有的请求都指向一个脚本文件的。
    • 单一入口更容易控制权限,方便对 http 请求可以进行安全性检查。缺点:URL 看起来不那么美观,特别是对搜索引擎来说不友好。
  • 如何获取客户端的ip(要求取得一个int)和服务器ip的代码

    • 客户端:$_SERVER["REMOTE_ADDR"];或者getenv('REMOTE_ADDR') ip2long进行转换
    • 服务器端:gethostbyname('www.baidu.com')
  • 为数据表建立索引的原则有哪些?

    • 在最频繁使用的、用以缩小查询范围的字段上建立索引。
    • 在频繁使用的、需要排序的字段上建立索引
  • 什么情况下不宜建立索引?

    • 对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。
    • 对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等。
  • 索引缺点

    • 首先,索引要占用磁盘空间。通常情况下,这个问题不是很突出。但是,如果你创建每一种可能列组合的索引,索引文件体积的增长速度将远远超过数据文件。如果你有一个很大的表,索引文件的大小可能达到操作系统允许的最大文件限制。

    • 第二,对于需要写入数据的操作,比如DELETE、UPDATE以及INSERT操作,索引会降低它们的速度。这是因为MySQL不仅要把改动数据写入数据文件,而且它还要把这些改动写入索引文件。
  • 什么是面向对象?主要特征是什么?几大原则是什么?

    • 面向对象是程序的一种设计模式,它利于提高程序的重用性,使程序机构更加清晰。 主要特征是:封装、继承、多态。
    • 五大基本原则:
      1. 单一职责原则;一个类,最好只做一件事,只有一个引起它的变化。
      2. 开放封闭原则;软件实体应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。
      3. 替换原则。 子类必须能够替换其基类。
      4. 依赖原则。依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。
      5. 接口分离原则。使用多个小的专门的接口,而不要使用一个大的总接口。
  • Memcache与Redis的区别都有哪些?

    1. 存储方式:

      • Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。
      • Redis有部份存在硬盘上,这样能保证数据的持久性。
    2. 数据支持类型

      • Memcache对数据类型支持相对简单。
      • Redis有复杂的数据类型。
    3. 使用底层模型不同
      • 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
  • 您写过的PHP框架的特点,主要解决什么问题,与其他框架的不同点。

  • 你如何理解的面向对象编程(什么是面向对象)

    • 把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象归纳为类(class),通过类的封装(encapsulation)隐藏内部细节,通过继承(inheritance)实现类的特化(specialization)/泛化(generalization),通过多态(polymorphism)实现基于对象类型的动态分派(dynamic dispatch)。
  • seo 是什么?

    • 搜索引擎优化(Search Engine Optimization,简称 SEO)是一种利用搜索引擎的搜索规则来提高目的网站在有关搜索引擎内的排名的方式。
  • Myql中的事务回滚机制概述

    • 事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销。
    • 要同时修改数据库中两个不同表时,如果它们不是一个事务的话,当第一个表修改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依旧是未修改之前的状态,而第一个表已经被修改完毕。而当你把它们设定为一个事务的时候,当第一个表修改完,第二表修改出现异常而没能修改,第一个表和第二个表都要回到未修改的状态,这就是所谓的事务回滚。
  • PHP为什么不安全。主要有那些安全问题
  • 开发过程中你觉得最难的是什么
  • 如何对一个亿级数据的表按照一个没有索引的字段进行统计

  • redis , 消息队列

  • Mysql哪几种类型的存储引擎,各有什么优缺点

  • PHP如何防止注入

  • 自己独立做过什么成熟的产品吗

  • 你认为的一般性系统瓶颈出现在哪些地方?缓存,数据库,php,前台。如何优化他们。额外:SEO,网站分析,用户体验。

  • 一个包含中英文的字符串如何获得它的自然长度

  • 实现一个framework,怎么设计

  • 对Design Pattern的认知,Singleton,Observer,Factory等常用的设计模式

前端

  • W3C标准是什么?

    • 是一系列网页标准的集
    • 网页主要由三部分构成:结构、表现和行为
      • 结构标准语言:XML 和 XHTML
      • 表现标准语言: CSS
      • 行为标准:文档对象模型(Document Object Model,简称DOM)和 ECMAScript
  • 什么是DOCTYPE

    • DOCTYPE是document type(文档类型)的简写,用来说明你用的XHTML或者HTML是什么版本。
    • 早期网页设计中,并不是所有网页代码都遵循标准进行编写,所有现代浏览器中都拥有不同的呈现模式,这样一来,浏览器不仅能正常解析标准的文档,也能解析老式的、不符合标准的网页。浏览器会根据 DOCTYPE 声明进入正确的呈现模式.呈现模式分为以下三种:
      • Standards(标准)模式:遵循最新标准。
      • Quirks(怪癖/兼容)模式:帮助处理所有奇怪的渲染和非浏览器兼容及不符合标准的网页。
      • Almost Standards(近似标准)模式:针对标准的某个老版本设计的网页。
  • 如何隐藏超出对象部分的内容。

非技术

  • 您在前一家公司的离职原因是什么?

  • 你觉得你和其他人比你的优势是什么