Передача значений между 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 - после этого у вас есть доступ к параметрам каждого сеанса.