xiaoyi's blog
首页
  • 后端文章

    • PHP
  • 学习笔记

    • 《Git》学习笔记
  • MySQL
  • NoSQL
  • 中间件
  • Linux
  • Nginx
  • 网络
  • Mac
  • 学习笔记

    • 《Nginx》学习笔记
  • 学习
  • 博客搭建
  • 技术文档
  • GitHub技巧
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub

xuexuguang

后端新秀
首页
  • 后端文章

    • PHP
  • 学习笔记

    • 《Git》学习笔记
  • MySQL
  • NoSQL
  • 中间件
  • Linux
  • Nginx
  • 网络
  • Mac
  • 学习笔记

    • 《Nginx》学习笔记
  • 学习
  • 博客搭建
  • 技术文档
  • GitHub技巧
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub
  • 学习

  • GitHub技巧

  • 面试

    • 面试问题集锦
    • PHP基础
    • 正则表达式
    • PHP文件操作
    • PHP会话控制
      • 单引号与双引号的区别是什么?
      • Heredoc与Newdoc的区别?
      • 数据类型
      • 运算
      • 递增递减运算符
      • 循环
      • 文件读取/写入操作
      • fopen打开文件模式整理
      • 访问远程文件
      • 目录操作
      • 为什么要使用php会话技术
      • cookie如何操作?
      • cookie优点和缺点
      • session
      • session的优缺点
      • 传递SessionID的问题
    • 自定义函数及内置函数
    • MVC对比
    • linux
    • MySQL数据库基础
    • MySQL创建高性能的索引
    • MySQL的SQL优化
    • MySQL的高可扩展和高可用
    • MySQL安全
    • 常见算法
    • 常见数据结构
    • 高并发解决方案
    • 流量优化
    • 浏览器缓存和数据压缩
    • 图片优化
    • 静态化处理
    • 动态语言并发处理
    • 数据库缓存优化
    • 负载均衡
  • 博客搭建

  • 心情杂货

  • 技术文档

  • 实用技巧

  • 友情链接
  • 更多
  • 面试
xuexuguang
2020-12-31

PHP会话控制

# 引用变量

关于引用 的补充

  1. unset只会取消引用,不会销毁空间
  2. 对象本身就是引用传递,不会进行空间复制,如果需要使用clone

如下的程序refcount、is_ref将会是什么?

/**
  观察zval变量结构,此时refcount = 1,表示有一个变量指向这块内存空间 
  a: (refcount=1, is_ref=0)=array (
      0 => (refcount=0, is_ref=0)=0, 
      1 => (refcount=0, is_ref=0)=1, 
      2 => (refcount=0, is_ref=0)=2, 
      3 => (refcount=0, is_ref=0)=3
  )
*/
$a = range(0,3); 
xdebug_debug_zval('a');

/**
  观察zval变量结构,此时refcount = 2,表示a、b俩变量指向同一个内存空间
  a: (refcount=2, is_ref=0)=array (
      0 => (refcount=0, is_ref=0)=0, 
      1 => (refcount=0, is_ref=0)=1, 
      2 => (refcount=0, is_ref=0)=2, 
      3 => (refcount=0, is_ref=0)=3
  )
这里refcount为2是因为php的COW(Copy On Wrute)写机制,只有对变量进行写操作的时候,才会去开辟新的空间,我们可以试着去更改下$a的值
*/
$b = $a; 
xdebug_debug_zval('a');

/**
  观察zval变量结构,此时refcount = 1,表示有一个变量指向这块内存空间 
  a: (refcount=1, is_ref=0)=array (
      0 => (refcount=0, is_ref=0)=0, 
      1 => (refcount=0, is_ref=0)=1, 
      2 => (refcount=0, is_ref=0)=2, 
      3 => (refcount=0, is_ref=0)=3
  )
*/
$a = range(1,2);
xdebug_debug_zval('a');

