每个会话调用是对服务器的单独调用

时间:2013-10-01 14:49:23

标签: php session

请记住服务器负载,我想知道每个会话调用是否是对服务器的单独调用,这会增加服务器负载? 让我解释一下。假设在每个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'];

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

任何人都清楚我们设置和获取会话数据时会发生什么?

3 个答案:

答案 0 :(得分: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数组和其他mydata键组成的PHP脚本内存中。所以,第二种方式再次变大。

因此,使用$_SESSION['key'] = 'value'大于$_SESSION['my']['key'] = 'value'

这可能是一个原因,当你想将值设置为$ _SESSION ['my'] ['key']时,php应该得到$_SESSION['my'],之后可以创建新的var。在$_SESSION['my']['key']

答案 1 :(得分:0)

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

所以整个会话都加载到 script start ,而不是页面加载(这是客户端术语)。

这一切都是用饼干完成的。

编辑,以回答您的评论:

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

当然,尺寸很重要。显然,会话越大,加载/存储的时间就越长。但那将是你最不愿意优化的事情。

答案 2 :(得分:0)

以下是会话细分

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

您可以在启动会话后添加/删除任意数据,因为它与操作数组没什么不同。

繁重工作在session_startsession_write_close完成,因为这是PHP实际上必须访问硬盘的时候

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