PHP面试/笔试题杂记 III

这里总结一些高级一点的题

算法

基本排序算法要会写,时间复杂度要会推算, 主要是冒泡排序, 快速排序, 选择排序.
查找算法,要会写二分查找法, 实际场景要会应用.
实例算法思路要明白,基本算法看多了, 我觉得是几种思路的变换, 需要自己领悟.

猴子选大王

一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。用程序模拟该过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

function mk($n, $m)
{
// 构造一个数组
$arr = range(1, $n);
// 从第一个开始循环
$i = 1;
while (count($arr) > 1) {
// 不被踢出则压入数组尾部
($i % $m != 0) && array_push($arr, $arr[$i - 1]);
// 压入数组然后删除
unset($arr[$i - 1]);
// 继续循环
$i++;
}

// 直到剩下一个为大王
return $arr[$i - 1];
}

// 第三只为大王
print_r(mk(6, 8));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

function _mk($n, $m)
{
$arr = range(1, $n);
$i = 0;
while (count($arr) > 1) {
// 遍历数组, 判断当前猴子是否为出局序号,如果是则出局,否则放到数组最后
(($i + 1) % $m != 0) && array_push($arr, $arr[$i]);
unset($arr[$i]);
$i++;
}

return $arr[$i];
}

print_r(_mk(6, 8));

斗地主项目设计

https://github.com/jxy918/ddzpoker/blob/master/DdzPoker.php

实现单链表与双链表

实现有权重的随机算法

PHP知识

说说php的魔术常量, 要能全部说出来

1
2
3
4
5
6
7
__LINE__        文件中的当前行号。
__FILE__   文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名
__DIR__   文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
__FUNCTION__   常量返回该函数被定义时的名字
__CLASS__   常量返回该类被定义时的名字(区分大小写)。
__METHOD__   类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
__NAMESPACE__   当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。

php的设计模式, 要能清晰说出单例, 工厂, 注册模式的实际应用.

设计模式(45 种)

  • 单例模式

使某个类的对象仅允许创建一个

  • 工厂模式

工厂模式 是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。

  • 注册模式

主要用来解决全局共享和交换对象

session与cookie的区别及如何解决session的跨域共享.

  • session sticky: 会话保存在单机上, 保证会话请求落在同一台服务器上
  • session replication: session 复制 每一台服务器上都保持一份相同的session (造成额外的存储开销和网络开销)
  • session 集中存储: 存储在db、 存储在缓存服务器 (redis)
  • 基于cookie (主流)

如何防止sql注入及数据安全问题

php的生命周期, 启动流程, 多看TIPI.

TIPI 深入理解PHP内核: Thinking In PHP Internals

php的垃圾回收机制, php变量,数组 c源代码如何实现.

  • PHP 5 的内存回收原理?

垃圾回收机制

  • PHP 7 的垃圾回收和 PHP 5 有什么区别?

PHP5和PHP7的垃圾回收机制都属于引用计数,但是在复杂数据类型的算法处理上:
在 PHP7 中 zval 有了新的实现方式。最基础的变化就是 *zval 需要的内存不再是单独从堆上分配,不再自己存储引用计数。复杂数据类型(比如字符串、数组和对象)的引用计数由其自身来存储。这种实现方式有以下好处:
简单数据类型不需要单独分配内存,也不需要计数
不会再有两次计数的情况。在对象中,只有对象自身存储的计数是有效的;
由于现在计数由数值自身存储,所以也就可以和非 zval 结构的数据共享,比如 zval 和 hashtable key 之间

  • PHP 7 中哪些变量类型在栈,哪些变量类型在堆?

在PHP5的Zend Engine的实现中,所有的值都是在堆上分配空间,并且通过引用计数和垃圾收集来管理.
PHP5的Zend Engine主要使用指向zval结构的指针来操作值,在很多地方甚至通过zval的二级指针来操作.
而在PHP7的Zend Engine实现中,值是通过zval结构本身来操作(非指针).
新的zval结构直接被存放在VM[虚拟机?]的栈上,HashTable的桶里,以及属性槽里.
这样大大减少了在堆上分配和释放内存的操作,还避免了对简单值的引用计数和垃圾收集.

  • 变量在栈会有什么优势?PHP 7是如何让变量新建在栈的?

fastcgi 比 php-cgi 的优势在哪里?

CGI/FastCGI/PHP-CGI/PHP-FPM 概念理解

  • CGI

CGI 全称是“公共网关接口”(Common Gateway Interface),HTTP 服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。

  • FastCGI

