1

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

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'] 的正确值,但即便如此,我也无法修改该死的值,就像它们被标记为只读一样。现在,重新考虑,我发现这个想法仍然存在,是可行的,并且是一个解决方案。所以我的问题仍然存在......为什么它不起作用?

4

2 回答 2

1

这是你的问题:3.php is run by a cronjob

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

您可能要考虑的实际问题的解决方案是 Runkit Sandbox:http ://php.net/manual/en/runkit.sandbox.php

于 2011-09-15T11:40:38.677 回答
1

好的,这是一个删除不必要代码的示例3.php,并在数据分配后立即添加了“session_write_close()”。不知道它是否会起作用,但值得一试。此外,当文件不存在时,没有任何东西可以减慢它的 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
}

?>
于 2011-09-15T15:36:32.603 回答