我想知道为什么这样的事情不起作用(实际上不起作用):
4.php :
<php
session_start();
$my_id = session_id();
$_SESSION['username'] = (($_SESSION['username'] == 'nimic') ? 's-a schimbat' : $_GET['test']);
file_put_contents('comm.g', PHP_EOL.$my_id, FILE_APPEND);
sleep(3); // can be left out
echo $_SESSION['username'];
?>
4.php 是一个简单的页面,它只设置 $_SESSION 的“用户名”组件,然后将会话 id 写入文件,然后回显 $_SESSION['username'] 值。
然后:
3.php :
<php
while(true)
{
if(file_exists("comm.g"))
{
$c = file("comm.g");
unlink("comm.g");
session_start();
foreach($c as $k => $v)
{
if($v != '')
{
$my_id = session_id();
session_write_close();
session_id($v);
session_start();
file_put_contents("result.cc", $_SESSION['username'].'---'.$v.'END'.PHP_EOL.PHP_EOL, FILE_APPEND);
$_SESSION['username'] = 'somethingelse';
session_id($my_id);
session_start();
}
}
session_write_close();
}
}
?>
3.php 由一个 cronjob 运行,每分钟运行大约 30 秒(直到服务器杀死它)。无论如何,result.cc
我发现(在这 30 秒内)预期的结果...... $_GET ['test'] 的值。
但是它并没有修改$_SESSION['username']的值,我什至没想到实际上会有这样的行为,我知道sleep是不够的,但是,刷新时不应该修改它吗? ...
我知道我的代码很糟糕,这只是一个测试,如果它有效,它会得到改进。
但我似乎没有弄清楚。我究竟做错了什么?其实我做错了很多事情,系统本身不应该这样使用,我也知道,但是,现在这是我唯一的选择。我对这件事有更复杂的想法,但如果这行不通,其他人也行不通。
我的意图实际上是在单独的线程中执行代码,以便我可以逃避一些更改(比如为文件方案注册一个包装器,并且在我需要时无权取消注册(恢复)它,在包装器类中)我在那里做的。非正统的方法,我知道...
那么,您可以提供任何想法吗?谢谢你。
编辑 1
即使让我想到一个有趣的想法@Ben 的答案并不准确......实际上在 cookie 中只保留了会话 ID,我通过使用文件替换了对 cookie 的需求,以便 cronjob 知道应该修改哪个会话,对于任何“注册”会话,我得到了 $_SESSION['username'] 的正确值,但即便如此,我也无法修改该死的值,就像它们被标记为只读一样。现在,重新考虑,我发现这个想法仍然存在,是可行的,并且是一个解决方案。所以我的问题仍然存在......为什么它不起作用?