FastCGI 像是一个常驻(long-live)型的 CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去 fork 一次(这是 CGI 最为人诟病的 fork-and-execute 模式)。
它还支持分布式的运算,即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。
FastCGI 是语言无关的、可伸缩架构的 CGI 开放扩展,其主要行为是将 CGI 解释器进程保持在内存中并因此获得较高的性能。

  • PHP-CGI

PHP-CGI 是 PHP 自带的 FastCGI 管理器。

  • PHP-FPM

PHP-FPM 是一个 PHP FastCGI 管理器,是只用于 PHP 的,可以在 http://php-fpm.org/download 下载得到。

  • Spawn-FCGI

Spawn-FCGI 是一个通用的 FastCGI 管理服务器,它是 Lighttpd 中的一部分,很多人都用 Lighttpd 的 Spawn-FCGI 进行 FastCGI 模式下的管理工作,不过有不少缺点。而 PHP-FPM 的出现多少缓解了一些问题,但 PHP-FPM 有个缺点就是要重新编译,这对于一些已经运行的环境可能有不小的风险,在 PHP 5.3.3 中可以直接使用 PHP-FPM了。
Spawn-FCGI 目前已经独成为一个项目,更加稳定一些,也给很多 Web 站点的配置带来便利。

你用过那些框架, 各自有什么优缺点.

php运行模式有几种,分别是什么.

JIT 是做了哪些优化,从而对PHP的速度有不少提升?

JIT 的思想很简单,即在程序运行时动态对程序进行编译,生成平台相关的机器码(比如运行它的机器 CPU 的本地代码),从而加快程序的运行速度。
在 PHP 中,JIT 将为 Zend Vm 生成的指令作为中间表示,并发出依赖于体系结构的机器代码,这样代码的宿主就不再是 Zend Vm,而是直接由 CPU 发出。

「PHP的字符串是二进制安全的」,这句话怎么理解,为什么是二进制安全?

PHP中创建多线程、多进程有哪些方式?

PHP中使用多线程和多进程分别有哪些优缺点?

Laravel的中间件的顺序执行,是如何实现的?

使用cUrl下载大文件时,占用内存太大,有没比较优化的方式?

PHP 上传大文件(比如:2 GiB的视频),需要修改php.ini的哪些配置以免受到上传的大小限制?或者你有其它更好的方式?

网络

http code 码含义 比如204, 304, 404

apache与nginx对比,你觉得他们各自的优缺点.

nginx与php数据通信原理是什么.

http1.0与http1.1的区别, http与https的区别.

描述http请求的三次握手/四次挥手

如何实现跨域请求

关于header的各种参数的作用.

长连接的优势在哪里.

详细描述IP协议、TCP协议,以及UDP协议与它们的区别。

TCP协议中,最大传输单元MTU一般最大是多少,在TCP协议中,如果一个数据被分割成多个包,这些包结构中什么字段会被标记相同。

服务器使用PHP时,客户端的IP能伪造吗?如果能,列出伪造方法;如果不能,说明原因?

描述域名劫持的各种方法,为什么HTTPS不能被劫持?

数据库

你采用mysql的引擎是什么. mysql innodb与myisam 这两种引擎本质区别是什么, 要能够从底层数据实现来说.

mysql 字段类型有那些, 它们在内存能够存储多少字节数据, 比如 datetime timestamp date.

在正式服务器上, 如何操作一个存储大数据表上增加一个字段或添加索引或改变数据字段类型.

索引最左原则的意思是什么.

mysql分库分表策略, 如何解决增表,减表问题.

redis与memcached对比,各自优缺点.

redis与memcached如何实现分布式搭建.

一致性hash原理是什么.

mongodb与mysql对比,优势在什么地方.

搭建MySQL分布式,有哪些方式?

MySQL主从同步,和主主同步有哪些区别,以及优劣势?

描述epoll和poll、select的区别,为什么epoll会具备性能优势?

Linux

如何查看服务器负载

说说你常用的命令

如何统计日志文件中访问次数最多的十个ip地址.

源码编译过lamp 或 lnmp 软件吗

在当前目录下,如何查找包含keyword文件.

如何重启php 或 nginx.

进程与线程的区别

什么情况下会出现死锁, 如何解决死锁.

综合

说说你在工作中碰到的难题及如何解决的, 或讲讲你做过的项目中有难度的项目.

你能说一下微博的架构流程是什么样的吗? (这个问题我也是醉了)

说说你们现在服务器的架构是什么样子.

高并发,高流量情况下,如何设计秒杀或抢红包架构.

描述OAuth2的工作原理?

列出几个中文分词工具?

PHP百万级数据导出方案(多csv文件压缩)

参考

Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2023 Keep It Simple And Stupid All Rights Reserved.

访客数 : | 访问量 :