PHP - Тип содержимого, не заданный приложением/x-www-form-urlencoded

В течение 2 дней у меня возникают проблемы с моим PHP script на моем сервере. Я ничего не изменил, и внезапно это не сработало.

Вот код:

$query = http_build_query($data);
$options = array(
    'http' => array(
        'header' => "Content-Type: application/x-www-form-urlencoded\r\n".
                    "Content-Length: ".strlen($query)."\r\n",     
        'method'  => "POST",
        'content' => $query,
    ),
);
$opts = array('http'=>array('header' => "User-Agent:MyAgent/1.0\r\n",'method'  => 'POST',
        'content' => http_build_query($data),));
$contexts = stream_context_create($opts);
$context  = stream_context_create($options);
$result = file_get_contents($url, false, $contexts, -1, 40000);

Я получаю эти сообщения об ошибках:

Примечание: file_get_contents(): тип содержимого, не указанный в предположении application/x-www-form-urlencoded в

Предупреждение: file_get_contents (https://mobile.dsbcontrol.de): не удалось открыть поток: HTTP-запрос не удался! Внутренний сервер HTTP/1.1 500 Ошибка в

Но когда я пытаюсь выполнить script локально, он отлично работает.

Ответ 1

Вы передаете $contexts в file_get_contents() и в нем содержится заголовок User-Agent в массиве $opts. Все остальные заголовки и параметры находятся в массиве $options, который вы добавляете в $context, но не используете. Попробуйте:

$query = http_build_query($data);
$options = array(
    'http' => array(
        'header' => "Content-Type: application/x-www-form-urlencoded\r\n".
                    "Content-Length: ".strlen($query)."\r\n".
                    "User-Agent:MyAgent/1.0\r\n",
        'method'  => "POST",
        'content' => $query,
    ),
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context, -1, 40000);

Ответ 2

Пока существующие ответы не сработали для меня, мне удалось решить проблему следующим образом:

Руководство PHP говорит, что params должен быть ассоциативным массивом в формате $arr['parameter'] = $value. Обратитесь к параметрам контекста для перечисления стандартных параметров потока.

    $header = array(
            "Content-Type: application/x-www-form-urlencoded",
            "Content-Length: ".strlen($postdata)
        );


    $packet['method'] = "POST";
    $packet['header'] = implode("\r\n", $header);
    $packet['content'] = $postdata;

    $transmit_data = array('http' => $packet);
    $context = stream_context_create($transmit_data);