Передача значений между PHP-скриптами в этой конкретной ситуации

Так что в моей HTML-разметке у меня есть такой тег изображения:

<img src="image_generation.php" alt="template" id="image" />

А атрибут 'src' ссылается на PHP-скрипт, который генерирует изображение, используя несколько определенных здесь переменных, которые в основном генерируются случайным образом.

Теперь я хочу получить доступ к этим случайным переменным на странице, которая включает скрипт генерации изображения. Я полагаю, что мог бы отправлять куки и получать к ним доступ после тега изображения, поскольку они технически должны быть легко доступны для включаемого файла. Я не хочу посылать слишком много информации, просто пару (10-20) переменных. Не уверен, что в этом случае сеансы будут лучшим выбором, так как мне придется отправить несколько файлов cookie. Сессии также представляют проблему, так как включающий скрипт получает старый сеанс, и мне пришлось бы обновить страницу, чтобы получить значения ранее сгенерированного изображения. Я полагаю, что я мог бы также настроить БД и получить доступ к БД в сценарии включения, но переменные являются временными, и мне пришлось бы их удалить, и мне это кажется большой суматохой.

Сценарий генерации изображения заканчивается:

header('Content-type: image/png');
imagepng($image);
imagedestroy($image);

И ничто не может быть отправлено в браузер до вызова заголовка, иначе изображение не будет отображаться. Если я использую куки или сеансы, image_generation.php придется отправить оба изображения и установить cookie(s)/ сеанс.

Ни один из вариантов (куки, сеансы или БД) на самом деле меня не убеждает, так как есть проблемы с каждым из них в данной конкретной ситуации. Можете ли вы придумать способ решить эту проблему? Благодарю.

ОСНОВНОЕ РЕДАКТИРОВАНИЕ № 1: Включающий скрипт получает сессию ранее сгенерированного изображения без обновления / установки файлов cookie и / или сеанса во включенном скрипте до / после отправки изображения без буферизации вывода, не представляет проблемы.

2 ответа

Решение

Вы можете использовать $_SESSION, но сделать сеанс доступным в том же сценарии, который включал <img> тег (который будет выполняться до сценария изображения), вам нужно будет делать вызовы AJAX через JavaScript. Обработчик AJAX, который работает в window.onload должен иметь доступ к $_SESSION созданный сценарием изображения, так как изображение должно быть полностью загружено при запуске.

Пример обработчика PHP getsession.php:

header('Content-type: application/json');
// Simply part of the session into JSON
// Obviously you would want to limit this to only the variables 
// that should be sent back, so you don't expose the session on the client side!
echo json_encode(array($_SESSION['var1'],$_SESSION['var2']));
exit();

Пример вызова AJAX (с использованием jQuery, поскольку с ним будет легко начать)

// Variable to hold the object returned by PHP
var imgPHPSession;
$(window).load(function() {
  $.ajax({
    url: 'getsession.php',
    dataType: 'json',
    success: function(data) {
      imgPHPSession = data;
    }
  });
});

Обновить:

Это может быть сделано полностью в PHP, но потребует немного изменить дизайн, чтобы переменные, необходимые для создания изображения, создавались в $_SESSION по основному сценарию. Затем они доступны в $_SESSION к image_generation.php, который будет использоваться по мере необходимости, но уже известен основному скрипту.

Обновление 2:

Поскольку переменные изображения содержат информацию о том, как оно было создано, если изображение не слишком большое, вы можете создать его в основном сценарии и сохранить на диске. Скрипт image_generation.php все еще может использоваться как <img src>, но его целью будет получить правильное изображение с диска и отправить его обратно в браузер и удалить его с диска, когда он больше не нужен. $_SESSION Затем доступен как основной, так и графический сценарии.

Вы можете передать свои параметры в атрибут src, например:

<img src="image_generation.php/user/1/name/tom/param1/variable2"

или же

<img src="image_generation.php?user=1&name=tom

это решение позволяет забыть о сеансе, куки - без сохранения состояния

Php может делать умные трюки с буфером с помощью функции ob_*, поэтому в начале вашего скрипта вы можете вызвать ob_start() для буферизации каждого вывода php, что позволяет вам избежать всех ошибок "Заголовок уже отправлен".

Ваш файл image_generation.php не должен отправлять файлы cookie. Этот скрипт будет получать cookie с sessionid (браузер прикрепляет информацию cookie к каждому запросу к серверу), что позволяет идентифицировать пользовательский сеанс на стороне php - после этого у вас есть доступ к параметрам каждого сеанса.

Другие вопросы по тегам