面试/笔试实战 II

从面试中学习,从面试中成长。

禁用COOKIE后SESSION还能用吗 ?

客户端禁用cookie采用url重写的方式 ,
也就是将sessionid写在url上,

抓取远程图片到本地,你会用什么函数 ?

1
file_get_contents($url);

什么是CGI? 什么是FastCGI? php-fpm,FastCGI,Nginx之间是什么关系?

  • CGI: 公共网关接口(Common Gateway Interface,CGI)是Web 服务器运行时外部程序的规范
  • FastCGI: 快速通用网关接口(Fast Common Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本。
  • php-fpm: PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)是一个PHPFastCGI管理器
  • 关系:

用户的请求通过WEB服务器(如Nginx)转发给FastCGI进程,FastCGI进程再调用应用程序进行处理(如PHP解析器),应用程序的处理结果如html返回给FastCGIFastCGI返回给Nginx进行输出。

简述POST和GET传输的最大容量分别是多少?

  • GET

get 是通过URL提交数据,因此GET可提交的数据量就跟URL所能达到的最大长度有直接关系。很多文章都说GET方式提交的数据最多只能是1024字节,而 实际上,URL不存在参数上限的问题,HTTP协议规范也没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制 是2083字节(2K+35字节)。对于其他浏览器,如FireFox,Netscape等,则没有长度限制,这个时候其限制取决于服务器的操作系统。即 如果url太长,服务器可能会因为安全方面的设置从而拒绝请求或者发生不完整的数据请求。

  • POST

post 理论上讲是没有大小限制的,HTTP协议规范也没有进行大小限制,但实际上post所能传递的数据量大小取决于服务器的设置和内存大小。因为我们一般 post的数据量很少超过MB的,所以我们很少能感觉的到post的数据量限制,但实际中如果你上传文件的过程中可能会发现这样一个问题,即上传个头比较 大的文件到服务器时候,可能上传不上去,以php语言来说,查原因的时候你也许会看到有说PHP上传文件涉及到的参数PHP默认的上传有限定,一般这个值是2MB,更改这个值需要更改php.confpost_max_size这个值。

列出能够使HTML和PHP分离开使用的模板

Smarty, Dwoo, tinyButStrong, phemplate, XTemplate等模板引擎。

请写一个函数,实现以下功能: 字符串”open_door”转换成”OpenDoor”.

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

function convert($string = 'open_door') {
$array = explode('_', $string);
array_walk($array, function (&$v) {
$v = ucwords($v);
});
$string = implode('', $array);

var_dump($string);
}

convert();

echo(), print(), print_r()的区别?

  • echo()是语言结构(language construct),而并不是真正的函数,没有返回值。
  • pirnt()实际上也不是函数(而是语言结构),所以可以不用圆括号包围参数列表。
  • print_r()可以把字符串和数字简单地打印出来,而数组则以括起来的键和值得列表形式显示,并以Array开头。
  • printf()函数返回一个格式化后的字符串。

isset, empty(), is_null的区别?

  • isset 判断变量是否已存在,如果变量存在则返回 TRUE,否则返回 FALSE。
  • empty 判断变量是否为空,如果变量是非空 或非零 的值,则 empty() 返回 FALSE。
  • is_null 判断变量是否为NULL

FILE表示什么意思?

  • __FILE__ 文件的完整路径和文件名。
  • __LINE__ 文件中的当前行号。
  • __DIR__ 文件所在的目录。
  • __FUNCTION__ 函数名称(PHP 4.3.0 新加)。
  • __CLASS__ 类的名称(PHP 4.3.0 新加)。
  • __TRAIT__ Trait 的名字(PHP 5.4.0 新加)
  • __METHOD__ 类的方法名(PHP 5.0.0 新加)
  • __NAMESPACE__ 当前命名空间的名称(区分大小写)。

