PHP会话控制
# 引用变量
关于引用的补充
- unset只会取消引用,不会销毁空间
- 对象本身就是引用传递,不会进行空间复制,如果需要使用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
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
# 常量及数据类型
# 单引号与双引号的区别是什么?
双引号支持解析变量,单引号不支持
单引号效率更高
# Heredoc与Newdoc的区别?
Heredoc类似于双引号,内部内容会解析,Newdoc类似于单引号,内部内容不会解析
$str = <<<EOT
this is contents
Eot
$str = <<<EOT
this is contents
Eot
1
2
3
4
5
6
7
2
3
4
5
6
7
# 数据类型
三大数据类型
- 标量、复合、特殊
- 浮点类型 :浮点类型不能用于比较,丢失精度
- 布尔类型: FALSE七种情况 0,0.0,'','0',false,array(),NULL
说一下php的超全局数组有什么?
名称 | 说明 |
---|---|
$GLOBALS | 获取全局的变量 |
$_GET | 获取get请求参数 |
$_POST | 获取post请求参数 |
$_REQUEST | 获取全部请求参数 |
$_SESSION | 获取session数据 |
$_COOKIE | 获取cookie数据 |
$_SERVER | 获取server数据 |
说一下你理解的常量?const与define的区别是什么?
- 一经定义,不能修改和删除
- const 语言结构
- define 函数
说一下你知道的预定义常量?
名称 | 说明 |
---|---|
FILE | 获取当前文件所在的位置 |
LINE | 获取当前所在的行数 |
DIR | 获取当前所在的目录 |
FUNCTION | 获取当前的函数名 |
CLASS | 获取当前的类 |
TRAIT | 获取当前的trait |
METHOD | 获取当前的方法名 |
NAMESPACE | 获取当前的命名空间 |
什么情况下会产生NULL?
- 直接赋值为NULL
- 未定义的变量
- unset销毁的变量
# 运算
等值判断(FALSE的七种情况),== 和 === 区别在于 == 比较值, 而=== 比较类型和值
运算符*的优先级说明?
符号 | 说明 |
---|---|
@ | 该表达式会忽略掉php的错误信息 |
运算优先级 | 递增/递减 > ! > 算术运算 > 大小比较 > 不相等比较 > 引用 > 位运算(^) > 逻辑与 > 逻辑或 > 三目 > 赋值 > and > xor > or |
() | 括号的使用可以增加可读性 |
# 递增递减运算符
- 递增递减不影响布尔值 ,递减NULL没有效果,递增NULL为1
- 递增和递减在前就先运算后返回,在后则先返回后运算
1、如下会输出什么?
$x = 5;
echo $x;
echo $x+++$x++;
echo $x;
echo $x---$x--;
echo $x;
1
2
3
4
5
6
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
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
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
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
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
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
2
3
4
5
上次更新: 2020/12/31, 06:55:18