请记住服务器负载,我想知道每个会话调用是否是对服务器的单独调用,这会增加服务器负载? 让我解释一下。假设在每个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'];
通过上面的例子,如果每个会话调用是对服务器的单独调用,我可以减少服务器负载。
任何人都清楚我们设置和获取会话数据时会发生什么?
答案 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 Baker的评论)会话在脚本开始之前加载一次,并在脚本结束后存储一次(除非你明确地调用session_write_close()
)
当然,尺寸很重要。显然,会话越大,加载/存储的时间就越长。但那将是你最不愿意优化的事情。
答案 2 :(得分:0)
以下是会话细分
session_start();
要么在硬盘驱动器上创建一个会话文件,要么在它已经存在的情况下访问一个。它是一个序列化数组session_write_close()
重新编写文件您可以在启动会话后添加/删除任意数据,因为它与操作数组没什么不同。
繁重工作在session_start
和session_write_close
完成,因为这是PHP实际上必须访问硬盘的时候
理论上,每个用户可以在FAT32服务器上拥有4GB会话文件,或者在NTFS服务器上拥有更大的会话文件,但我相信您可以想象会出现可怕的性能问题。