совместное использование сеанса php в отчаянной попытке выполнить код в другой области - PullRequest
1 голос
/ 15 сентября 2011

Интересно, почему что-то подобное не работает (на самом деле не работает):

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 - это простая страница, которая задает только компонент username для $ _SESSION, затем записывает идентификатор сеанса в файл, после чего выводит значение $ _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

Даже если привести меня к интересной идее @ Ответ Бена был не точным ... На самом деле в куки хранится только идентификатор сессии, я заменил потребность в куки с помощью файла, чтобы cronjob знал, какая сессия должна После изменения я получил правильное значение для $ _SESSION ['username'] для любых "зарегистрированных" сеансов, но даже в этом случае я не смог изменить эти чертовы значения, как будто они были помечены только для чтения. Теперь, переосмысливая, я обнаружил, что идея все еще на ногах, жизнеспособность и решение вообще. Так что мои вопросы все еще заданы ... ПОЧЕМУ это не сработает?

Ответы [ 2 ]

1 голос
/ 15 сентября 2011

Хорошо, вот пример 3.php с удалением ненужного кода и добавлением "session_write_close ()" сразу после назначения данных. Не знаю, сработает ли это, но оно того стоит. Кроме того, цикл while (true), в котором нет ничего, что могло бы замедлить его, когда файл не существует, будет находиться там и использовать 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
}

?>
1 голос
/ 15 сентября 2011

Вот ваша проблема: 3.php is run by a cronjob.

Для сеанса требуются файлы cookie, для которых требуется веб-браузер и состояние браузера.Если вы запускаете сценарий как задание cron, сеанс отсутствует.

Решением вашей реальной проблемы, которую вы можете рассмотреть, является Runkit Sandbox: http://php.net/manual/en/runkit.sandbox.php

...