Способы обмена данными между PHP сценариями?

Привет и доброго времени суток всем.

Сразу извиняюсь за глупый на мой взгляд вопрос, но уже 3-ий день гугление не дает результатов. Единственное что оно показало, что люди часто встречаются с данной проблемой но так и не находят решения (костыли не в счет).

Собственно возникла задача передать, при нажатии на ссылку, из одного скрипта другому несколько переменных, так чтобы эти данные небыли видны обычному пользователю.

Первое что приходит на ум когда мы слышим о передачи данных между php сценариями это get и post запросы.
Вариант с GET не подходит, ибо данные явно висят в url.
С POST дела обстоят гораздо лучше, но через обычную ссылку их не передашь, нужно имитировать форму и так дале… как мне кажется тже не самы удачный вариант.

Также на ум пришло передавать параметры при помощи сессий. Например создать служебную сессию, и в случае необходимости передачи параметра, записывать его в нее.

Еще на ум пришли куки, но слабо себе это представляю нужно постоянно следить за тем чтобы в них не осталось ничего лишнего.

Вот собственно и вопрос, как можно решить данную проблему? Есть ли методы в PHP специально созданные для данной ситуации. Как вы решаете такую задачу? Неужели не обойтись без костылей (js, ajax, cookies, sessions итд).

Спасибо за ваши ответы!
  • Вопрос задан
  • 11676 просмотров
Пригласить эксперта
Ответы на вопрос 6
Вопрос поставлен не совсем корректно, т.к. может быть 2 трактовки:

1. Если речь идет о веб-скриптах, которые выполняются последовательно, то чем вам не нравится сессия? В данном случае это не костыль — она именно для этого и придумана. Если не нравится непосредственно стандартная реализация, то можно взять собственную (принципиально аналогичную): генерировать ID клиента (сессии) и передавать его через get/post/cookie (по вкусу), а уже сами данные хранить либо в файлах, либо в базе данных, и получать с помощью этого идентификатора в качестве ассоциативного ключа.

Непосредственно данные через куки, гет и пост передавать естественно в данном случае не стоит: эти вещи всегда можно подделать, т.к. они идут через клиента. Это можно назвать костылем :)

================
2. Если же речь идет о выполняющихся одновременно 2 шелл-скриптах, т.е. межпроцессное взаимодействие (IPC), то тут можно использовать разные более или менее системно-зависимых вариантов. От стандартных механизмов IPC: семафоры, сообщения, шаред блок памяти, до специфичных вещей вроде именованного пайпа или сокета; или же аналогичных п.1 вещей (база данных/файлы).
Ответ написан
cookies не костыль, собственно для этого они и придуманы (сессия — дальнейшее развитие идеи)

А у вас противоречие в условиях, по-моему:
Вариант с GET не подходит, ибо данные явно висят в url противоречит но через обычную ссылку их не передашь. Либо данные висят в урл, либо через обычную ссылку (без дополнительных скриптов на клиентской стороне) их не передать. Третьего не дано.

Может устроит вариант:
1. На исходной странице обычная GET ссылка на промежуточную страницу с данными в URL, нажимаем
2. Сервер принимает данные, пишет их в сессию и делает редирект на целевую страницу без данных в URL
3. Целевая страница достаёт данные из сессии и тут же сессию очищает.

Если пользователь не смотрит куда ведёт ссылка (или его браузер не показывает), то данные в URL мелькнут в адресной строке очень не надолго на современном ненагруженном компе и быстром инете.

Опять же если стоит задача скрыть от пользователя данные полностью, то это не реально, мониторить трафик умеют сейчас все популярные браузеры. Можно усложнить жизнь шифруя данные, но только усложнить. А для защиты от случайной утечке данных по сценарию типа «ломщик увидел секретный url, запомнил и дома его ввёл» моего сценария, имхо, достаточно.
Ответ написан
Комментировать
shvedovka
@shvedovka
Тоже костыль, но без js, ajax, cookies, sessions итд, как вы и просили.

Сценарий вызывает другой сценарий по URL любым удобный для вас способом, передавай параметре в хоть GET который пользователю, все равно, не будет виден.

Простейший вариант (если включен allow_url_fopen):
$answer = file_get_contents('http://www.example.com/script2.php?param1=A&param2=B');

При желании можно даже что-то вернуть и это использовать.
Ответ написан
Комментировать
BupycNet
@BupycNet
Основатель PushAll
Если внутри сервера с одной софтинки на другую то тут несколько вариантов
1. файлы (пишем, открываем другой, читаем, используем)
2. бд (тоже самое)
3. сессия (почти тоже самое только еще проще)
4. memcached (почти тоже самое, неплохой вариант)
Ответ написан
Комментировать
@avorobiev
Хм, вы же сами все варианты перечислили. Другое пока не изобретено. Просто напишите плюсы и минусы в реализации для каждого, и выберите лучшее.
По мне, так ссылка должна выполнять GET-запрос, соответственно все данные в URL. Редиректить, чтобы скрыть что-то — ерунда какая-то.
Кнопка может выполнять пост-запрос.
Если очень-очень надо ссылку заставить делать POST-запрос, используйте javascript.
И GET и POST прозрачны для мониторинга. Чтобы параметрами в них не злоупотребляли используйте валидацию на серверной стороне. Отсекайте невалидные запросы.
Если надо хранить состояние между страницами, так, чтобы пользователь даже не знал, что вы там для него храните — используйте сессии, передавая в куки только идентификатор сессии, а не сами хранимые значения.
Ответ написан
Комментировать
проще всего $_SESSION

если хочется сложнее, то под каждого пользователя создаётся уникальный id, а на сервере где-то (MySQL, membase, /tmp/,...) хранится хеш uid => data
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы