php会话共享,试图在不同的范围内执行代码

php会话共享,试图在不同的范围内执行代码,php,session,ipc,cron-task,Php,Session,Ipc,Cron Task,我想知道为什么这样的东西不起作用(实际上不起作用): 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); /

我想知道为什么这样的东西不起作用(实际上不起作用):

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'];

?>
<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秒钟内)预期的结果。。。$\u GET['test']的值

但是它并没有修改$_SESSION['username']的值,我甚至没想到会有这样的行为。事实上,我知道睡眠是不够的,但在刷新时,它不应该被修改吗

我知道我的代码很糟糕,这只是一个测试,如果它能工作,它会得到改进

但我似乎没有弄明白。我做错了什么? 其实我做了很多错事,系统本身不应该这样使用,我也知道,但是,现在这是我唯一的选择。关于这件事我有更复杂的想法,但如果这不起作用,其他的也不会起作用

实际上,我的意图是在单独的线程中执行代码,这样我就可以逃避我在那里所做的一些更改(比如为文件方案注册一个包装器,并且在需要的时候,在包装器类中没有取消注册(还原)它的能力)。非正统的方法,我知道

那么,你能帮我提些建议吗?多谢各位

编辑1 即使让我产生一个有趣的想法@Ben的答案并不准确。。。实际上,在Cookie中,只有会话id,我使用一个文件替换了对Cookie的需求,这样cronjob就知道应该修改哪个会话,对于任何“已注册”会话,我都得到了$u session['username']的正确值,但即使如此,我也无法修改该死的值,就像它们被标记为只读一样。现在,经过重新考虑,我发现这个想法仍然可行,而且是一个解决方案。
所以我的问题还没解决。。。为什么它不能工作?

这是您的问题:
3.php由cronjob运行

会话需要Cookie,这需要web浏览器和浏览器状态。如果将脚本作为cron作业运行,则没有会话


您可能要考虑的一个解决方案是RunKITE沙箱:

OK,所以这里有一个例子:<代码> 3。PHP<代码>,删除了不必要的代码,并且在数据分配之后立即添加了“SeStuxWrreEffeleCo()”。不知道它是否有效,但值得一试。此外,当文件不存在时,一个while(true)循环(没有任何东西可以减慢它)将占用100%的cpu(直到服务器杀死它),更不用说持续的文件系统访问了。真的,你应该在那里加上睡眠来控制它。因此,毋庸置疑:

<?php

while(true)
{
    if(file_exists("comm.g"))
    {
        $c = file("comm.g");
        unlink("comm.g");

        foreach($c as $k => $v)
        {
            if($v != '')
            {
                session_id($v);
                session_start();
                file_put_contents("result.cc", $_SESSION['username'].'---'.$v.'END'.PHP_EOL.PHP_EOL, FILE_APPEND);
                $_SESSION['username'] = 'somethingelse';
                session_write_close();
            }
        }
    }
    usleep(200000); // Sleep for 1/5 of a second, to avoid a 100% cpu hog and constant stream of file system accesses
}

?>


Runkit Sandbox可能确实是一个解决方案,但不幸的是,它不是一个解决方案。所以我不能安装任何扩展。在那些可用的人之间,这不在他们之中。@blind,啊,我现在看到了。您的
session\u start()
位于
foreach()
上方,这让我感到厌烦——这一行在cron上下文中不应该做任何事情,因此我甚至没有真正研究您的其余代码。此外,不需要保存会话id并在该循环中恢复它。cron没有要存储的本机会话!也就是说,这可能会失败有很多微妙的原因。我建议删除所有不必要的代码,然后在更改值后添加“session_commit()”。我不知道这是否能解决问题,但这是可能的。我将添加另一个带有代码示例的答案,是的,会话提交与会话写入关闭相同,但我的意思是将其放在数据之后,而不是在您更改回会话之前。您将在代码示例中看到我的意思。现在,奇怪的是,它没有在result.cc中获得$\u SESSION['username']的值。。。错误日志显示如下内容:[date time]PHP警告:session_start()[]:无法发送会话缓存限制器-第15行的/***/3.PHP中已发送的头或[date time]PHP警告:session_start()[]:无法发送会话cookie-第15行的/***/3.PHP中已发送的头15@blind哦,,我刚刚意识到你正在使用
我已经检查过了,在我留下评论之前,我想,否则我会返回编辑它。。。无论如何,我现在测试了它,在4.php中添加了一个小的修改,在它被修改为$\u GET['test']之前,一个“echo”来查看$\u会话['username']。。。但是result.cc中的输出仍然是:
-9eb425a474c8c13d925edee9c1da2011
END
不幸的是,用户会话好像已经关闭了。。。因为comm.g中的会话id是无用的