Почему stream_context_create возвращает null?

Хочу отправить POST-запрос на PHP.

$rContext = stream_context_create(
  [
    'http' => [
      'method'  => 'POST',
      'header'  => "Content-Type: application/x-www-form-urlencoded\r\n",
      'content' => http_build_query(
        [
          'type'     => 'confirmation',
          'group_id' => 1
        ]
      )
    ]
  ]
);

$sResult = file_get_contents('...', false, $rContext);


И получаю, что переменная $rContext = null.
Почему?
  • Вопрос задан
  • 65 просмотров
Решения вопроса 1
@GSV4 Автор вопроса
Наконец-то я понял, в чём было дело!

1. Функция var_export, если ей передать параметр-ресурс, всегда возвращает NULL, т.к. не может представить содержимое ресурса на PHP-языке. А вот функция print_r в этом случае возвращает строку "Resource id #N", где N - некоторый номер.

2. Мой 1-й скрипт получал NULL из-за несоответствия данных: 2-й скрипт отправлял ему данные в формате "application/x-www-form-urlencoded", а он обрабатывал их как json-данные.

Так что вот правильный вариант.
1-й скрипт:
<?php
/*
  01.php
*/

require_once 'GSDebug2.php';

$sF_Script = basename(__FILE__);
$oShowVars = new CShowVars($sF_Script);

echo "Скрипт \"$sF_Script\": Начало работы.<br>";
$sInput = file_get_contents('php://input');

$oShowVars->Do(
  '$sInput', $sInput
);

echo "Скрипт \"$sF_Script\": Конец работы.<br>";
exit;
?>


2-й скрипт:
<?php
/*
  02.php
*/

require_once 'GSDebug2.php';

$oShowVars = new CShowVars(basename(__FILE__));

echo '<pre>';
echo 'Отправка запроса на сервер...<br>';

$rContext = stream_context_create(
  [
    'http' => [
      'method'  => 'POST',
      'header'  => 'content-type: application/json',
      'content' => json_encode(
        [
          'type'     => 'confirmation',
          'group_id' => 1
        ]
      )
    ]
  ]
);

$sResult = file_get_contents('http://.../01.php', false, $rContext);
echo 'Ответ сервера:<br>', $sResult, '<br>';

$oShowVars->Do(
  '$rContext', $rContext
);

echo '</pre>';
exit;
?>


И вспомогательный скрипт для отладки:
<?php
/*
  GSDebug2.php
*/

// Класс CShowVars
// ====================================================================================================

class CShowVars
/*
  Выводит значения переменных (выражений) в окно браузера.
*/
{
  public string $sTitle;
  private $asLine = [];

  public function __construct(string $_sTitle = '')
  /*
    ПАРАМЕТРЫ
      $_sTitle
        Заголовок блока, выводимого в браузере.
        Заголовок не является обязательным. Наличие заголовка позволяет понять, из какого скрипта осуществляется вывод.
  */
  {
    if ($_sTitle) $_sTitle = ' ' . $_sTitle . ' ';
    $this->sTitle = $_sTitle;
  }

  public function Do()
  /*
    Выводит имена и значения указанных переменных и/или выражений в окно браузера.

    ПАРАМЕТРЫ
      Функция рассчитана на чётное количество параметров.
      Каждый нечётный параметр должен представлять собой имя переменной (выражения),
      каждый чётный - значение этой переменной (выражения).
      Если имя переменной будет пустой строкой, функция выведет в окно пустую строку как разделитель.

    ПРИМЕР
      $oShowVars->Do(
        '$_sMailsTo', $_sMailsTo,
        '$_sHiddenMailsTo', $_sHiddenMailsTo
      );

      В окне браузера будет выведено:

      ///////////////////////////////////////////////////////////////////////////////////////////////////////
      || $_sMailsTo = 'gsv4@inbox.ru'
      || $_sHiddenMailsTo = 'admin@cc-s.ru'
      \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  */
  {
    $iSepLen = 100;
    $iSepPadLen = $iSepLen - mb_strlen($this->sTitle);
    $iSepPadLenL = $iSepPadLen >> 1;
    $iSepPadLenR = $iSepPadLen - $iSepPadLenL;

    $sSepA = str_repeat('/', $iSepPadLenL) . $this->sTitle . str_repeat('/', $iSepPadLenR);
    $sPrefix = '|| ';
    $sSepB = str_repeat('\\', $iSepLen);

    $iTotalParams = func_num_args();

    if ($iTotalParams < 2 || $iTotalParams & 1)
      throw new Exception('CShowVars::Do: Функция рассчитана на чётное количество параметров!');

    $asLine = $this->asLine;
    $asLine = [$sSepA];
    $i = 0;

    foreach (func_get_args() as $xArg) {
      if (++$i & 1)
        $sVarName = $xArg;
      else if ($sVarName === '')
        $asLine[] = $sPrefix;
      else {
        $sVarType = gettype($xArg);

        switch ($sVarType) {
          case 'integer':
            $asLine[] = $sPrefix . $sVarName . ' = [' . $sVarType . '] ' . number_format($xArg, 0, ',', ' ');
            break;

          case 'array':
          case 'object':
            $asVarValue = explode("\n", var_export($xArg, true));
            $asLine[] = $sPrefix . $sVarName . ' = ' . array_shift($asVarValue);
            foreach ($asVarValue as $sVarValue) $asLine[] = $sPrefix . $sVarValue;
            break;

          case 'resource':
          case 'resource (closed)':
            $asLine[] = $sPrefix . $sVarName . ' = [' . $sVarType . '] ' . print_r($xArg, true);
            break;

          default:
            $asLine[] = $sPrefix . $sVarName . ' = [' . $sVarType . '] ' . var_export($xArg, true);
        }
      }
    }

    $asLine[] = $sSepB;
    echo implode(PHP_EOL, $asLine), PHP_EOL;
    $asLine = [];
    return true;
  } // function Do()
} // class CShowVars
?>


Результат работы 2-го скрипта:
Отправка запроса на сервер...
Ответ сервера:
Скрипт "01.php": Начало работы.
////////////////////////////////////////////// 01.php //////////////////////////////////////////////
|| $sInput = [string] '{"type":"confirmation","group_id":1}'
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Скрипт "01.php": Конец работы.

////////////////////////////////////////////// 02.php //////////////////////////////////////////////
|| $rContext = [resource] Resource id #3
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
stream_context_create() возвращает только resource т.ч. null там быть не может в принципе
Ответ написан
Ваш ответ на вопрос

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

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