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'] の値を変更しません。私は実際にそのような動作を期待していませんでした。スリープが十分ではないことはわかっていましたが、それでも、更新時に変更すべきではありませんか? ...

私のコードがひどいことはわかっています。これは単なるテストです。うまくいけば改善されるでしょう。

しかし、私はそれを理解していないようです。私は何を間違っていますか?実際、私は多くのことを間違っています。システム自体はこのように使用されるべきではありません。私もそれを知っていますが、それでも、今のところこれが私の唯一の選択肢です。私はこれについてもっと複雑な考えを持っていますが、これがうまくいかなければ他のものもうまくいきません。

私の意図は、実際には別のスレッドでコードを実行して、いくつかの変更を回避できるようにすることです(ファイルスキームのラッパーを登録し、必要なときにラッパークラス内で登録解除(復元)する権限がないなど)そこで作りました。非正統的な方法、私は知っています...

それで、何かアイデアを手伝ってもらえますか?ありがとうございました。

編集1

興味深いアイデアに私を導いたとしても、@ Benの答えは正確ではありませんでした...実際にはCookieにはセッションIDのみが保持されます。ファイルを使用してCookieの必要性を置き換え、cronjobがどのセッションを変更する必要があるかを認識しました「登録済み」セッションの $_SESSION['username'] の正しい値を取得しましたが、それでも、いまいましい値を変更できませんでした。読み取り専用とマークされているようでした。今、再考して、私はそのアイデアがまだ足元にあり、実行可能であり、解決策であることに気づきました. 私の質問はまだ残っています...なぜうまくいかないのですか?

4

2 に答える 2

1

3.phpでは、不要なコードを削除して、データ代入の直後に「session_write_close()」を追加した例を示します。うまくいくかどうかはわかりませんが、試してみる価値はあります。また、ファイルが存在しないときに速度を落とすものがない while(true) ループは、そこに座って (サーバーが強制終了するまで) CPU を 100% 使用します。ファイル システムへの一定のアクセスは言うまでもありません。本当に、それを抑えるためにそこに睡眠を追加する必要があります. だから、さらに苦労せずに:

<?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 に答える
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 に答える