PHP $ _SESSION недоступен, пока страница не будет перезагружена. Зачем? - PullRequest
2 голосов
/ 25 октября 2010

Я создаю график, который выполняет некоторые запросы к базе данных, затем строит график с использованием функций GD, а затем помещает информацию из базы данных в массив, который хранится в $ _SESSION ['my_data']. Этот график отображается на веб-странице с использованием тегов img.

<img src="my_graph.php?time=$time">

<?
    print_r($_SESSION['my_data']);
?>

Проблема в том, что когда я печатаю массив из переменной сеанса, он не печатает данные текущих графиков; он печатает данные, которые были в графике в последний раз, когда страница была загружена. Он действует как печенье.

Я попытался поместить session_write_close () сразу после сохранения массива в сеансе, потому что я думал, что $ _SESSION мог быть заблокирован, пока my_graph.php не закончил загрузку изображения. Это не сработало.

Я также пытался поставить sleep (10) перед печатью массива, но это не сработало.

Почему это произойдет?

Ответы [ 3 ]

2 голосов
/ 25 октября 2010

Полагаю, когда ваш веб-сервер выполняет код PHP, который рисует нашу страницу, он уже имеет инициализированный массив $ _SESSION. И этот массив не обновляется во время выполнения текущего скрипта. Когда браузер находит тег изображения, он делает еще один запрос к веб-серверу, который выполняет сценарий генерации изображения, который обновляет массив $ _SESSION в другой среде выполнения.

Вы можете:

  • либо сделайте все вычисления в коде генерации вашей веб-страницы
  • или перезагрузите страницу после того, как скрипт генерации изображения завершит вычисления и установит все необходимые данные в массиве $ _SESSION
1 голос
/ 25 октября 2010

Если вы установите $_SESSION['my_data'] в mygraph.php, вы никогда не увидите изменения $_SESSION, пока ваш браузер не запросит mygraph.php. Это никогда не произойдет, пока вывод не будет сброшен в браузер (который будет ПОСЛЕ того, как вы уже print_r() $_SESSION).

Возможно, вы сможете попробовать flush() и надеяться, что браузер запрашивает изображение до того, как вы закончите выполнение, я никогда не пробовал (не уверен, будет ли оно работать) Хотя иногда приходится дополнять вывод пробелами до тех пор, пока он не достигнет 2 Кб (если я не ошибаюсь). Я бы не рекомендовал это, хотя.

Другим решением было бы запросить страницу с кодом, указанным выше, в src. Так что если ваш код выше в test.php, вы можете поставить <img src="test.php?img=true&time=$time">. Затем, если вы получите $_GET['img'], отобразите изображение, в противном случае выполните некоторый код. Имеет ли это смысл?

0 голосов
/ 25 октября 2010

Последовательность событий:

  1. Браузер запрашивает главную веб-страницу.
  2. PHP запускает главную страницу и отправляет содержимое в браузер.
  3. Браузер получает страницу.
  4. Браузер просматривает страницу и отправляет запросы на загрузку графики и т. Д.
  5. PHP запускает graph.php и отправляет изображение в браузер.
  6. Браузер вставляет изображение на страницу.

Важная вещь, на которую следует обратить внимание, это то, что весь пункт 2 возникает до того, как произойдет любой из пунктов 5. Это означает, что все, что делает graph.php с $ _SESSION, не будет видно для кода на главной странице, что приведет к эффекту, который вы видите.

Такова природа веб-страницы: графические файлы отделены от основной программы PHP.

Вы не можете обойти это, используя отдельный графический файл так, как вы это делаете.

Есть один способ, которым я могу думать о достижении этого, но это будет полное переписывание (решать вам, стоит ли оно того!)

Можно создать график, используя Javascript. Если вы сгенерируете код javascript для этого на главной странице, вы можете установить $ _SESSION во время кода генерации графа, и он будет доступен позже в программе.

Если вы решили сделать это, вам следует обратиться к библиотеке gRaphael , чтобы помочь вам.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...