如何获取客户端的IP地址?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public function getIp()
{
if ($_SERVER["HTTP_X_FORWARDED_FOR"] ?? false) {
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
$ips = explode(',', $ip);//阿里cdn
$ip = $ips[0];
} elseif ($_SERVER["HTTP_CDN_SRC_IP"] ?? false) {
$ip = $_SERVER["HTTP_CDN_SRC_IP"];
} elseif (getenv('HTTP_CLIENT_IP')) {
$ip = getenv('HTTP_CLIENT_IP');
} elseif (getenv('HTTP_X_FORWARDED')) {
$ip = getenv('HTTP_X_FORWARDED');
} elseif (getenv('HTTP_FORWARDED_FOR')) {
$ip = getenv('HTTP_FORWARDED_FOR');
} elseif (getenv('HTTP_FORWARDED')) {
$ip = getenv('HTTP_FORWARDED');
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
$ip = str_replace(array('::ffff:', '[', ']'), array('', '', ''), $ip);

return $ip;
}

写出使用header函数跳转页面的语句

1
header("Location:http://blog.caoxl.com");

写出将一个数组里的空值去掉的函数?

1
array_filter();

什么事CSRF攻击? XSS攻击? 如何防范?

CSRF攻击

跨站请求伪造(英語:Cross-site request forgery),也被称为one-click attack 或者 session riding,通常缩写为 CSRF 或者XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

  • 防范:
  1. Cookie Hashing(所有表单都包含同一个伪随机值):
  2. 验证码
  3. One-Time Tokens(不同的表单包含一个不同的伪随机值)
  4. 请求时附带验证信息,比如验证码或者token

XSS攻击

人们经常将跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,有人将跨站脚本攻击缩写为XSS
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。 这些恶意网页程序通常是JavaScript,但实际上也可以包括JavaVBScriptActiveXFlash 或者甚至是普通的HTML

  • 防范:
  1. Content Security Policy(CSP)
  2. 输入内容长度控制
  3. HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie。
  4. 验证码:防止脚本冒充用户提交危险操作。

简单描述MySQL中,索引,主键,唯一索引,联合索引的区别,对数据的性能有什么影响?

  • 索引的遵循原则:
    • 1、最左侧原则,表的最左侧的一列,往往数据不会发生改变,不影响其他列的数据;
    • 2、命名短小原则,索引命名过长会使索引文件变大,损耗内存。
  • 普通索引(由关键字KEY或INDEX定义得到索引):加快数据的查询速度

  • 唯一索引(由关键字UNIQUE把它定义为唯一索引):保证数据记录的唯一性

  • 主键:一种特殊的唯一索引,在一张表中只能定义一个主键索引,用来标识唯一一条数据,用PRIMARY KEY创建。

  • 联合索引:索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引,这就是联合索引。

索引可以极大的提高查询访问速度,但是会降低插入,删除,更新表的速度,因为在执行写操作的时候还要操作索引文件

简述在MySQL数据库中MyISAM和InnoDB的区别?

    1. 构成上,MyISAM的表在磁盘中有三个文件组成,分别是表定义文件(.frm)、数据文件(.MYD)、索引文件(.MYI),而InnoDB的表由表定义文件(.frm)、表空间数据和日志文件组成。
    1. 安全方面,MyISAM强调的是性能,其查询查询效率较高,但不支持事务和外键等安全性方面的功能,而InnoDB支持事务和外键等高级功能,查询效率稍低。
    1. 对锁的支持,MyISAM支持表锁,而InnoDB支持行锁。

Memcache和Redis的读写性能如何? 两者优缺点?

  • 读写性能

memcache更加快速,在读取性能上比 Redis 快,缺点是仅支持字符串。
Redis支持丰富的数据结构类型,字符串,散列(哈希),集合,有序集合,还支持订阅发布,地理位置等等。
实际运用中可以redis,memcache结合,memcache可作为session存储的方式,session都是KV类型键值对

  • 优缺点

Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。

请写一个函数验证电子邮件的格式是否正确?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

$email = 'code08091@163.com';

// 方法1: 原生自带验证
$is_email = filter_var($email, FILTER_VALIDATE_EMAIL);

var_dump($is_email); // true则返回email, false则返回false

echo "<hr>";

// 方法2: 正则验证
$regex = '/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/';
$is_email = preg_match($regex, $email);

var_dump($is_email);
  • 封装一下
1
2
3
4
5
6
7
8
9
10
11
12
function checkEmail($email) {
$is_email = filter_var($email, FILTER_VALIDATE_EMAIL);

if ($is_email) {
$regex = '/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/';
$is_email = preg_match($regex, $email);

return $is_email;
}
}

var_dump(checkEmail('code08091@163.com'));

使用正则表达式去除其中的所有JS脚本?

写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。

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 scan_dir($dir)
{
$files = array();
if ( $handle = opendir($dir) ) {
while ( ($file = readdir($handle)) !== false ) {
if ( $file != ".." && $file != "." ) {
if ( is_dir($dir . "/" . $file) ) {
$files[$file] = scandir($dir . "/" . $file);
}else {
$files[] = $file;
}
}
}
closedir($handle);
return $files;
}
}

$files = scan_dir('F:\Code\Hexo');

print_r($files);

函数内部static和global关键字的作用

static 是静态变量,在局部函数中存在且只初始化一次,使用过后再次使用会使用上次执行的结果; 作为计数,程序内部缓存,单例模式中都有用到。
global 关键字,引用全局变量,wordpress中大量用到,如面向过程开发。
static 静态方法,是类的成员方法,但不需要实例化类可直接使用
$GLOBAL 在函数内使用具有全局作用域的变量,如$GLOBAL['a']

子类重写父类的Protected方法有什么限制? 或者说有什么要遵守的规则?

用例子说明,以 Laravel 框架中的控制器作为说明

  1. final 修饰的类方法不可被子类重写
  2. PHP是否重写父类方法只会根据方法名是否一致判断 (5.3以后重写父类方法参数个数必须一致)
  3. 重写时访问级别只可以等于或者宽松于父类 不可提升访问级别

PHP文件末尾是否应该加 ? >结束符号, 为什么?

  • 不应该
  • 主要防止 includerequire 引用文件,把文件末尾可能的回车和空格等字符引用进来。
  • 还有一些函数比如 session_start() 必须在没有任何输出之前调用,就会造成不是期望的结果。
  • PHP文件的编码不包含BOM的 UTF8,这也是PSR-2中的规范,纯PHP代码文件必须省略最后的 ?> 结束标签

PHP开源框架CI,ThinkPHP,Laravel的优缺点以及选型依据。

  • CI非常轻量级,是一个简单的MVC框架,性能也很快。
  • ThinkPHP国内使用比较多,优点是文档非常多,各种问题解决方案比较多,缺点是代码不够规范,理念落后。
  • Laravel 是一个现代化的PHP开发框架,代码优雅,使用 composer 方式扩展功能,社区活跃,缺点是比较重,比较适合做后台管理或者应用型WEB系统。

Ajax中如何执行跨域访问? 同子域的情况如何处理? 不同子域的情况如何处理?

什么是跨域?狭义的理解跨域是指受到浏览器同源策略限制的一类请求,通常我们说的跨域就是指的这一类请求。当协议、域名(包含子域名)、端口号中任意一个不相同时,都属于不同域。不同域之间相互请求资源,就会受到浏览器的同源策略限制

  • CORS
  • script标签解决跨域
  • jsonp解决跨域

文件上传时需要在form中加入enctype=multipart/form-data的目的是什么? 使用application/x-www,form-urlencoded不能成功的原因是?

首先知道enctype这个属性管理的是表单的MIME编码。共有三个值可选:

  1. application/x-www-form-urlencoded
  2. multipart/form-data
  3. text/plain

其中application/x-www-form-urlencoded是默认值,作用是设置表单传输的编码。

表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;
只有使用了multipart/form-data,才能完整的传递文件数据

设计一个名为car的类,使其拥有color属性、getColor与setColor方法

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

class Car
{
public $color;

/**
* @return mixed
*/
public function getColor()
{
return $this->color;
}

/**
* @param mixed $color
*/
public function setColor($color)
{
$this->color = $color;
}
}

请写出3种多服务器共享Session的方案

    1. 文件方式

这种方式,将文件作为一个map,当新增一个数据的时候,就在文件中增加类似这样的一条数据

    1. cache方式

memcache可以做分布式,如果没有这功能,他也不能用来做session同步。他可以把web服务器中的内存组合起来,成为一个”内存池”,不管是哪个服务器产生的sessoin都可以放到这个”内存池”中,其他的都可以使用。
redis与memcache一样,都是将数据放在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

    1. cookie方式

把用户访问页面产生的session放到cookie里面,就是以cookie为中转站。

    1. 通过数据库mysql共享session

采用一台专门的mysql服务器来存储所有的session信息。

    1. 通过NFS共享Session

选择一台公共的NFS服务器(Network File Server)做共享服务器,所有的Web服务器登陆的时候把session数据写到这台服务器上,那么所有的session数据其实都是保存在这台NFS服务器上的,不论用户访问哪台Web服务器,都要来这台服务器获取session数据,那么就能够实现共享session数据了。

假设有10道题,如何从中随机取出5道题?

rand(), random_bytes(), mt_rand()

谈谈抢红包这种互动活动实现的技术难点及解决方案

高并发,大流量,减少库存问题,锁问题,前后端缓存问题,队列问题

如何保证同时向同一个文件内写入内容的完整性以及准确性

LOCK_EX (独占锁定)

  • process_1.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

// 脚本开始
$start_time = microtime();

$filename = './process_data.txt';

$fp = fopen($filename, 'a+');

for ($i = 0; $i < 100; $i++) {
fwrite($fp, "process_1:" . $i . "\r\n");
usleep(100000);
}

fclose($fp);

// 脚本结束
$end_time = microtime();

echo "Process_1 Done for" . ($end_time - $start_time) . 'seconds';
  • process_2.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

// 脚本开始
$start_time = microtime();

$filename = './process_data.txt';

$fp = fopen($filename, 'a+');

for ($i = 0; $i < 100; $i++) {
fwrite($fp, "process_2:" . $i . "\r\n");
usleep(100000);
}

fclose($fp);

// 脚本结束
$end_time = microtime();

echo "Process_2 Done for " . ($end_time - $start_time) . ' seconds';

多次同时执行,虽然都写了100行,但是事务1和事务2的数据交错写入,这并不是我们想要的结果。我们要的是事务完整的执行,此时我们需要有个机制 去保证在第一个事务执行完后再执行第二个。在PHP中,flock函数完成了这一使命。在事物1和事务2的循环前面都加上: flock($fp, LOCK_EX); 就能 满足我们的需求,将两个事务串行。

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

// 脚本开始
$start_time = microtime();

$filename = './process_data.txt';

$fp = fopen($filename, 'a+');

// 独占锁定
flock($fp, LOCK_EX);

for ($i = 0; $i < 100; $i++) {
fwrite($fp, "process_1:" . $i . "\r\n");
usleep(100000);
}

fclose($fp);

// 脚本结束
$end_time = microtime();

echo "Process_1 Done for " . ($end_time - $start_time) . ' seconds';

在PHP的fopen函数的实现中,如果我们使用a参数在文件的尾部追加内容,其调用open函数中oflag参数为 O_CREAT|O_APPEND,即我们使用追加操作 不用担心并发追加写入的问题

请简述cookie与session的区别和联系

  • 区别

cookie保存在客户端,未设置存储时间的cookie为会话cookie保存在浏览器的进程开辟的内存中,当浏览器关闭后会话cookie也会被删除;设置了存储时间的cookie保存在用户设备的磁盘中直到过期。
session保存在服务器端,存储在IIS的进程开辟的内存中。

  • 联系

当服务器端生成一个session时就会向客户端发送一个cookie保存在客户端,这个cookie保存的是sessionsessionId。这样才能保证客户端发起请求后客户端已经登录的用户能够与服务器端成千上万的session中准确匹配到已经保存了该用户信息的session,同时也能够确保不同页面之间传值时的正确匹配。

Powered by Hexo and Hexo-theme-hiker

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

访客数 : | 访问量 :