Я создал класс для использования некоторых 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?
за 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);
Конечно, есть, но ваш контекст 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
в ваших контекстных опциях.
Рекомендации: