PHP: перенести большой массив между двумя сайтами - PullRequest
3 голосов
/ 03 декабря 2009

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

Я не могу использовать суперглобальный SESSION, поскольку он ограничен конкретным доменом. GET не подходит, так как массив слишком длинный. Я не уверен, подходит ли POST, и есть ли способ автоматически отправлять данные, не заставляя пользователя нажимать кнопку и отправлять какую-либо форму. Я знаю, что для этого можно использовать javascript, но я предпочитаю иметь что-то более надежное.

Я относительно новичок в PHP и хотел бы услышать о любых других способах выполнения этого. Спасибо!

Ответы [ 10 ]

4 голосов
/ 03 декабря 2009

Самый простой способ - использовать HTTP-библиотеку, такую ​​как cURL и setup, и отправить запрос POST на другой сайт. Также включение IP-адреса пользователя позволит вам связать опубликованные данные. Без JavaScript вы не сможете перенаправить пользователя с данными POST.

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

Нет ограничений на POST, как определено в спецификации HTTP, но вы можете столкнуться с проблемами при обработке этого на другом сервере (в зависимости от того, что вы имеете в виду в целом) в зависимости от конфигурации php. (Предел POST, по-моему, установлен по умолчанию на 8 МБ)

2 голосов
/ 03 декабря 2009

Я бы сделал что-то вроде этого:

  • генерация токена на сервере A (например, sha1 (метка времени + идентификатор сеанса + random ()))
  • используйте cURL для отправки сериализованного массива на сервер B, передавая сгенерированный токен
  • На сервере B хранить сериализованные данные и токен в таблице базы данных - поля: токен (CHAR), данные (BLOB)
  • перенаправить пользователя на http://ServerB/?data_token=[TOKEN GENERATED IN STEP 1]
  • Сервер B извлекает данные, связанные с токеном, из базы данных, удаляет запись в базе данных и сохраняет массив в новом сеансе пользователя.
2 голосов
/ 03 декабря 2009

Отправьте запрос HTTP POST через функции cURL и добавьте массив serialize () ed в тело запроса.

1 голос
/ 03 декабря 2009

Ваша проблема:

отправлено массив (ar) С Сервер (a) на Сервер (b)

Мое решение:

  1. Сервер (a) генерирует уникальный URL (url) для Сервер (b) , который содержит Array (ar) кодируется, например, в json с использованием json_encode (ar). Этот Array (ar) должен храниться в url с использованием, например, mysql или просто простого текстового файла.

    $uid = md5(uniqid(mt_rand(), true)); // to generate unique id
    
  2. Сервер (a) перенаправляет браузер на Сервер (b) , также содержащий $ uid

    $url = "http://server-b/page"; // url to page
    header('Location: $url?uid=$uid');
    
  3. Сервер (b) получает содержимое с url на Сервер (a) и декодирует содержимое обратно в Array (ar)

    $uid = $_GET['uid']; // uid
    $url_server_a = "http://server-a/webservice?uid=$uid";
    $ar = json_decode(file_get_contents($url_server_a));
    
1 голос
/ 03 декабря 2009

Что ж, если они оба находятся на одном сервере, вы можете захватить один сеанс для других. Я использовал это для перехода на защищенный сервер раньше, используйте функцию session_id () на первом хосте, чтобы получить сеанс, а затем используйте ту же функцию, чтобы установить его на втором хосте.

См. http://www.php.net/manual/en/function.session-id.php

0 голосов
/ 03 декабря 2009

Вы можете декодировать массив в JSON и отправить ссылку на второй сервер, который содержит загрузку для временного файла JSON, просто повторно декодируйте файл JSON обратно в PHP, и вам не придется использовать LONG URL. 1001 *

0 голосов
/ 03 декабря 2009

После создания массива вы можете быстро сгенерировать страницу с формой, содержащей данные в скрытом поле. Затем эта страница может автоматически отправить форму (с method = "POST") на ваш редирект.

0 голосов
/ 03 декабря 2009

Если бы это был я, я бы хранил информацию на каком-то другом носителе: например, в среде типа memcache или в базе данных, к которой оба могут обращаться.

0 голосов
/ 03 декабря 2009

Я бы посоветовал после создания «массива» связать его с идентификатором (и сохранить где-нибудь), а затем перенаправить на другой с этим идентификатором. С сайта 2, используя идентификатор, вы можете вызвать страницу на сайте 1, которая возвращает «Массив»

0 голосов
/ 03 декабря 2009

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

Редактировать: Я предполагаю, что они находятся на разных серверах, иначе было бы еще проще ...

...