0

牢记服务器负载,我想知道每次对会话的调用是否是对服务器的单独调用,这会增加服务器负载?让我稍微解释一下。假设在每个 php 页面中,我必须设置 10 个会话数据,并且必须调用 10 个会话数据,如下所示:

$_SESSION['a']=1;
$_SESSION['b']=2;
$_SESSION['c']=3;
$_SESSION['d']=4;
$_SESSION['e']=5;
$_SESSION['f']=6;
$_SESSION['g']=7;
$_SESSION['h']=8;
$_SESSION['i']=9;
$_SESSION['j']=10;

echo $_SESSION['a'];
echo $_SESSION['b'];
echo $_SESSION['c'];
echo $_SESSION['d'];
echo $_SESSION['e'];
echo $_SESSION['f'];
echo $_SESSION['g'];
echo $_SESSION['h'];
echo $_SESSION['i'];
echo $_SESSION['j'];

设置以上 10 个会话并输出相同,这些是对服务器的 20 个单独调用还是通过 session_start(),在页面加载期间一次加载整个会话数据?

还想知道如何在会话中存储多维关联数组?假设我想像这样设置上面的 10 个会话数据:

$_SESSION['mydata']=array(
a=>1,
b=>2,
c=>3,
d=>4,
e=>5,
f=>6,
g=>7,
h=>8,
i=>9,
j=>10
)

echo $_SESSION['mydata']['a'];

通过上面的示例,如果每个会话调用都是对服务器的单独调用,我可以减少服务器负载。

当我们设置和获取会话数据时,有人告诉我发生了什么吗?

4

3 回答 3

0

会话基准

对于 $_SESSION['mydata']['key'] = 'value'

session_start();
$time_begin = microtime(true);
$mem_start = memory_get_usage();
for ($i=0; $i < 100000; $i++) { 
$_SESSION['mydata']["a$i"] = $i;
}
foreach ($_SESSION['mydata'] as $key => $value) {
    $r = $value;
}
$mem_end = memory_get_usage();
$time_end = microtime(true);
echo "Time :";
echo  $time_end - $time_begin;
echo "<br>";
echo "Memory :";
echo  $mem_end - $mem_start;

我的结果是$_SESSION['mydata']['key']

Time :0.57849311828613
Memory :464

对于$_SESSION['key'] = 'value'

<?php

session_start();

$time_begin = microtime(true);
$mem_start = memory_get_usage();
for ($i=0; $i < 100000; $i++) { 
    $_SESSION["a$i"] = $i;
}
for ($i=0; $i < 100000; $i++) { 
    $r = $_SESSION["a$i"];

}
$mem_end = memory_get_usage();
$time_end = microtime(true);
echo "Time :";
echo $time_end - $time_begin;
echo "<br>";
echo "Memory :";
echo $mem_end - $mem_start;

我的结果是$_SESSION['mydata']

Time :0.47217416763306
Memory :176

已编辑:在mydata数组和其他键花费的第一个 PHP 脚本内存中mydata。因此,第二种方式再次更大。

所以,使用$_SESSION['key'] = 'value'大于$_SESSION['my']['key'] = 'value'

这可能是当您想为 $_SESSION['my']['key'] 设置一个值时,php 应该获取$_SESSION['my']并且之后可以创建新 var 的原因。在里面$_SESSION['my']['key']

于 2013-10-01T14:51:27.833 回答
0

您的脚本的整个执行都是在一个请求中完成的。通过设置 $_SESSION['foo']='bar' 和 $_SESSION['baz']='biz' 您不会设置两个不同的会话,而是设置两个会话变量

所以整个会话是在脚本启动时加载的,而不是页面加载(这是一个客户端术语)。

这一切都是通过 cookie 完成的。

编辑,回答您的评论:

正如其他人提到的(请参阅 Mark Ba​​ker 的评论),会话在脚本开始之前加载一次,并在脚本结束后存储一次(除非您明确调用session_write_close()

当然,大小很重要。显然,会话越大,加载/存储的时间就越长。但这将是您最不想优化的事情。

于 2013-10-01T15:00:22.240 回答
0

这是会话的细分

  • session_start();要么在硬盘上创建一个会话文件,要么访问一个已经存在的会话文件。它是一个序列化的数组
  • 该数组被加载到内存中并在内存中进行操作,直到脚本完成执行,或者您可以强制它重新写入文件session_write_close()

开始会话后,您可以根据需要添加/删除任意数量的数据,因为这与操作数组没有什么不同。

繁重的工作已经完成,session_start因为session_write_close那是 PHP 实际上必须访问硬盘的时候

理论上每个用户可以在 FAT32 服务器上拥有一个 4GB 的会话文件,或者在 NTFS 服务器上拥有更大的会话文件,但我相信您可以想象会出现可怕的性能问题。

于 2013-10-01T15:11:19.833 回答