/**
a: (refcount=2, is_ref=1)=array (
    0 => (refcount=0, is_ref=0)=0,
         1 => (refcount=0, is_ref=0)=1, 
         2 => (refcount=0, is_ref=0)=2, 
         3 => (refcount=0, is_ref=0)=3
    )
当我们使用&的时候,refcount为2,表示a和b指向同一块内存空间,is_ref为1表示当前是引用
*/
$b = &$a;
xdebug_debug_zval('a');
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

# 常量及数据类型

# 单引号与双引号的区别是什么?

  1. 双引号支持解析变量,单引号不支持

  2. 单引号效率更高

# Heredoc与Newdoc的区别?

Heredoc类似于双引号,内部内容会解析,Newdoc类似于单引号,内部内容不会解析

$str = <<<EOT
this is contents
Eot

$str = <<<EOT
this is contents
Eot
1
2
3
4
5
6
7

# 数据类型

三大数据类型

  1. 标量、复合、特殊
  2. 浮点类型 :浮点类型不能用于比较,丢失精度
  3. 布尔类型: FALSE七种情况 0,0.0,'','0',false,array(),NULL

说一下php的超全局数组有什么?

名称 说明
$GLOBALS 获取全局的变量
$_GET 获取get请求参数
$_POST 获取post请求参数
$_REQUEST 获取全部请求参数
$_SESSION 获取session数据
$_COOKIE 获取cookie数据
$_SERVER 获取server数据

说一下你理解的常量?const与define的区别是什么?

  1. 一经定义,不能修改和删除
  2. const 语言结构
  3. define 函数

说一下你知道的预定义常量?

名称 说明
FILE 获取当前文件所在的位置
LINE 获取当前所在的行数
DIR 获取当前所在的目录
FUNCTION 获取当前的函数名
CLASS 获取当前的类
TRAIT 获取当前的trait
METHOD 获取当前的方法名
NAMESPACE 获取当前的命名空间

什么情况下会产生NULL?

  1. 直接赋值为NULL
  2. 未定义的变量
  3. unset销毁的变量

# 运算

等值判断(FALSE的七种情况),== 和 === 区别在于 == 比较值, 而=== 比较类型和值

运算符*的优先级说明?

符号 说明
@ 该表达式会忽略掉php的错误信息
运算优先级 递增/递减 > ! > 算术运算 > 大小比较 > 不相等比较 > 引用 > 位运算(^) > 逻辑与 > 逻辑或 > 三目 > 赋值 > and > xor > or
() 括号的使用可以增加可读性

# 递增递减运算符

  1. 递增递减不影响布尔值 ,递减NULL没有效果,递增NULL为1
  2. 递增和递减在前就先运算后返回,在后则先返回后运算

1、如下会输出什么?

$x = 5;
echo $x;
echo $x+++$x++;
echo $x;
echo $x---$x--;
echo $x;
1
2
3
4
5
6

# 循环

1、for与foreach的区别是什么?

for循环只能遍历索引数组,foreach可以遍历索引和关联数组,联合使用list,each和while循环同样可以遍历索引和关联数组,foreach会对数组进行reset

# 文件及目录处理相关考点

# 文件读取/写入操作

方法 备注
fopen 用来打开一个文件,打开时需要指定打开模式
fwrite 写入函数
fread、fgets、fgetc 读取
fclose 关闭
file_get_contents、file_put_contents、file 不需要fopen打开的操作

# fopen打开文件模式整理

打开模式 描述
r 只读方式打开,将文件指针指向文件头。
r+ 读写方式打开,将文件指针指向文件头。
w 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
w+ 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
a 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
a+ 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
x 创建并以写入方式打开,将文件指针指向文件头。
如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。
如果文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定 O_EXCL
b 打开一个二进制文件
t 打开windows独有的文件类型

如何去读写一个文件?

$file = './1.txt';

$handle = fopen($file, 'r');
$content = fread($handle, filesize($file));
$content = 'hello world' . $content;
fclose($handle);

$handle = fopen($file, 'w');
fwrite($handle, $content);
fclose($handle);
1
2
3
4
5
6
7
8
9
10

