Каков наилучший способ отправки параметров в поддомен в PHP

#php #parameter-passing #subdomain

#php #передача параметров #поддомен

Вопрос:

У меня ситуация, и я не знаю, как ее решить. У меня есть домен с именем domain.com и поддомен с именем sub.domain.com

Теперь мне нужно выполнить некоторую обработку в PHP domain.com и я хочу передать некоторые переменные и получить ответ от sub.domain.com . Это может быть достигнуто с помощью массивов, закодированных в JSON. So,

  1. domain.com/process.php создает PHP-массив параметров (закодированных в JSON).
  2. domain.com/process.php называет sub.domain.com/index.php?key=validationKeyamp;params =…. для выполнения вычисления
  3. sub.domain.com/index.php?key=validation_keyamp;params =…. выполняет его вычисление, а затем возвращает массив, закодированный в JSON, в domain.com/process.php
  4. domain.com/process.php делает что-то с этими данными.

Как я могу этого добиться?

Заранее спасибо за любое решение

Комментарии:

1. Пожалуйста, объясните, чего вы пытаетесь достичь, а не как вы пытались это решить. Похоже, ваш подход может быть неправильным.

Ответ №1:

Очевидным решением здесь было бы выполнить PHP-код напрямую, но предполагая, что по какой-то причине это невозможно (sub.domain.com возможно, находится на другом сервере), затем вы можете отправлять данные туда и обратно с помощью cURL

Учитывая, что значительные объемы данных в строке запроса иногда могут быть проблематичными, в этом коде используется POST.

В domain.com ваш код будет выглядеть примерно так:

 <?php

$key = "validKey";
$data = json_encode(['data'=>[1,2,3], 'moreData'=>[4,5,6]]);
$payload = ['key'=>$key, 'params'=>$data];

echo "Setting up cURL<br>";

// I've used sub.domain.com here, but the URL could be anything
$ch = curl_init('http://sub.domain.com/processor.php');

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);

echo "Executing cURL<br>";
$result = curl_exec($ch);
$responseCode = curl_getinfo($ch, CURLINFO_RESPONSE_CODE );
if ($responseCode != "200") {
    exit("Error: Response $responseCode");
}
echo "Received response<br>";

$response = json_decode($result);
var_dump($response);
 

Код в sub.domain.com (Я назвал это ‘processor.php ‘ выше), тогда было бы:

 <?php

// Simple key validation function
function isValidKey(string $key):bool {
    // Do whatever validation you need here
    return ($key === "validKey");
}

// Simple entry validation. Return a 404 to discourage anyone just poking about
if (($_SERVER['REQUEST_METHOD'] !== 'POST') ||
    (empty($_POST['key']))
    ) {
    http_response_code(404);
    exit;
    }

    // Invalid key? return 401 Unauthorised
    if (!isValidKey($_POST['key'])) {
        http_response_code(401);
        exit;
    }

    // No params, or not JSON, return 400 Bad Request
    if (empty($_POST['params']) || (is_null($data=json_decode($_POST['params'])))) {
        http_response_code(400);
        exit;
    }

    // process data here. Return results

    header("Content-type: application/json");
    $result = ['status'=>'OK','answer'=>'Answer', "data"=>$data ];

    echo json_encode($result);
 

Если все работает, запустив domain.com код из браузера должен дать этот результат:

 Setting up cURL
Executing cURL
Received response

/home/domain.com/html/process.php:28:
object(stdClass)[1]
  public 'status' => string 'OK' (length=2)
  public 'answer' => string 'Answer' (length=6)
  public 'data' => 
    object(stdClass)[2]
      public 'data' => 
        array (size=3)
          0 => int 1
          1 => int 2
          2 => int 3
      public 'moreData' => 
        array (size=3)
          0 => int 4
          1 => int 5
          2 => int 6
 

Отказ от ответственности: это только проверенный концептуальный код. Он не готов к производству и прошел лишь элементарное тестирование.

Комментарии:

1. Большое спасибо! Я не могу дождаться, чтобы протестировать его. The sub.domain.com находится на том же сервере.

2. … или просто $response=unserialize(file_get_contents('http://$OHERSITE/?q=' . urlencode(serialize($params)));

3. @symcbean Нам не говорят, сколько данных необходимо отправить, только то, что это JSON. Использование строки запроса потенциально проблематично, если она превышает примерно 2048 символов. Это зависит от конфигурации сервера. Использование POST позволяет избежать этого.

4. Теперь я попробовал код.. В начале работал лучше всего, но теперь мне нужно обновить страницу, чтобы получить правильный ответ, а не null. Это нормально?

5. @TasteMyBomb Код предназначен только для того, чтобы показать, как все можно сделать, и прошел минимальное тестирование. Вам придется адаптировать его в соответствии с вашими конкретными требованиями. Если что-то работает не так, как вы ожидаете, вам нужно будет предоставить более подробную информацию о том, что вы делаете, и опубликовать код, который вы используете. Вероятно, это лучше всего сделать в качестве другого вопроса.