我怎么会不调用在session_start
我现在有一个彗星页,如果我打电话session_start
顶部则会话冻结,我的工作围绕做的是这样的:我怎么会不调用在session_start
function getTables($sessionID = null){
if(!isset($this->output)){
$this->output = array();
}
if(!isset($this->output[$this->sessID])){
$this->output[$this->sessID] = array();
}
$hostname = php_uname("n");
$sess_ini = session_save_path();
chdir($sess_ini);
if(false === ($save = @file_get_contents("sess_$this->sessID"))){
$cwd = getcwd();
chdir($this->location);
return (isset($this->returnJSON[$this->sessID])?$this->returnJSON[$this->sessID]
:json_encode(array(
'sess_local'=>"$sess_ini/sess_$this->sessID",
'save'=>$save,
'hostname'=>$hostname,
'cwd'=>$cwd,
'reg_local'=>$this->location,
)
)
);
}
chdir($this->location);
//session_id($sessionID);
$sessions = explode("|",$save);
$_SESSION['all'] = array();
foreach($sessions as $key=>$sess){
if(trim($sess)=='all' && isset($sessions[$key+1])){
$_SESSION['all'] = unserialize(trim(urldecode($sessions[$key+1])));
break;
}
}
...
有一个更好的方式让我变得会话变化多数民众赞成不进入会议文件?
你的工作,各地可以简单得多:
<?php
//yes, start normally.
session_start();
//now, immediately harvest the variables you need to remember from the $_SESSION
$somevar_you_want_to_remember = $_SESSION['somevar'];
//close the session, so it won't lock:
session_write_close();
//disable some errors which aren't really errors:
ini_set('session.use_cookies',false);
session_cache_limiter(false);
//you are now free to do anything you like:
while(true){
echo "<script>window.parent.test_function('".time().' sessionvar: '.$somevar_you_want_to_remember."');</script>";
flush_buffers();
sleep(1);
//if you need to refresh your variable, you can just reopen the session:
session_start();
$somevar_you_want_to_remember = $_SESSION['somevar'];
//and immediately close again
session_write_close();
}
你可以写一些辅助功能,如:
function SaveQuickSessionVar($name,$value){
session_start();
$_SESSION[$name] = $value;
session_write_close();
}
function GetQuickSessionVar($name){
session_start();
$var = $_SESSION[$name];
session_write_close();
return $var;
}
这似乎是工作^ _ ^我从来不知道'session_write_close' – Neal 2011-04-21 19:38:51
我收到此警告:警告:session_start()[function.session-start]:无法发送会话cookie - (在/var/www/html/live_mockup/comet/output.php:63开始输出)在第56行的/var/www/html/live_mockup/comet/output.php中发送的头文件,但我想它没有物? – Neal 2011-04-21 19:41:46
每一秒都应该没有问题,虽然它抱怨发送的头文件,但您可以放心地忽略它,因为它需要的原因(发送带ID的cookie)已经成功。尽管忽略警告可能不是100%“干净”,但可以有充分的理由完成,但我会看看我是否能找到一个无警告的解决方案。 – Wrikken 2011-04-21 19:42:11
PHP的默认会话处理程序锁定了会议文件,而这是在使用一个脚本。彗星会使处理程序脚本长时间保持活动状态,从而保持会话锁定。你可以通过做你的彗星脚本
session_start();
session_write_close();
。它将使用存储的数据填充$ _SESSION,然后关闭会话文件并放弃对其的锁定。 $ _SESSION中的数据仍然存在并可用,您甚至可以更改它。唯一的区别是,除非在脚本中执行后续的session_start()
,否则这些更改将不会写出到磁盘会话文件中。
因此,您可以在您的脚本中使用常规的PHP会话,您只需要注意在该部分开始执行之前,任何长时间运行的部分都会关闭会话。
soo关闭@marc。谢谢^ _ ^ – Neal 2011-04-21 19:40:03
我认为你需要解决和解决根本问题(为什么'session_start()'让事情冻结)而不是 – 2011-04-21 19:19:18
@詹姆斯C这是我的prev问题....它解决了从session_start彗星的无限帧 - http://*.com/questions/5553830/how-do-irefresh-the-session-in-comet – Neal 2011-04-21 19:21:34
@詹姆斯,这是由于事实,有限制在PHP与有两个会话目前有相同的ID – Neal 2011-04-21 19:28:01