# 访问远程文件

php中开启allow_url_fopen,HTTP协议连接只能使用只读,FTP协议可以使用只读和只写

# 目录操作

函数 描述
名称相关 basename()、dirname()、pathinfo()
目录读取 opendir()、readdir()、closedir()、rewinddir()
目录删除 rmdir()
目录创建 mkdir()
文件大小 filesize()
目录大小 disk_free_space()、disk_total_space()
文件拷贝 copy()
删除文件 unlink()
文件类型 filetype()
重命名文件或者目录 rename()
文件截取 ftruncate()
文件属性 file_exists()、is_readable()、is_writable()、is_executable()、filectime()、fileatime()、filemtime()
文件锁 flock()
文件指针 ftell()、fseek()、rewind()

如何去扫描一个目录下的文件?

function loopDir($dir)
{
    $handle = opendir($dir);
    while (false !== ($file = readdir($handle))) {
        if ($file != '.' && $file != '..') {
            echo "$file\n";
            if (filetype($dir.'/'.$file) == 'dir') {
                loopDir($dir.'/'.$file);
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

# 会话控制

# 为什么要使用php会话技术

http协议本身是无状态的,用户在两个不同的页面发起请求,对于服务端而言是无法坚定请求是否是来源于同一个用户。会话控制就是为了解决这种问题,用于识别用户请求。

# cookie如何操作?

// 设置cookie
setcookie($name,$value,$expire,$path,$domain,$secure);
// 读取cookie 
$_COOKIE
// 删除cookie
setcookie($name, '', time() - 1000)
1
2
3
4
5
6

# cookie优点和缺点

  • cookie将信息存储在客户端,不会占用服务器资源。
  • Cookie`数量和长度的限制。每个domain最多只能有20条cookie,每个cookie长度不能超过4KB,否则会被截掉。在当今新的浏览器和客户端设备版本中,支持 8192 字节的 Cookie 大小已愈发常见。
  • 由于在HTTP请求中的cookie是明文传递的,潜在的安全风险,Cookie 可能会被篡改

# session

Session基于cookie的,存储在服务器端,用户每次请求浏览器的时候会携带sessionID,服务端根据sessionID来读取会话。

session如何操作?

// 开启session 
session_start();
// 读取session 
$_SESSION
// 清空session
$_SESSION = [];
// 删除session文件
session_destroy();
1
2
3
4
5
6
7
8

php.ini中session如何配置?

// 是否自动开启session_start
session.autostart
// 存储session的cookie的有效域名是什么
session.cookie_domain
// 存储session的cookie路径
session.cookie_path
// 存储的sessionid的名称
session.name
// 存储的session的路径
session.save_path

// session的垃圾回收 
// 每100次调用session_start会有一次去清文件,清空当前时间-文件最后修改时间大于gc_maxlifetime的文件
session.gc_probability = 1
session.gc_divisor = 100
session.gc_maxlifetime = 1440

// session存储的句柄 
session.save_handler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# session的优缺点

由于存储在服务器端所以比较安全,但是由于存储在服务器端会存在服务器资源占用问题

# 传递SessionID的问题

1、session是基于cookie的,但是如果我们禁用掉cookie的话,该怎么办呢?

可以使用session_name()和session_id()来传递或者SID

// 可以使用session_name()和session_id()
<a href="demo.php?SESSIONID=<?php echo session_name()."=".session_id()?>">下个页面</a>

// 使用SID,如果开启cookie的话,SID是空,否则就是session_name()和session_id()的拼接 
<a href="demo.php?SESSIONID=<?php echo SID?>">下个页面</a>
1
2
3
4
5
编辑
#php面试题
上次更新: 2020/12/31, 06:55:18
PHP文件操作
自定义函数及内置函数

← PHP文件操作 自定义函数及内置函数→

最近更新
01
MVC对比
12-31
02
负载均衡
12-31
03
数据库缓存优化
12-31
更多文章>
Theme by Vdoing | Copyright © 2020-2020 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式