У меня есть код cURL
в php.
curl_setopt($ch, CURLOPT_URL, trim("http://stackoverflow.com/questions/tagged/java")); curl_setopt($ch, CURLOPT_PORT, 80); //ignore explicit setting of port 80 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_ENCODING, ""); curl_setopt($ch, CURLOPT_HTTPHEADER, $v); curl_setopt($ch, CURLOPT_VERBOSE, true);
Содержимое HTTPHEADER
:
Proxy-Connection: Close User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1017.2 Safari/535.19 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 Cookie: __qca=blabla Connection: Close
Каждый из них – отдельные элементы массива $v
.
Когда я загружаю файл на свой хост и запускаю код, то получаю:
ошибка 400, неверный запрос
- Замена CURL на urlfetch в PHP
- API API Analytics: неверный запрос - invalid_grant
- Может ли AWS SDK для PHP работать без отключения проверки SSL на osx?
- Отправить строку как файл с помощью curl и php
- PHP curl_getinfo ($ ch, CURLINFO_CONTENT_TYPE) не возвращает кодировку
Ваш браузер отправил неверный запрос.
Но когда я запускаю его в своей системе с помощью командной строки PHP, то, что я получаю,
< HTTP/1.1 200 OK < Vary: Accept-Encoding < Cache-Control: private < Content-Type: text/html; charset=utf-8 < Content-Encoding: gzip < Date: Sat, 03 Mar 2012 21:50:17 GMT < Connection: close < Set-Cookie: buncha cokkies; path=/; HttpOnly < Content-Length: 22151 < * Closing connection #0
,
Дело не только в stackoverflow, это происходит, это происходит и на 4shared, но работает на google и других.
Спасибо за любую помощь.
Это скорее комментарий, чем ответ. Из вашего вопроса неясно, что конкретно вызывает ошибку 400, а что конкретно означает это или более конкретное: источник этого.
Это результат вашего сервера? Это какая-то обратная связь (отклик), которую вы выдаете со своим скриптом?
Чтобы лучше отлаживать вещи, я придумал немного другую конфигурацию, которую вы могли бы заинтересовать при использовании расширения curl. Существует хорошая функция curl_setopt_array
которая позволяет вам сразу установить несколько параметров. Он вернет false, если один из вариантов завершится с ошибкой. Он позволяет настроить ваш запрос в полном объеме. Таким образом, вы можете легко вводить и заменять его с помощью второй (отладочной) конфигурации:
$curlDefault = array( CURLOPT_PORT => 80, //ignore explicit setting of port 80 CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_FOLLOWLOCATION => TRUE, CURLOPT_ENCODING => '', CURLOPT_HTTPHEADER => array( 'Proxy-Connection: Close', 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1017.2 Safari/535.19', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Encoding: gzip,deflate,sdch', 'Accept-Language: en-US,en;q=0.8', 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'Cookie: __qca=blabla', 'Connection: Close', ), CURLOPT_VERBOSE => TRUE, // TRUE to output verbose information. Writes output to STDERR, or the file specified using CURLOPT_STDERR. ); $url = "http://stackoverflow.com/questions/tagged/java"; $handle = curl_init($url); curl_setopt_array($handle, $curlDefault); $html = curl_exec($handle); curl_close($handle);
Это может помочь вам улучшить код и отладить вещи.
Кроме того, вы используете опцию CURLOPT_VERBOSE
. Это добавит подробную информацию в STDERR
– так что вы больше не сможете ее отслеживать. Вместо этого вы можете добавить его на вывод, чтобы лучше видеть, что происходит:
... CURLOPT_VERBOSE => TRUE, // TRUE to output verbose information. Writes output to STDERR, or the file specified using CURLOPT_STDERR. CURLOPT_STDERR => $verbose = fopen('php://temp', 'rw+'), ); $url = "http://stackoverflow.com/questions/tagged/java"; $handle = curl_init($url); curl_setopt_array($handle, $curlDefault); $html = curl_exec($handle); $urlEndpoint = curl_getinfo($handle, CURLINFO_EFFECTIVE_URL); echo "Verbose information:\n<pre>", !rewind($verbose), htmlspecialchars(stream_get_contents($verbose)), "</pre>\n"; curl_close($handle);
Что дает следующий результат:
Verbose information: * About to connect() to stackoverflow.com port 80 (#0) * Trying 64.34.119.12... * connected * Connected to stackoverflow.com (64.34.119.12) port 80 (#0) > GET /questions/tagged/java HTTP/1.1 Host: stackoverflow.com Proxy-Connection: Close User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1017.2 Safari/535.19 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 Cookie: __qca=blabla Connection: Close < HTTP/1.1 200 OK < Cache-Control: private < Content-Type: text/html; charset=utf-8 < Content-Encoding: gzip < Vary: Accept-Encoding < Date: Mon, 05 Mar 2012 17:33:11 GMT < Connection: close < Content-Length: 10537 < * Closing connection #0
Который должен предоставить вам информацию, необходимую для отслеживания вещей, если они связаны с запросом / завитом. Затем вы можете легко изменить параметры и посмотреть, не изменилось ли это. Также сравните версию завитка, которую вы установили локально, с той, что была на сервере. Чтобы получить его, используйте curl_version
:
$curlVersion = curl_version(); echo $curlVersion['version']; // eg 7.24.0
Надеюсь, это поможет вам отследить все.
в соответствии с http://php.net/manual/en/function.curl-setopt.php попробуйте установить CURLOPT_ENCODING
на "gzip"
также, я постараюсь избежать как можно большего количества строк заголовка, например, использовать CURLOPT_COOKIE
вместо Cookie: __qca__=blabla
CURLOPT_USERAGENT
или CURLOPT_USERAGENT
EDIT: кажется, что вы не используете массив (key => value) для CURLOPT_HTTPHEADER, не так ли? в этом случае, используйте массив, и с другим материалом, я написал, с вами все будет в порядке. (как это делается, прочтите руководство: P)
надеюсь, это поможет.