file get content — Тайм-аут для file_get_contents не работает в переполнении стека

Я создал класс для использования некоторых HTTP-методов в PHP. Здесь у меня есть метод для HTTP POST

public function post ($content, $timeout=null)
{
$timeInit = new DateTime();

$this->method = 'POST';$header = array();
$header['header'] = null;
$header['content'] = is_array($content) ? http_build_query($content) : $content;
$header['method'] = $this->method;
if ($timeout != NULL) {
$header['header'] .= "timeout: $timeout"}
$header['header'] .= "Content-length: ".strlen($header['content']);$headerContext =  stream_context_create(array('http' => $header));
$contents = file_get_contents($this->url, false, $headerContext);
$this->responseHeader = $http_response_header;

$timeFinal = new DateTime();
$this->time = $timeInit->diff($timeFinal);

return $contents;
}

По сути, я создаю заголовок $ и использую file_get_contents для размещения некоторого содержимого $ в URL.
Судя по всему, все работает нормально, кроме $ timeout. Это не считается. Например, даже когда я установил его на 1.

Я не вижу ничего плохого и не могу получить заголовки, которые отправляю.

Другие подобные вопросы здесь, в SO, предлагают использовать Curl (я использовал его, но я изменяю для file_get_contents по другим причинам) или fsockopen, но это не то, что мне нужно.

Существует какой-либо способ установить время ожидания с помощью file_get_contents?

4

Решение

за stream_context_create() http://php.net/manual/en/function.stream-context-create.php это нужно [ array $options [, array $params ]]
когда вы передаете $header не похоже, что вы строите массив правильно. будет что-то вроде этой работы?

public function myPost($content, $timeout = null)
{
$timeInit = new DateTime();

$this->method = 'POST';$header = array();
$header['header'] = null;
$header['content'] = is_array($content) ? http_build_query($content) : $content;
$header['method'] = $this->method;

if ($timeout) {
$header['header']['timeout'] = $timeout;
}

$header['header']['Content-length'] . strlen($header['content']);
$headerContext = stream_context_create(array('http' => $header));
$contents = file_get_contents($this->url, false, $headerContext);
$this->responseHeader = $http_response_header;

$timeFinal = new DateTime();
$this->time = $timeInit->diff($timeFinal);

return $contents;
}

но лучше было бы использовать его, как говорит пример, например,

$timeInit = new DateTime();

// all your defaults go here
$opts = array(
'http'=>array(
'method'=>"POST",
)
);

//this way, inside conditions if you want
$opts['http']['header']  = "Accept-language: en\r\n" .  "Cookie: foo=bar\r\n";
$context = stream_context_create($opts);
1

Другие решения

Конечно, есть, но ваш контекст options был неверен, проверьте пример ниже:

<?php

set_time_limit(0);
ignore_user_abort(1);

$opts = array('http' =>
array(
'method'=>"POST",
'timeout' => 60
)
);

$context  = stream_context_create($opts);
$result = file_get_contents($url, false, $context);

Замечания:

В зависимости от конфигурации удаленного сервера вам может потребоваться установить Content-Length а также Content-type в ваших контекстных опциях.


Рекомендации:

file_get_contents

2