Ответ 1
Просто установите CURLOPT_HEADER
на false.
У меня есть php script, который возвращает только обычный текст без любого html. Теперь я хочу сделать запрос cURL на этот script, и я получаю следующий ответ:
HTTP/1.1 200 OK
Date: Mon, 28 Feb 2011 14:21:51 GMT
Server: Apache/2.2.14 (Ubuntu)
X-Powered-By: PHP/5.2.12-nmm2
Vary: Accept-Encoding
Content-Length: 6
Content-Type: text/html
6.8320
Ответ на срабатывание всего 6.8320 как текст без какого-либо html. Я хочу извлечь его из ответа выше, просто удалив информацию заголовка.
Я уже немного сократил script:
$url = $_GET['url'];
if ( !$url ) {
// Passed url not specified.
$contents = 'ERROR: url not specified';
$status = array( 'http_code' => 'ERROR' );
} else if ( !preg_match( $valid_url_regex, $url ) ) {
// Passed url doesn't match $valid_url_regex.
$contents = 'ERROR: invalid url';
$status = array( 'http_code' => 'ERROR' );
} else {
$ch = curl_init( $url );
if ( strtolower($_SERVER['REQUEST_METHOD']) == 'post' ) {
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $_POST );
}
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $ch, CURLOPT_HEADER, true );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_USERAGENT, $_GET['user_agent'] ? $_GET['user_agent'] : $_SERVER['HTTP_USER_AGENT'] );
list( $header, $contents ) = preg_split( '/([\r\n][\r\n])\\1/', curl_exec( $ch ), 2 );
$status = curl_getinfo( $ch );
curl_close( $ch );
}
// Split header text into an array.
$header_text = preg_split( '/[\r\n]+/', $header );
if ( true ) {
if ( !$enable_native ) {
$contents = 'ERROR: invalid mode';
$status = array( 'http_code' => 'ERROR' );
}
// Propagate headers to response.
foreach ( $header_text as $header ) {
if ( preg_match( '/^(?:Content-Type|Content-Language|Set-Cookie):/i', $header ) ) {
header( $header );
}
}
print $contents;
}
Любая идея, что мне нужно изменить, чтобы удалить информацию заголовка из ответа?
Просто установите CURLOPT_HEADER
на false.
Сделайте это после вашего зависания:
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);
Просто для последующего использования, если кому-то еще нужно. Я был в той же ситуации, но мне просто нужно удалить текст заголовка, а не контент. Ответ, который я получал в заголовке, был (включая пробел):
HTTP/1.1 200 OK
Cache-Control: private, no-cache, no-store, must-revalidate
Content-Language: en
Content-Type: text/html
Date: Tue, 25 Feb 2014 20:59:29 GMT
Expires: Sat, 01 Jan 2000 00:00:00 GMT
Pragma: no-cache
Server: nginx
Vary: Cookie, Accept-Language, Accept-Encoding
transfer-encoding: chunked
Connection: keep-alive
Я хотел удалить из HTTP, чтобы сохранить его с пробелом:
$contents = preg_replace('/HTTP(.*)alive/s',"",$contents);
который сделал для меня.
Обновить значение CURLOPT_HEADER до 0 для false
curl_setopt($ch, CURLOPT_HEADER, 0);
Если вы используете nuSoap
, вы можете получить доступ к данным без заголовков с помощью $nsoap->responseData
или $nsoap->response
, если вы хотите получить полные заголовки.
На всякий случай кому-то это нужно.
Если по какой-то причине вам нужно curl_setopt($ch, CURLOPT_HEADER, 1);
получить файлы cookie, например, для меня это работало. Не уверен, что он на 100% надежный, но стоит попробовать
$foo = preg_replace('/HTTP(.*)html/s',"",$curlresult);
$content = null;
$ch = curl_init();
$rs = curl_exec($ch);
if (CURLE_OK == curl_errno($ch)) {
$content = substr($rs, curl_getinfo($ch, CURLINFO_HEADER_SIZE));
}
curl_close($ch);
echo $content;
Если кто-то уже сохранил ответ curl в файл (как я) и поэтому не знает, насколько большим был заголовок для использования substr, попробуйте:
$file = '/path/to/file/with/headers';
file_put_contents($file, preg_replace('~.*\r\n\r\n~s', '', file_get_contents($file)));
Просто не устанавливайте curl_header
в запросе завивки или не устанавливайте его на z or false
как это curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HEADER, false);
Просто не устанавливайте CURLOPT_HEADER
!