(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP
curl_error — Возвращает строку с описанием последней ошибки текущего сеанса
Описание
Список параметров
-
handle
-
Дескриптор cURL, полученный из curl_init().
Возвращаемые значения
Возвращает сообщение об ошибке или ''
(пустую строку),
если ошибки не произошло.
Список изменений
Версия | Описание |
---|---|
8.0.0 |
handle теперь ожидает экземпляр CurlHandle;раньше, ожидался ресурс (resource). |
Примеры
Пример #1 Пример использования curl_error()
<?php
// Создаём дескриптор curl к несуществующему адресу
$ch = curl_init('http://404.php.net/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if(
curl_exec($ch) === false)
{
echo 'Ошибка curl: ' . curl_error($ch);
}
else
{
echo 'Операция завершена без каких-либо ошибок';
}// Закрываем дескриптор
curl_close($ch);
?>
patrick at ibuildings dot nl ¶
9 years ago
If you want to fetch the error message, make sure you fetch it before you close the current cURL session or the error message will be reset to an empty string.
paul at paulmcgarry dot com ¶
14 years ago
For a 404 response to actually trigger an error as the example seems to be trying to demonstrate the following option should be set:
curl_setopt($ch,CURLOPT_FAILONERROR,true);
As per http://curl.haxx.se/libcurl/c/libcurl-errors.html
CURLE_HTTP_RETURNED_ERROR (22)
This is returned if CURLOPT_FAILONERROR is set TRUE and the HTTP server returns an error code that is >= 400. (This error code was formerly known as CURLE_HTTP_NOT_FOUND.)
anrdaemon at freemail dot ru ¶
3 years ago
curl_error is not a textual representation of curl_errno.
It's an actual error *message*.
If you want textual representation of error *code*, look for curl_strerror.
Anonymous ¶
2 years ago
If you're using curl_multi and there's an error, curl_error() will remain empty until you've called curl_multi_info_read(). That function "pumps" the information inside the curl libraries to the point where curl_error() will return a useful string.
This should really be added to the documentation, because it's not at all obvious.
you can generate curl error after its execution
$url = 'http://example.com';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if(curl_errno($ch)){
echo 'Request Error:' . curl_error($ch);
}
and here are curl error code
if someone need more information about curl errors
<?php
$error_codes=array(
[1] => 'CURLE_UNSUPPORTED_PROTOCOL',
[2] => 'CURLE_FAILED_INIT',
[3] => 'CURLE_URL_MALFORMAT',
[4] => 'CURLE_URL_MALFORMAT_USER',
[5] => 'CURLE_COULDNT_RESOLVE_PROXY',
[6] => 'CURLE_COULDNT_RESOLVE_HOST',
[7] => 'CURLE_COULDNT_CONNECT',
[8] => 'CURLE_FTP_WEIRD_SERVER_REPLY',
[9] => 'CURLE_REMOTE_ACCESS_DENIED',
[11] => 'CURLE_FTP_WEIRD_PASS_REPLY',
[13] => 'CURLE_FTP_WEIRD_PASV_REPLY',
[14]=>'CURLE_FTP_WEIRD_227_FORMAT',
[15] => 'CURLE_FTP_CANT_GET_HOST',
[17] => 'CURLE_FTP_COULDNT_SET_TYPE',
[18] => 'CURLE_PARTIAL_FILE',
[19] => 'CURLE_FTP_COULDNT_RETR_FILE',
[21] => 'CURLE_QUOTE_ERROR',
[22] => 'CURLE_HTTP_RETURNED_ERROR',
[23] => 'CURLE_WRITE_ERROR',
[25] => 'CURLE_UPLOAD_FAILED',
[26] => 'CURLE_READ_ERROR',
[27] => 'CURLE_OUT_OF_MEMORY',
[28] => 'CURLE_OPERATION_TIMEDOUT',
[30] => 'CURLE_FTP_PORT_FAILED',
[31] => 'CURLE_FTP_COULDNT_USE_REST',
[33] => 'CURLE_RANGE_ERROR',
[34] => 'CURLE_HTTP_POST_ERROR',
[35] => 'CURLE_SSL_CONNECT_ERROR',
[36] => 'CURLE_BAD_DOWNLOAD_RESUME',
[37] => 'CURLE_FILE_COULDNT_READ_FILE',
[38] => 'CURLE_LDAP_CANNOT_BIND',
[39] => 'CURLE_LDAP_SEARCH_FAILED',
[41] => 'CURLE_FUNCTION_NOT_FOUND',
[42] => 'CURLE_ABORTED_BY_CALLBACK',
[43] => 'CURLE_BAD_FUNCTION_ARGUMENT',
[45] => 'CURLE_INTERFACE_FAILED',
[47] => 'CURLE_TOO_MANY_REDIRECTS',
[48] => 'CURLE_UNKNOWN_TELNET_OPTION',
[49] => 'CURLE_TELNET_OPTION_SYNTAX',
[51] => 'CURLE_PEER_FAILED_VERIFICATION',
[52] => 'CURLE_GOT_NOTHING',
[53] => 'CURLE_SSL_ENGINE_NOTFOUND',
[54] => 'CURLE_SSL_ENGINE_SETFAILED',
[55] => 'CURLE_SEND_ERROR',
[56] => 'CURLE_RECV_ERROR',
[58] => 'CURLE_SSL_CERTPROBLEM',
[59] => 'CURLE_SSL_CIPHER',
[60] => 'CURLE_SSL_CACERT',
[61] => 'CURLE_BAD_CONTENT_ENCODING',
[62] => 'CURLE_LDAP_INVALID_URL',
[63] => 'CURLE_FILESIZE_EXCEEDED',
[64] => 'CURLE_USE_SSL_FAILED',
[65] => 'CURLE_SEND_FAIL_REWIND',
[66] => 'CURLE_SSL_ENGINE_INITFAILED',
[67] => 'CURLE_LOGIN_DENIED',
[68] => 'CURLE_TFTP_NOTFOUND',
[69] => 'CURLE_TFTP_PERM',
[70] => 'CURLE_REMOTE_DISK_FULL',
[71] => 'CURLE_TFTP_ILLEGAL',
[72] => 'CURLE_TFTP_UNKNOWNID',
[73] => 'CURLE_REMOTE_FILE_EXISTS',
[74] => 'CURLE_TFTP_NOSUCHUSER',
[75] => 'CURLE_CONV_FAILED',
[76] => 'CURLE_CONV_REQD',
[77] => 'CURLE_SSL_CACERT_BADFILE',
[78] => 'CURLE_REMOTE_FILE_NOT_FOUND',
[79] => 'CURLE_SSH',
[80] => 'CURLE_SSL_SHUTDOWN_FAILED',
[81] => 'CURLE_AGAIN',
[82] => 'CURLE_SSL_CRL_BADFILE',
[83] => 'CURLE_SSL_ISSUER_ERROR',
[84] => 'CURLE_FTP_PRET_FAILED',
[84] => 'CURLE_FTP_PRET_FAILED',
[85] => 'CURLE_RTSP_CSEQ_ERROR',
[86] => 'CURLE_RTSP_SESSION_ERROR',
[87] => 'CURLE_FTP_BAD_FILE_LIST',
[88] => 'CURLE_CHUNK_FAILED');
?>
Я использую функции PHP curl для отправки данных на веб-сервер с моей локальной машины. Мой код выглядит следующим образом:
$c = curl_init();
curl_setopt($c, CURLOPT_URL, $url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($c);
if (curl_exec($c) === false) {
echo «ok»;
} else {
echo «error»;
}
curl_close($c);
К сожалению, я не могу поймать ни одной ошибки типа 404, 500 или сетевого уровня. Как же мне узнать, что данные не были размещены или получены с удаленного сервера?
Ответ 1
Вы можете использовать функцию curl_error(), чтобы определить, произошла ли какая-то ошибка. Например:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $your_url);
curl_setopt($ch, CURLOPT_FAILONERROR, true); // Требуется для того, чтобы коды ошибок HTTP сообщались через наш вызов к curl_error($ch)
//…
curl_exec($ch);
if (curl_errno($ch)) {
$error_msg = curl_error($ch);
}
curl_close($ch);
if (isset($error_msg)) {
// TODO — Обработать ошибку cURL соответствующим образом
}
Ответ 2
Если CURLOPT_FAILONERROR равно false, ошибки http не будут вызывать ошибок curl.
<?php
if (@$_GET[‘curl’]==»yes») {
header(‘HTTP/1.1 503 Service Temporarily Unavailable’);
} else {
$ch=curl_init($url = «http://».$_SERVER[‘SERVER_NAME’].$_SERVER[‘PHP_SELF’].»?curl=yes»);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
$response=curl_exec($ch);
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curl_errno= curl_errno($ch);
if ($http_status==503)
echo «HTTP Status == 503 <br/>»;
echo «Curl Errno returned $curl_errno <br/>»;
}
Ответ 3
Вы можете сгенерировать ошибку curl после его выполнения:
$url = ‘http://example.com’;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if(curl_errno($ch)){
echo ‘Request Error:’ . curl_error($ch);
}
И вот коды ошибок curl:
если кому-то нужна дополнительная информация об ошибках curl
<?php
$error_codes=array(
[1] => ‘CURLE_UNSUPPORTED_PROTOCOL’,
[2] => ‘CURLE_FAILED_INIT’,
[3] => ‘CURLE_URL_MALFORMAT’,
[4] => ‘CURLE_URL_MALFORMAT_USER’,
[5] => ‘CURLE_COULDNT_RESOLVE_PROXY’,
[6] => ‘CURLE_COULDNT_RESOLVE_HOST’,
[7] => ‘CURLE_COULDNT_CONNECT’,
[8] => ‘CURLE_FTP_WEIRD_SERVER_REPLY’,
[9] => ‘CURLE_REMOTE_ACCESS_DENIED’,
[11] => ‘CURLE_FTP_WEIRD_PASS_REPLY’,
[13] => ‘CURLE_FTP_WEIRD_PASV_REPLY’,
[14]=>’CURLE_FTP_WEIRD_227_FORMAT’,
[15] => ‘CURLE_FTP_CANT_GET_HOST’,
[17] => ‘CURLE_FTP_COULDNT_SET_TYPE’,
[18] => ‘CURLE_PARTIAL_FILE’,
[19] => ‘CURLE_FTP_COULDNT_RETR_FILE’,
[21] => ‘CURLE_QUOTE_ERROR’,
[22] => ‘CURLE_HTTP_RETURNED_ERROR’,
[23] => ‘CURLE_WRITE_ERROR’,
[25] => ‘CURLE_UPLOAD_FAILED’,
[26] => ‘CURLE_READ_ERROR’,
[27] => ‘CURLE_OUT_OF_MEMORY’,
[28] => ‘CURLE_OPERATION_TIMEDOUT’,
[30] => ‘CURLE_FTP_PORT_FAILED’,
[31] => ‘CURLE_FTP_COULDNT_USE_REST’,
[33] => ‘CURLE_RANGE_ERROR’,
[34] => ‘CURLE_HTTP_POST_ERROR’,
[35] => ‘CURLE_SSL_CONNECT_ERROR’,
[36] => ‘CURLE_BAD_DOWNLOAD_RESUME’,
[37] => ‘CURLE_FILE_COULDNT_READ_FILE’,
[38] => ‘CURLE_LDAP_CANNOT_BIND’,
[39] => ‘CURLE_LDAP_SEARCH_FAILED’,
[41] => ‘CURLE_FUNCTION_NOT_FOUND’,
[42] => ‘CURLE_ABORTED_BY_CALLBACK’,
[43] => ‘CURLE_BAD_FUNCTION_ARGUMENT’,
[45] => ‘CURLE_INTERFACE_FAILED’,
[47] => ‘CURLE_TOO_MANY_REDIRECTS’,
[48] => ‘CURLE_UNKNOWN_TELNET_OPTION’,
[49] => ‘CURLE_TELNET_OPTION_SYNTAX’,
[51] => ‘CURLE_PEER_FAILED_VERIFICATION’,
[52] => ‘CURLE_GOT_NOTHING’,
[53] => ‘CURLE_SSL_ENGINE_NOTFOUND’,
[54] => ‘CURLE_SSL_ENGINE_SETFAILED’,
[55] => ‘CURLE_SEND_ERROR’,
[56] => ‘CURLE_RECV_ERROR’,
[58] => ‘CURLE_SSL_CERTPROBLEM’,
[59] => ‘CURLE_SSL_CIPHER’,
[60] => ‘CURLE_SSL_CACERT’,
[61] => ‘CURLE_BAD_CONTENT_ENCODING’,
[62] => ‘CURLE_LDAP_INVALID_URL’,
[63] => ‘CURLE_FILESIZE_EXCEEDED’,
[64] => ‘CURLE_USE_SSL_FAILED’,
[65] => ‘CURLE_SEND_FAIL_REWIND’,
[66] => ‘CURLE_SSL_ENGINE_INITFAILED’,
[67] => ‘CURLE_LOGIN_DENIED’,
[68] => ‘CURLE_TFTP_NOTFOUND’,
[69] => ‘CURLE_TFTP_PERM’,
[70] => ‘CURLE_REMOTE_DISK_FULL’,
[71] => ‘CURLE_TFTP_ILLEGAL’,
[72] => ‘CURLE_TFTP_UNKNOWNID’,
[73] => ‘CURLE_REMOTE_FILE_EXISTS’,
[74] => ‘CURLE_TFTP_NOSUCHUSER’,
[75] => ‘CURLE_CONV_FAILED’,
[76] => ‘CURLE_CONV_REQD’,
[77] => ‘CURLE_SSL_CACERT_BADFILE’,
[78] => ‘CURLE_REMOTE_FILE_NOT_FOUND’,
[79] => ‘CURLE_SSH’,
[80] => ‘CURLE_SSL_SHUTDOWN_FAILED’,
[81] => ‘CURLE_AGAIN’,
[82] => ‘CURLE_SSL_CRL_BADFILE’,
[83] => ‘CURLE_SSL_ISSUER_ERROR’,
[84] => ‘CURLE_FTP_PRET_FAILED’,
[84] => ‘CURLE_FTP_PRET_FAILED’,
[85] => ‘CURLE_RTSP_CSEQ_ERROR’,
[86] => ‘CURLE_RTSP_SESSION_ERROR’,
[87] => ‘CURLE_FTP_BAD_FILE_LIST’,
[88] => ‘CURLE_CHUNK_FAILED’);
?>
Ответ 4
Поскольку вы заинтересованы в отлове ошибок, связанных с сетью, и ошибок HTTP, ниже приведен лучший подход:
function curl_error_test($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$responseBody = curl_exec($ch);
/*
* if curl_exec failed then
* $responseBody равно false
* curl_errno() возвращает ненулевое число
* curl_error() возвращает непустую строку
* Какой из них использовать — решать вам
*/
if ($responseBody === false) {
return «CURL Error: » . curl_error($ch);
}
$responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
/*
* 4xx коды состояния — ошибки клиента
* 5xx коды состояния — ошибки сервера
*/
if ($responseCode >= 400) {
return «HTTP Error: » . $responseCode;
}
return «Нет ошибки CURL или HTTP «;
}
Тесты:
curl_error_test(«http://expamle.com»); // Ошибка CURL : Невозможно определить хост : expamle.com
curl_error_test(«http://example.com/whatever»); // Ошибка HTTP: 404
curl_error_test(«http://example.com»); // Все в порядке с CURL или HTTP
Ответ 5
Еще один вариант кода:
$responseInfo = curl_getinfo($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$body = substr($response, $header_size);
$result=array();
$result[‘httpCode’]=$httpCode;
$result[‘body’]=json_decode($body);
$result[‘responseInfo’]=$responseInfo;
print_r($httpCode);
print_r($result[‘body’]); exit;
curl_close($ch);
if($httpCode == 403) {
print_r(«Доступ запрещен»);
exit;
} else {
// другие ошибки
}
I’m using curl
at the command line on Linux to issue HTTP requests. The response bodies are printed to standard out, which is fine, but I can’t see from the man page how to get curl to print the HTTP status code from the response (404, 403 etc). Is this possible?
asked Apr 18, 2011 at 10:28
4
This should work for you if the web server is able to respond to HEAD requests (this will not perform a GET
request):
curl -I http://www.example.org
As an addition, to let cURL follow redirects (3xx statuses) add -L
.
Wouter
1291 silver badge7 bronze badges
answered Apr 18, 2011 at 10:56
pberlijnpberlijn
9,1501 gold badge14 silver badges8 bronze badges
11
A more specific way to print out just the HTTP status code is something along the lines of:
curl -s -o /dev/null -w "%{http_code}" http://www.example.org/
A lot easier to work with in scripts, as it doesn’t require any parsing
The parameter -I
might be added to improve response load performance. This will change the call to a HEAD
call which will fetch response overhead only, without the body.
Note: %{http_code}
returns on first line of HTTP payload (available variables for the -w
option on the curl
documentation page)
i.e.:
curl -s -o /dev/null -I -w "%{http_code}" http://www.example.org/
answered Jun 28, 2012 at 0:25
pvandenberkpvandenberk
13.6k2 gold badges13 silver badges3 bronze badges
21
You can print the status code, in addition to all the headers by doing the following:
curl -i http://example.org
The good thing about -i
is that it works with -X POST
as well.
answered Dec 4, 2012 at 20:45
Cyril DavidCyril David
4,4271 gold badge12 silver badges2 bronze badges
8
If you want to see the header as well as the result you can use the verbose option:
curl -v http://www.example.org
curl --verbose http://www.example.org
The status will appear in the header. E.g.
< Date: Tue, 04 Nov 2014 19:12:59 GMT
< Content-Type: application/json; charset=utf-8
< Status: 422 Unprocessable Entity
Dennis
4425 silver badges14 bronze badges
answered May 3, 2012 at 4:28
Enrico SusatyoEnrico Susatyo
3,4362 gold badges18 silver badges20 bronze badges
4
If you want to capture the HTTP status code in a variable, but still redirect the content to STDOUT, you must create two STDOUTs. You can do so with process substitution >() and command substitution $().
First, create a file descriptor 3
for your current process’ STDOUT with exec 3>&1
.
Then, use curl’s -o
option to redirect the response content to a temporary fifo using command substitution, and then within that command substitution, redirect output back to your current process STDOUT file descriptor 3
with -o >(cat >&3)
.
Putting it all together in bash
3.2.57(1)-release
(standard for macOS
):
# creates a new file descriptor 3 that redirects to 1 (STDOUT)
exec 3>&1
# Run curl in a separate command, capturing output of -w "%{http_code}" into HTTP_STATUS
# and sending the content to this command's STDOUT with -o >(cat >&3)
HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example.com')
Note that this doesn’t work in /bin/sh
as SamK noted in the comments below.
answered Jan 8, 2015 at 20:59
8
Redefine curl output:
curl -sw '%{http_code}' http://example.org
Can be used with any request type.
answered Aug 5, 2014 at 18:18
2
Status code ONLY
[0]$ curl -LI http://www.example.org -o /dev/null -w '%{http_code}n' -s
[0]$ 200
All credit to this GIST
answered Feb 8, 2017 at 10:44
mahatmanichmahatmanich
6255 silver badges7 bronze badges
1
This is a painful curl --fail
limitation. From man curl
:
-f, —fail
(HTTP) Fail silently (no output at all) on server errors
But there is no way to get both the non-zero return code AND the response body in stdout.
Based on pvandenberk’s answer and this other very useful trick learned on SO, here is a workaround :
curl_with_error_code () {
_curl_with_error_code "$@" | sed '$d'
}
_curl_with_error_code () {
local curl_error_code http_code
exec 17>&1
http_code=$(curl --write-out 'n%{http_code}n' "$@" | tee /dev/fd/17 | tail -n 1)
curl_error_code=$?
exec 17>&-
if [ $curl_error_code -ne 0 ]; then
return $curl_error_code
fi
if [ $http_code -ge 400 ] && [ $http_code -lt 600 ]; then
echo "HTTP $http_code" >&2
return 127
fi
}
This function behaves exactly as curl
, but will return 127 (a return code non-used by curl
) in case of a HTTP code in the range [400, 600[.
answered Apr 6, 2016 at 13:08
Lucas CimonLucas Cimon
4724 silver badges11 bronze badges
3
This will send a request to url, get only the first line of the response, split it on blocks and select the second one.
It contains the response code
curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
answered Jul 15, 2015 at 20:08
2
For a POST request, the following worked:
curl -w 'RESP_CODE:%{response_code}' -s -X POST --data '{"asda":"asd"}' http://example.com --header "Content-Type:application/json"|grep -o 'RESP_CODE:[1-4][0-9][0-9]'
answered Jan 7, 2016 at 8:36
zafar142003zafar142003
2512 silver badges4 bronze badges
Use the following cURL command and pipe it to grep like so:
$ curl -I -s -L http://example.com/v3/get_list | grep «HTTP/1.1»
Here’s what each flag does:
-I
: Show only response headers-s
: Silent — Don’t show progress bar-L
: FollowLocation:
headers
Here is a link to HTTP status codes.
Run from the command line. This curl runs in silent mode, follows any redirects, get the HTTP headers. grep will print the HTTP status code to standard output.
Cas
1,9142 gold badges18 silver badges42 bronze badges
answered Nov 21, 2016 at 11:28
Here is some curl command that is using GET
and that returns the HTTP code.
curl -so /dev/null -w '%{response_code}' http://www.example.org
Please remember that the approach below is using HEAD
, which is faster but it may not work well with some web less compliant HTTP servers.
curl -I http://www.example.org
answered Jun 23, 2016 at 10:37
sorinsorin
11.4k20 gold badges62 silver badges73 bronze badges
2
curl -so -i /dev/null -w "%{http_code}" http://www.any_example.com
This will return the following information:
- response data, if any data is returned by API like error
- status code
answered Mar 8, 2017 at 5:12
sranasrana
611 silver badge2 bronze badges
2
An example of how to use the response codes. I use this to re-download Geolite databases only if they have changed (-z
) & also following redirects (-L
):
url=http://example.com/file.gz
file=$(basename $url)
response=$(curl -L -s -o $file -z $file $url -w "%{http_code}")
case "$response" in
200) do_something ;;
301) do_something ;;
304) printf "Received: HTTP $response (file unchanged) ==> $urln" ;;
404) printf "Received: HTTP $response (file not found) ==> $urln" ;;
*) printf "Received: HTTP $response ==> $urln" ;;
esac
answered Apr 1, 2018 at 17:21
Split output content to stdout
and HTTP status code to stderr
:
curl http://www.example.org -o >(cat >&1) -w "%{http_code}n" 1>&2
If only HTTP status code is desired to stderr, --silent
can be used:
curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}n" 1>&2
The desired stream can then be picked by redirecting unwanted one to /dev/null
:
$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 1>/dev/null
200
$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 2>/dev/null
<!doctype html>
...
Note that for the second redirection to behave as desired, we need to run the curl command in subshell.
answered Jun 4, 2019 at 8:08
JaakkoJaakko
3102 silver badges12 bronze badges
2
The OP wants to know the status code. Often when downloading a file you also want to get a feel of it’s size so I’m using curl first to show status code and size of file and then shut off verbose and direct file to the place and name I want:
curl -R -s -S -w "nhttp: %{http_code} %{size_download}n" -o /Users/myfiles/the_local_name.html http://archive.onweb.com/the_online_name.html
Then I wait for the finishing of curl
wait ${!}
before I run the next command. The above when used in a script of many commands like above gives a nice response like:
http: 200 42824
http: 200 34728
http: 200 35452
Please note that -o in curl needs to be followed by the full path of the file + name of file. This allows you thusly to save files in a sensible name structure when you d/l them with curl. Also note that -s and -S used together silence the output but does show errors. Note also that -R tries to set the file timestamp to that of the web file.
My answer is based on what @pvandenberk originally suggested, but in addition it actually saves the file somewhere, instead of merely directing to /dev/null.
answered Oct 7, 2017 at 7:32
$ curl -kv https://www.example.org 2>&1 | grep -i 'HTTP/1.1 ' | awk '{print $3}'| sed -e 's/^[ t]*//'
- 2>&1: error is stored in output for parsing
- grep: filter the response code line from output
- awk: filters out the response code from response code line
- sed: removes any leading white spaces
answered Apr 14, 2021 at 4:44
There is another way by using Powershell command which is alias to curl.exe
Just type the following:
(Invoke-WebRequest -Uri https://your.website).StatusCode
answered Jul 14, 2022 at 10:30
In Windows PowerShell:
curl https:\www.example.org -Method HEAD
It’s really just an alias for Invoke-WebRequest
though.
answered Sep 14, 2022 at 18:24
KebmanKebman
5072 gold badges5 silver badges13 bronze badges
PHP’s cURL functions are extremely useful for sending HTTP requests.
Some examples of its usefulness.
- Retrieving data from an external API.
- Sending data to an external web service.
- Checking to see if a HTTP resource exists.
- Crawling / scraping web pages (logging into other websites with PHP).
Although you can easily request external content via the function file_get_contents, cURL is much more useful in the sense that it allows us to detect and handle certain HTTP errors.
Let’s take the following example.
$url = 'http://example.com'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); echo $result;
As you can see, we have setup a very simple GET request that returns the contents of a website called example.com.
Unfortunately, this code doesn’t take into account the fact that the cURL request could fail. As a result, the request might fail without providing us with any details about what happened.
Using curl_errno to detect cURL errors.
This is where the curl_errno function comes in handy.
The curl_errno function will return the number 0 (zero) if the request was successful. In other words, it will return a “falsey” value if no error occurs. This is because PHP sees 0 as a false value in a boolean context.
This allows us to figure out whether or not our cURL request resulted in an error.
Take a look at the following example.
$url = 'http://example.com'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); if(curl_errno($ch)){ echo 'Request Error:' . curl_error($ch); }
If an error occurs, then our script will print out the result of the curl_error function.
Throwing Exceptions.
In certain situations, you might want to throw an exception if a cURL request fails.
For this example, let us pretend that we have an object function called get.
/** * Send a GET request to a URL. * * @param string $url * @return string * @throws Exception If cURL request fails. */ public function get($url){ $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); if(curl_errno($ch)){ throw new Exception(curl_error($ch)); } return $result; }
As you can see, the function above will attempt to send a GET request to a given URL.
If all goes well, the function will return the contents of the URL.
However, if the request fails and a cURL error exists, PHP will throw an Exception.
This allows us to handle the request like so.
try{ $object->get('http://test.com'); } catch(Exception $e){ //do something with the exception you caught }
In the above piece of code, we are using a TRY-CATCH block.
If we do not want our application to continue after a failed HTTP request, we can omit the TRY-CATCH block and let our Exception Handler deal with it.
Коды статусов и ошибок
Коды состояния и ошибок — это число в заголовке ответа, который указывает общую классификацию ответа — например, был ли запрос успешным (200), привел ли к ошибке сервера (500), были ли проблемы с авторизацией (403), и так далее. Стандартные коды состояния обычно не требуют большого количества документации, но пользовательские коды состояния и ошибки, специфичные для API, нужны. Коды ошибок, в частности, помогают в устранении неисправных запросов.
Содержание раздела
Пример кода статуса в заголовке curl
Где перечислять HTTP-ответ и коды ошибок
Где взять коды статусов и ошибок
Как перечислить коды состояния
Коды состояния и ошибок помогают в устранении неполадок
Примеры кодов статусов и шибок
-
Context.io
-
Twitter
-
Mailchimp
-
Flickr
Практическое занятие: Коды статусов и ошибок
Пример кода статуса в заголовке curl
Коды статусов не отображаются в тебе ответа. Они содержатся в хэдере, который может быть не видим по умолчанию.
Помните, когда мы отправляли обратный вызов в разделе Создание curl запроса? Чтобы получить заголовок ответа, добавляем —include или -i к запросу curl. Если нужно, чтобы в ответе возвращался только заголовок ответа (и ничего больше), используем заглавную букву -I, например:
curl -I -X GET "https://api.openweathermap.org/data/2.5/weather?zip=95050&appid=fd4698c940c6d1da602a70ac34f0b147&units=imperial"
Заголовок ответа выглядит следующим образом:
HTTP/1.1 200 OK Server: openresty Date: Thu, 06 Dec 2018 22:58:41 GMT Content-Type: application/json; charset=utf-8 Content-Length: 446 Connection: keep-alive X-Cache-Key: /data/2.5/weather?units=imperial&zip=95050 Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true Access-Control-Allow-Methods: GET, POST
Первая строка, HTTP / 1.1 200 OK
, сообщает нам статус запроса (200
). Большинство API REST следуют стандартному протоколу для заголовков ответов. Например, 200
— это не просто произвольный код, выбранный разработчиками OpenWeatherMap API. 200
— это общепринятый код для успешного HTTP-запроса. (Если изменить метод, то получим другой код состояния.)
С помощью запроса GET довольно легко определить, успешен ли запрос, потому что получаем ожидаемый ответ. Но предположим, делаем запрос POST, PUT или DELETE, когда мы меняем данные, содержащиеся в ресурсе. Как узнать, был ли запрос успешно обработан и получен API? Коды ответа HTTP в заголовке ответа будут указывать, была ли операция успешной. Коды состояния HTTP — это просто сокращения длинных сообщений.
Коды состояния довольно тонкие, но когда разработчик работает с API, коды могут быть единственным «интерфейсом», который имеет разработчик. Если получится контролировать сообщения, которые видит разработчик, это будет большой победой юзабилити.
Слишком часто коды состояния неинформативны, плохо написаны и сообщают мало или вообще никакой полезной информации пользователю для преодоления ошибки. По большому счету, коды состояния должны помогать пользователям в восстановлении после ошибок.
Можно посмотреть список общих кодов состояния REST API здесь и общий список кодов HTTP статусов здесь. Хотя, возможно, было бы полезно включить несколько стандартных кодов состояния, нет необходимости в полном документировании всех стандартных кодов состояния, особенно если они редко запускаются в API.
Где перечислять HTTP-ответ и коды ошибок
Практичнее, если API будут иметь одну страницу с ответами и кодами ошибок ко всему API. Отдельная страница с перечнем кодов состояния (вместо добавления кода состояния в каждую конечную точку) позволяет более детально описать каждый код без переполнения других частей документации. Такой подход уменьшает избыточность и ощущение информационной перегрузки.
С другой стороны, если какие-то коды состояния и ошибок больше подходят к определенным конечным точкам, чем другие, имеет смысл вывести такие коды состояния и ошибок на страницы с описаниями конечных точек.
Такая стратегия может заключаться в том, чтобы привлечь внимание к каким-либо особенно важным кодам состояния или ошибок для конкретной конечной точки, а затем перейти к централизованной странице «Коды ответов и состояний» для получения полной информации.
Где взять коды статусов и шибок
Коды состояния и ошибок могут быть неочевидны в документации API. Вероятно, придется попросить разработчиков предоставить список всех кодов состояния и ошибок, которые уникальны для API. Иногда разработчики хардкодят коды состояния и ошибок непосредственно в программном коде, и у них нет простых способов передать полный список (что также затрудняет локализацию).
В результате может потребоваться танцы с бубнами, чтобы найти все коды. В частности, возможно придется сломать API, чтобы увидеть все возможные коды ошибок. Например, если превысить ограничение скорости для определенного запроса, API может вернуть специальную ошибку или код состояния. Такой пользовательский код обязательно нужно задокументировать. В разделе устранения неполадок в API можно специально разместить примеры получения кодов ошибок.
Как перечислить коды состояния
Коды статусов и ошибок можно привести в виде списка определений или таблицы, например так:
Status code | Значение |
---|---|
200 |
Успешный запрос и ответ |
400 |
Неверно заданные параметры или другой неверный запрос |
Коды состояния и ошибок помогают в устранении неполадок
Коды состояния и ошибок особенно полезны при устранения неполадок. Таким образом, можно рассматривать коды ошибок как дополнение к разделу по устранению неполадок.
Каждая часть документации может быть полезна в разделе, посвященном устранению неполадок. В разделе, посвященном устранению неполадок, можно описать, что происходит, когда пользователи уходят с проторенной дорожки и спотыкаются в темном лесу. Коды состояния похожи на подсказки, которые помогут пользователям вернуться на правильный путь.
В разделе по устранению неполадок можно перечислить сообщения об ошибках, связанных со следующими ситуациями:
- использование неправильных API ключей;
- использование неверных API ключей;
- параметры не соответствуют типам данных;
- API выдает исключение;
- нет данных для возврата ресурса;
- превышен предел скорости;
- параметры находятся за пределами приемлемых максимальной и минимальной границ;
- обязательный параметр отсутствует в конечной точке.
текст ошибки должен точно документироваться, чтобы она легко появлялась при поиске.
Примеры кодов статусов и ошибок
Ниже приведены несколько вариантов разделов с кодами статусов и ошибок.
Context.io
Коды статусов и ошибок Conext.io
Clearbit не только документирует стандартные коды состояния, но также описывает уникальные параметры, возвращаемые их API. Большинство разработчиков, вероятно, знакомы с кодами 200, 400 и 500, поэтому эти коды не требуют много пояснений. Но если API имеет уникальные коды, описывать их нужно адекватно и подробно.
Коды статусов и ошибок Twitter
В Twitter не только описывается код и состояние, но также предоставляется полезная информация по устранению неполадок, потенциально помогая в устранении ошибок. Например, про ошибку 500
не просто сказано, что статус относится к неработающей службе, но и есть объяснение: «Обычно это временная ошибка, например, в ситуации высокой нагрузки или если у конечной точки временно возникают проблемы. Посетите форумы разработчиков на случай, если у других возникнут аналогичные проблемы, или повторите попытку позже».
Полезные сообщения такого рода — то, к чему должны стремиться технические писатели в разделе кодов состояния (по крайней мере, делать описания тех кодов, которые указывают на проблемы)
Mailchimp
Коды статусов и ошибок Mailchimp
Mailchimp предоставляет удобочитаемые и понятные описания сообщений об ошибке. Например, в ошибке 403
вместо того, чтобы просто написать «Запрещено», Mailchimp объясняет причины, по которым можно получить ошибку запрещенного кода. У Mailchimp существует несколько типов ошибок 403. Запрос может быть запрещен из-за отключенной учетной записи пользователя или запроса, направленного не в тот центр обработки данных. В случае ошибки «WrongDataCenter» Mailchimp отмечает, что «она часто связана с неправильно настроенными библиотеками» и ссылается на дополнительную информацию о центрах обработки данных. Такой тип документации кода ошибки очень полезен для пользователей.
Flickr
Коды статусов и ошибок Flikr
В Flickr раздел «Коды ответов» встроен в описание каждой адресной темы API. Описания ошибок выглядят короткими. Хотя встраивание кодов ответов в каждую тему делает коды ошибок более заметными, в некоторых случаях такой подход менее полезен. Поскольку он встроен в каждую тему API, описания кодов ошибок должны быть краткими, иначе их содержимое будет перегружено информацией о запросе конечной точки.
Напротив, отдельная страница с перечнем кодов ошибок позволяет более подробно раскрывать каждый код, не вытесняя другую документацию. Отдельная страница также уменьшает избыточность и увеличивает объем информации.
👨💻 Практическое занятие: Коды статусов и ошибок
В своем найденном опен-сорс проекте найдем информацию о кодах статусов и ошибок. Ответим на следующие вопросы:
- присутствуют описания кодов статусов и ошибок в проекте?
- где находится информация о кодах статусов и ошибок в контексте документации? Как отдельная тема? Ниже каждой конечной точки? Где-нибудь еще?
- имеет ли API какой-либо уникальный код статусов и ошибок?
- помогают ли коды ошибок пользователям восстанавливаться после ошибок?
- сделаем запрос на одну из конечных точек, затем целенаправленно изменим параметр, чтобы сделать недействительный запрос. Какой код статуса возвращается в ответе? Этот код состояния задокументирован?
🔙
Go next ➡
PHP поддерживает libcurl, библиотеку, созданную Daniel»ом Stenberg»ом,
которая даёт возможность соединяться с серверами различных типов и по разным протоколам.
libcurl в настоящее время поддерживает протоколы http, https, ftp, gopher, telnet, dict, file и ldap.
libcurl также поддерживает сертификаты HTTPS, HTTP POST, HTTP PUT, загрузку по FTP (это можно сделать также РНР-расширением ftp),
загрузку на основе форм HTTP, прокси, куки и аутентификацию user+password.
Эти функции были введены в PHP 4.0.2.
curl_init
curl_init — инициализирует CURL-сессию.
Описание
resource curl_init([string url])
Функция curl_init() инициализирует новую сессию и возвратит CURL-дескриптор для
использования в функциях curl_setopt(),
curl_exec() и curl_close().
Если необязательный параметр url предоставлен, то опция
CURLOPT_URL получит значение этого параметра. Вы можете вручную устанавливать его с помощью функции
curl_setopt().
curl_setopt
curl_setopt — устанавливает опции для CURL-трансфера/transfer.
Описание
bool curl_setopt (resource ch, string option, mixed value)
Функция curl_setopt() устанавливает опции для CURL-сессии, идентифицируемой параметром ch.
Параметр option является опцией, которую вы хотите установить, а value это значение опции
option.
Параметр value должен быть long для следующих опций (специфицированных параметром option):
- CURLOPT_INFILESIZE: Если вы выгружаете файл на удалённый сайт, эта опция должна использоваться,
для того чтобы сообщит PHP, какой будет ожидаемый размер infile. - CURLOPT_VERBOSE: Установите эту опцию в ненулевое значение, если вы хотите, чтобы CURL
сообщала обо всех действиях. - CURLOPT_HEADER: Установите эту опцию в ненулевое значение, если вы хотите, чтобы шапка/header
включалась в вывод. - CURLOPT_NOPROGRESS: Установите эту опцию в ненулевое значение, если вы не хотите, чтобы PHP
выводил индикатор процесса CURL-трансфера.
(PHP автоматически устанавливает эту опцию в ненулевое значение, изменять её необходимо лишь при отладке.) - CURLOPT_NOBODY: Установите эту опцию в ненулевое значение, если вы не хотите, чтобы тело/body
включалось в вывод. - CURLOPT_FAILONERROR: Установите эту опцию в ненулевое значение, если вы хотите, чтобы PHP завершал
работу скрыто, если возвращаемый HTTP-код имеет значение выше 300. По
умолчанию страница возвращается нормально с игнорированием кода. - CURLOPT_UPLOAD: Установите эту опцию в ненулевое значение, если вы хотите, чтобы PHP
подготавливал файл к выгрузке. - CURLOPT_POST: Установите эту опцию в ненулевое значение, если вы хотите, чтобы PHP выполнял
регулярный HTTP POST. Этот POST имеет нормальный вид application/x-www-form-urlencoded, чаще всего используемый HTML-формами. - CURLOPT_FTPLISTONLY: Установите эту опцию в ненулевое значение, и PHP будет выводит листинг имён FTP-директории.
- CURLOPT_FTPAPPEND: Установите эту опцию в ненулевое значение, и PHP будет присоединять к
удалённому/remote файлу, вместо его перезаписи. - CURLOPT_NETRC: Установите эту опцию в ненулевое значение, и PHP будет сканировать ваш файл
~./netrc с целью поиска ваших username и password для удалённого сайта, с которым вы
устанавливаете соединение. - CURLOPT_FOLLOWLOCATION: Установите эту опцию в ненулевое значение, чтобы следовать любому «Location: » header,
который сервер высылает как часть HTTP header»а (заметьте,
что это рекурсия, PHP будет следовать за всеми «Location: «-header»ами, которые высылаются.) - CURLOPT_PUT: Установите эту опцию в ненулевое значение, чтобы HTTP PUT файл. Файл для PUT
обязан быть установлен с помощью CURLOPT_INFILE и CURLOPT_INFILESIZE. - CURLOPT_MUTE: Установите эту опцию в ненулевое значение, и PHP будет работать скрыто в
отношении CURL-функций. - CURLOPT_TIMEOUT: Передаёт long как параметр, который содержит максимальное время в секундах,
которое вы отводите для работы CURL-функций. - CURLOPT_CONNECTTIMEOUT: Передаёт long как параметр, который содержит максимальное время в секундах,
которое вы отводите для ожидания при попытке подключения. Используйте 0 чтобы ждать бесконечно. - CURLOPT_LOW_SPEED_LIMIT: Передаёт long как параметр, который содержит скорость трансфера в байтах в
секунду, ниже которого трансфер должен работать в процессе выполнения
CURLOPT_LOW_SPEED_TIME, в секундах, чтобы PHP считал его слишком медленным и прерывал его. - CURLOPT_LOW_SPEED_TIME: Передаёт long как параметр, который содержит время в секундах, ниже которого
трансфер должен работать в процессе выполнения CURLOPT_LOW_SPEED_LIMIT,
чтобы PHP считал его слишком медленным и прерывал его. - CURLOPT_RESUME_FROM: Передаёт long как параметр, который содержит смещение в байтах, с которого
трансфер должен стартовать. - CURLOPT_SSLVERSION: Передаёт long как параметр, который содержит используемую версию SSL (2 или 3).
По умолчанию PHP пытается определить это сам, хотя в некоторых случаях вы обязаны устанавливать это вручную. - CURLOPT_SSL_VERIFYHOST: Передаёт long, если
CURL должна проверять Common-имя peer-сертификата в SSL handshake/»рукопожатие». Значение 1 указывает, что мы должны
проверить существование общего /common имени, значение 2 указывает, что мы
должны убедиться в совпадении с предоставленным hostname. - CURLOPT_TIMECONDITION: Передаёт long как параметр, который определяет, как рассматривается CURLOPT_TIMEVALUE.
Вы можете установить этот параметр для TIMECOND_IFMODSINCE или
TIMECOND_ISUNMODSINCE. Это действует только для HTTP. - CURLOPT_TIMEVALUE: Передаёт long как параметр, который является временем в секундах, прошедшим
после 1 января 1970. Это время используется, как специфицировано опцией CURLOPT_TIMEVALUE,
или по умолчанию будет использоваться TIMECOND_IFMODSINCE. - CURLOPT_RETURNTRANSFER: Передаёт ненулевое значение, если вы хотите, чтобы CURL непосредственно
возвращала полученную информацию, вместо её печати напрямую.
Параметр value должен быть строкой для следующих значений параметра option:
- CURLOPT_URL: Это URL, который PHP должен получать. Вы можете также устанавливать эту
опцию при инициализации сессии функцией curl_init(). - CURLOPT_USERPWD: Передаёт в РНР строку, отформатированную в виде [username]:[password], для
использования при соединении. - CURLOPT_PROXYUSERPWD: Передаёт в РНР строку, отформатированную в виде [username]:[password], для
соединения с HTTP-прокси. - CURLOPT_RANGE:
Передаёт специфицированный вами диапазон. Он должен быть в формате
«X-Y», где X или Y могут отсутствовать. HTTP-трансферы поддерживают
также различные интервалы, разделённые запятыми, как, например, X-Y,N-M. - CURLOPT_POSTFIELDS: Передаёт строку, содержащую полные данные для передачи операцией HTTP «POST».
- CURLOPT_REFERER: Передаёт строку, содержащую «referer/ссылающийся» header, используемый в HTTP-запросе.
- CURLOPT_USERAGENT: Передаёт строку, содержащую «user-agent» header, используемый в HTTP-запросе.
- CURLOPT_FTPPORT: Передаёт строку, содержащую значение, которое будет использоваться для
получения IP-адреса для инструкции ftp «POST». POST-инструкция указывает
удалённому серверу: соединиться со специфицированным IP-адресом. Строка
может быть обычным IP-адресом, hostname/именем хоста, именем сетевого
интерфейса (под UNIX), или просто обычным «-«, используемым для системного IP-адреса по умолчанию. - CURLOPT_COOKIE: Передаёт строку с содержимым куки/cookie, установленным в HTTP header»е.
- CURLOPT_SSLCERT: Передаёт строку, содержащую filename форматированного сертификата PEM.
- CURLOPT_SSLCERTPASSWD: Передаёт строку, содержащую password, необходимый для работы сертификата CURLOPT_SSLCERT.
- CURLOPT_COOKIEFILE: Передаёт строку, содержащую имя файла с данными куки.
Этот cookie-файл может иметь формат Netscape, или содержать обычные
шапки/headers в HTTP-стиле, забитые в файл. - CURLOPT_CUSTOMREQUEST: Передаёт строку, используемую вместо
GET или HEAD при выполнении HTTP-запроса. Это делается для выполнения DELETE или других, более скрытых HTTP-запросов.
Верными значениями являются GET, POST и так далее; то есть не вводите здесь полную строку HTTP-запроса.
Например, ввод «GET /index.html HTTP/1.0» будет некорректным.
(не делайте это, если не уверены, что ваш сервер поддерживает эту команду.) - CURLOPT_PROXY: Передаёт имя HTTP-прокси туннельным запросам.
- CURLOPT_INTERFACE: Передаёт имя исходящего сетевого интерфейса для использования. Это может
быть имя интерфейса, IP-адрес или имя хоста. - CURLOPT_KRB4LEVEL: Передаёт KRB4 (Kerberos
4) уровень секретности. Это любая из следующих строк (в порядке от менее до более мощной): «clear», «safe»,
«confidential», «private».
Если эта строка не совпадает с какой-либо из указанных, то используется «private».
Если вы установите здесь NULL, это отключит KRB4-безопасность. KRB4-безопасность работает в настоящее
время только с транзакциями FTP. - CURLOPT_HTTPHEADER: Передаёт массив полей HTTP-header»а для установки.
- CURLOPT_QUOTE: Передаёт массив FTP-команд для выполнения на сервере до выполнения FTP-запроса.
- CURLOPT_POSTQUOTE: Передаёт массив FTP-команд для выполнения на сервере после выполнения FTP-запроса.
( curl_setopt($ch, CURLOPT_INTERFACE, $extip) )
Следующие опции ожидают дескриптора файла, который получается с помощью функции
fopen():
- CURLOPT_FILE: Файл, куда должен быть помещён вывод вашего трансфера, по умолчанию это STDOUT.
- CURLOPT_INFILE: Файл, из которого приходит ввод вашего трансфера.
- CURLOPT_WRITEHEADER: Файл для записи header-части вывода.
- CURLOPT_STDERR: Файл для записи ошибок, вместо stderr.
Параметр value должен быть функцией следующего вида
long write_callback (resource ch, string data){ … return strlen($data);}
для следующих значений параметра option:
- CURLOPT_WRITEFUNCTION: .
- CURLOPT_HEADERFUNCTION: .
Параметр value должен быть функцией следующего вида
string read_callback (resource ch, resource fd, long length){}
для следующих значений параметра option:
- CURLOPT_READFUNCTION: .
curl_exec
curl_exec — выполняет CURL-сессию.
Описание
bool curl_exec (resource ch)
Эта функция должна вызываться после того, как вы инициализируете сессию CURL
и все опции этой сессии уже установлены. Её назначение в том, чтобы просто
выполнить предопределённую CURL-сессию (заданную в параметре ch).
curl_close
curl_close — закрывает CURL-сессию.
Описание
void curl_close ( resource ch)
Эта функция закрывает сессию CURL и освобождает все ресурсы.
CURL-дескриптор ch также удаляется.
curl_errno
curl_errno — возвращает целое число, содержащее номер последней ошибки.
Описание
int curl_errno ( resource ch)
curl_error
curl_error — возвращает строку содержащую номер последней ошибки для текущей сессии.
Описание
string curl_error (resource ch)
curl_getinfo
curl_getinfo — получает информацию, касающуюся специфической передачи/transfer.
Описание
string curl_getinfo (resource ch, int opt)
-
CURLINFO_EFFECTIVE_URL — Последний
использованный URL
-
CURLINFO_HTTP_CODE — Последний полученный код
HTTP
-
CURLINFO_FILETIME — Дата модификации
загруженного документа, если она неизвестна, возвращается -1.
-
CURLINFO_TOTAL_TIME — Полное время выполнения
операции в секундах.
-
CURLINFO_NAMELOOKUP_TIME — Время разрешения
имени сервера в секундах.
-
CURLINFO_CONNECT_TIME — Время, затраченное на
установку соединения, в секундах
-
CURLINFO_PRETRANSFER_TIME — Время, прошедшее
от начала операции до готовности к фактической передаче данных, в
секундах
-
CURLINFO_STARTTRANSFER_TIME — Время, прошедшее
от начала операции до момента передачи первого байта данных, в
секундах
-
CURLINFO_REDIRECT_TIME — Общее время,
затраченное на перенапрвления, в секундах
-
CURLINFO_SIZE_UPLOAD — Количество байт при
закачке
-
CURLINFO_SIZE_DOWNLOAD — Количество байт при
загрузке
-
CURLINFO_SPEED_DOWNLOAD — Средняя скорость
закачки
-
CURLINFO_SPEED_UPLOAD — Средняя скорость
загрузки
-
CURLINFO_HEADER_SIZE — Суммарный размер всех
полученных заголовков
-
CURLINFO_REQUEST_SIZE — Суммарный размер всех
отправленных запросов, в настоящее время используется только для HTTP запросов
-
CURLINFO_SSL_VERIFYRESULT — Результат
проверки SSL сертификата, запрошенной с помощью установки
параметра CURLOPT_SSL_VERIFYPEER
-
CURLINFO_CONTENT_LENGTH_DOWNLOAD —
размер загруженного документа, прочитанный из заголовка
Content-Length
-
CURLINFO_CONTENT_LENGTH_UPLOAD — Размер
закачиваемых данных
-
CURLINFO_CONTENT_TYPE — Содержимое
полученного заголовка Content-type, или NULL в случае, когда этот
заголовок не был получен
При вызове без необязательного аргумента opt
возвращается ассоциативный массив со следующими индексами, которые
соответствуют значениям аргумента opt:
-
«url»
-
«content_type»
-
«http_code»
-
«header_size»
-
«request_size»
-
«filetime»
-
«ssl_verify_result»
-
«redirect_count»
-
«total_time»
-
«namelookup_time»
-
«connect_time»
-
«pretransfer_time»
-
«size_upload»
-
«size_download»
-
«speed_download»
-
«speed_upload»
-
«download_content_length»
-
«upload_content_length»
-
«starttransfer_time»
-
«redirect_time»
Пример использования curl_getinfo:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.example.com/"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLINFO_HEADER_OUT, true); // если этот параметр не указать не работает! curl_exec($ch); var_dump(curl_getinfo($ch,CURLINFO_HEADER_OUT));
Пример использования curl_getinfo:
$ch = curl_init(); // create cURL handle (ch) if (!$ch) { die("Couldn't initialize a cURL handle"); } // set some cURL options $ret = curl_setopt($ch, CURLOPT_URL, "http://mail.yahoo.com"); $ret = curl_setopt($ch, CURLOPT_HEADER, 1); $ret = curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); $ret = curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0); $ret = curl_setopt($ch, CURLOPT_TIMEOUT, 30); // execute $ret = curl_exec($ch); if (empty($ret)) { // some kind of an error happened die(curl_error($ch)); curl_close($ch); // close cURL handler } else { $info = curl_getinfo($ch); curl_close($ch); // close cURL handler if (empty($info['http_code'])) { die("No HTTP code was returned"); } else { // load the HTTP codes $http_codes = parse_ini_file("path/to/the/ini/file/I/pasted/above"); // echo results echo "The server responded: <br />"; echo $info['http_code'] . " " . $http_codes[$info['http_code']]; } }
curl_version
curl_version — возвращает версию текущей CURL.
Описание
string curl_version (void)
Функция curl_version() возвращает строку с текущей версией CURL.
curl_version=Array
(
[version_number] => 472065
[age] => 3
[features] => 4179869
[ssl_version_number] => 0
[version] => 7.52.1
[host] => x86_64-pc-linux-gnu
[ssl_version] => OpenSSL/1.0.2u
[libz_version] => 1.2.8
[protocols] => Array
(
[0] => dict
[1] => file
[2] => ftp
[3] => ftps
[4] => gopher
[5] => http
[6] => https
[7] => imap
[8] => imaps
[9] => ldap
[10] => ldaps
[11] => pop3
[12] => pop3s
[13] => rtmp
[14] => rtsp
[15] => scp
[16] => sftp
[17] => smb
[18] => smbs
[19] => smtp
[20] => smtps
[21] => telnet
[22] => tftp
)
)
Предопределённые константы
Эти константы определены данным расширением и будут доступны только в том
случае, если либо вкомпилированы в РНР, либо динамически загружены на этапе прогона.
- CURLOPT_PORT (integer)
- CURLOPT_FILE (integer)
- CURLOPT_INFILE (integer)
- CURLOPT_INFILESIZE (integer)
- CURLOPT_URL (integer)
- CURLOPT_PROXY (integer)
- CURLOPT_VERBOSE (integer)
- CURLOPT_HEADER (integer)
- CURLOPT_HTTPHEADER (integer)
- CURLOPT_NOPROGRESS (integer)
- CURLOPT_NOBODY (integer)
- CURLOPT_FAILONERROR (integer)
- CURLOPT_UPLOAD (integer)
- CURLOPT_POST (integer)
- CURLOPT_FTPLISTONLY (integer)
- CURLOPT_FTPAPPEND (integer)
- CURLOPT_NETRC (integer)
- CURLOPT_FOLLOWLOCATION (integer)
- CURLOPT_FTPASCII (integer)
- CURLOPT_PUT (integer)
- CURLOPT_MUTE (integer)
- CURLOPT_USERPWD (integer)
- CURLOPT_PROXYUSERPWD (integer)
- CURLOPT_RANGE (integer)
- CURLOPT_TIMEOUT (integer)
- CURLOPT_POSTFIELDS (integer)
- CURLOPT_REFERER (integer)
- CURLOPT_USERAGENT (integer)
- CURLOPT_FTPPORT (integer)
- CURLOPT_LOW_SPEED_LIMIT (integer)
- CURLOPT_LOW_SPEED_TIME (integer)
- CURLOPT_RESUME_FROM (integer)
- CURLOPT_COOKIE (integer)
- CURLOPT_SSLCERT (integer)
- CURLOPT_SSLCERTPASSWD (integer)
- CURLOPT_WRITEHEADER (integer)
- CURLOPT_SSL_VERIFYHOST (integer)
- CURLOPT_COOKIEFILE (integer)
- CURLOPT_SSLVERSION (integer)
- CURLOPT_TIMECONDITION (integer)
- CURLOPT_TIMEVALUE (integer)
- CURLOPT_CUSTOMREQUEST (integer)
- CURLOPT_STDERR (integer)
- CURLOPT_TRANSFERTEXT (integer)
- CURLOPT_RETURNTRANSFER (integer)
- CURLOPT_QUOTE (integer)
- CURLOPT_POSTQUOTE (integer)
- CURLOPT_INTERFACE (integer)
- CURLOPT_KRB4LEVEL (integer)
- CURLOPT_HTTPPROXYTUNNEL (integer)
- CURLOPT_FILETIME (integer)
- CURLOPT_WRITEFUNCTION (integer)
- CURLOPT_READFUNCTION (integer)
- CURLOPT_PASSWDFUNCTION (integer)
- CURLOPT_HEADERFUNCTION (integer)
- CURLOPT_MAXREDIRS (integer)
- CURLOPT_MAXCONNECTS (integer)
- CURLOPT_CLOSEPOLICY (integer)
- CURLOPT_FRESH_CONNECT (integer)
- CURLOPT_FORBID_REUSE (integer)
- CURLOPT_RANDOM_FILE (integer)
- CURLOPT_EGDSOCKET (integer)
- CURLOPT_CONNECTTIMEOUT (integer)
- CURLOPT_SSL_VERIFYPEER (integer)
- CURLOPT_CAINFO (integer)
- CURLOPT_COOKIEJAR (integer)
- CURLOPT_SSL_CIPHER_LIST (integer)
- CURLOPT_BINARYTRANSFER (integer)
- CURLCLOSEPOLICY_LEAST_RECENTLY_USED (integer)
- CURLCLOSEPOLICY_LEAST_TRAFFIC (integer)
- CURLCLOSEPOLICY_SLOWEST (integer)
- CURLCLOSEPOLICY_CALLBACK (integer)
- CURLCLOSEPOLICY_OLDEST (integer)
- CURLINFO_EFFECTIVE_URL (integer)
- CURLINFO_HTTP_CODE (integer)
- CURLINFO_HEADER_SIZE (integer)
- CURLINFO_REQUEST_SIZE (integer)
- CURLINFO_TOTAL_TIME (integer)
- CURLINFO_NAMELOOKUP_TIME (integer)
- CURLINFO_CONNECT_TIME (integer)
- CURLINFO_PRETRANSFER_TIME (integer)
- CURLINFO_SIZE_UPLOAD (integer)
- CURLINFO_SIZE_DOWNLOAD (integer)
- CURLINFO_SPEED_DOWNLOAD (integer)
- CURLINFO_SPEED_UPLOAD (integer)
- CURLINFO_FILETIME (integer)
- CURLINFO_SSL_VERIFYRESULT (integer)
- CURLINFO_CONTENT_LENGTH_DOWNLOAD (integer)
- CURLINFO_CONTENT_LENGTH_UPLOAD (integer)
- CURLE_OK (integer)
- CURLE_UNSUPPORTED_PROTOCOL (integer)
- CURLE_FAILED_INIT (integer)
- CURLE_URL_MALFORMAT (integer)
- CURLE_URL_MALFORMAT_USER (integer)
- CURLE_COULDNT_RESOLVE_PROXY (integer)
- CURLE_COULDNT_RESOLVE_HOST (integer)
- CURLE_COULDNT_CONNECT (integer)
- CURLE_FTP_WEIRD_SERVER_REPLY (integer)
- CURLE_FTP_ACCESS_DENIED (integer)
- CURLE_FTP_USER_PASSWORD_INCORRECT (integer)
- CURLE_FTP_WEIRD_PASS_REPLY (integer)
- CURLE_FTP_WEIRD_USER_REPLY (integer)
- CURLE_FTP_WEIRD_PASV_REPLY (integer)
- CURLE_FTP_WEIRD_227_FORMAT (integer)
- CURLE_FTP_CANT_GET_HOST (integer)
- CURLE_FTP_CANT_RECONNECT (integer)
- CURLE_FTP_COULDNT_SET_BINARY (integer)
- CURLE_PARTIAL_FILE (integer)
- CURLE_FTP_COULDNT_RETR_FILE (integer)
- CURLE_FTP_WRITE_ERROR (integer)
- CURLE_FTP_QUOTE_ERROR (integer)
- CURLE_HTTP_NOT_FOUND (integer)
- CURLE_WRITE_ERROR (integer)
- CURLE_MALFORMAT_USER (integer)
- CURLE_FTP_COULDNT_STOR_FILE (integer)
- CURLE_READ_ERROR (integer)
- CURLE_OUT_OF_MEMORY (integer)
- CURLE_OPERATION_TIMEOUTED (integer)
- CURLE_FTP_COULDNT_SET_ASCII (integer)
- CURLE_FTP_PORT_FAILED (integer)
- CURLE_FTP_COULDNT_USE_REST (integer)
- CURLE_FTP_COULDNT_GET_SIZE (integer)
- CURLE_HTTP_RANGE_ERROR (integer)
- CURLE_HTTP_POST_ERROR (integer)
- CURLE_SSL_CONNECT_ERROR (integer)
- CURLE_FTP_BAD_DOWNLOAD_RESUME (integer)
- CURLE_FILE_COULDNT_READ_FILE (integer)
- CURLE_LDAP_CANNOT_BIND (integer)
- CURLE_LDAP_SEARCH_FAILED (integer)
- CURLE_LIBRARY_NOT_FOUND (integer)
- CURLE_FUNCTION_NOT_FOUND (integer)
- CURLE_ABORTED_BY_CALLBACK (integer)
- CURLE_BAD_FUNCTION_ARGUMENT (integer)
- CURLE_BAD_CALLING_ORDER (integer)
- CURLE_HTTP_PORT_FAILED (integer)
- CURLE_BAD_PASSWORD_ENTERED (integer)
- CURLE_TOO_MANY_REDIRECTS (integer)
- CURLE_UNKNOWN_TELNET_OPTION (integer)
- CURLE_TELNET_OPTION_SYNTAX (integer)
- CURLE_OBSOLETE (integer)
- CURLE_SSL_PEER_CERTIFICATE (integer)
Примеры
После того как вы скомпилировали PHP с поддержкой CURL, вы можете начать
использовать curl-функций. Основная идея функций CURL — вы инициализируете CURL-сессию
с использованием curl_init(), затем можно установить все ваши опции для трансфера через использование
curl_exec(), а затем закрыть сессию функцией curl_close().
Пример 1. Инициализация новой сессии CURL и получение web-страницы.
<?php $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, "http://www.example.com/"); curl_setopt ($ch, CURLOPT_HEADER, 0); curl_exec ($ch); curl_close ($ch); ?>
Пример 2. Использование модуля CURL РНР для получения example.com
<?php $ch = curl_init ("http://www.example.com/"); $fp = fopen ("example_homepage.txt", "w"); curl_setopt ($ch, CURLOPT_FILE, $fp); curl_setopt ($ch, CURLOPT_HEADER, 0); curl_exec ($ch); curl_close ($ch); fclose ($fp); ?>
Пример 3. Проверка доступности URL с помощью CURL РНР
<?php function check_url($url) { $c = curl_init(); curl_setopt($c, CURLOPT_URL, $url); curl_setopt($c, CURLOPT_HEADER, 1); // читать заголовок curl_setopt($c, CURLOPT_NOBODY, 1); // читать ТОЛЬКО заголовок без тела curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); curl_setopt($c, CURLOPT_FRESH_CONNECT, 1); // не использовать cache if (!curl_exec($c)) return false; $httpcode = curl_getinfo($c, CURLINFO_HTTP_CODE); return ($httpcode < 400); } ?>
Пример 4. Отделение заголовка от тела, полученного с помощью CURL РНР
<?php $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $headers = substr($output, 0, $header_size - 4); $body = substr($output, $header_size); ?>
Пример 5. Определение адреса перехода URL с помощью CURL РНР
the problem: curl_setopt($ch,FOLLOW_LOCATION,1);
the error: trouble with open_basedir and safe_mode
the solution: a function already developed by someone
the solution n 2: the same function, modifed, works great for me..
<?php function curl_redir_exec($ch) { static $curl_loops = 0; static $curl_max_loops = 20; if ($curl_loops++ >= $curl_max_loops) { $curl_loops = 0; return FALSE; } curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $data = curl_exec($ch); list($header, $data) = explode("nn", $data, 2); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($http_code == 301 || $http_code == 302) { $matches = []; preg_match('/Location:(.*?)n/', $header, $matches); $url = @parse_url(trim(array_pop($matches))); if (!$url) { //couldn't process the url to redirect to $curl_loops = 0; return $data; } $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL)); if (!$url['scheme']) $url['scheme'] = $last_url['scheme']; if (!$url['host']) $url['host'] = $last_url['host']; if (!$url['path']) $url['path'] = $last_url['path']; $new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:''); curl_setopt($ch, CURLOPT_URL, $new_url); debug('Redirecting to', $new_url); return curl_redir_exec($ch); } else { $curl_loops=0; return $data; } } ?>
just use this function without de FOLLOW_LOCATION and should work. the problem was that when you get to the line where you return the data if http_code was different than 301 oe 302, $data has obsolete information or none. so $debbbb does the job.
Пример 6. Разбор cookie из заголовка с помощью CURL РНР
Sometimes you can’t use CURLOPT_COOKIEJAR and CURLOPT_COOKIEFILE becoz of the server
php-settings(They say u may grab any files from server using these options). Here is the solution
1)Don’t use CURLOPT_FOLLOWLOCATION
2)Use curl_setopt($ch, CURLOPT_HEADER, 1)
3)Grab from the header cookies like this:
preg_match_all('|Set-Cookie: (.*);|U', $content, $results); $cookies = implode(';', $results[1]);
4)Set them using curl_setopt($ch, CURLOPT_COOKIE, $cookies);
Пример 7. Разбор cookie из заголовка с помощью CURL РНР
As Yevgen mentioned earlier sometimes we can’t use CURLOPT_COOKIEJAR and CURLOPT_COOKIEFILE. Below is a header callback function I wrote back in
January that lets you maintain cookies between cURL requests. Cookies are added to $ch during all requests even during redirection,
so you can use it together with CURLOPT_FOLLOWLOCATION.
Here is the code:
function read_header($ch, $string)
{
global $location; #keep track of location/redirects
global $cookiearr; #store cookies here
global $ch;
# ^overrides the function param $ch
# this is okay because we need to
# update the global $ch with
# new cookies
$length = strlen($string);
if(!strncmp($string, "Location:", 9))
{ #keep track of last redirect
$location = trim(substr($string, 9, -1));
}
if(!strncmp($string, "Set-Cookie:", 11))
{ #get the cookie
$cookiestr = trim(substr($string, 11, -1));
$cookie = explode(';', $cookiestr);
$cookie = explode('=', $cookie[0]);
$cookiename = trim(array_shift($cookie));
$cookiearr[$cookiename] = trim(implode('=', $cookie));
}
$cookie = "";
if(trim($string) == "")
{ #execute only at end of header
foreach ($cookiearr as $key=>$value)
{
$cookie .= "$key=$value; ";
}
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
}
return $length;
}
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'read_header');
This code assumes that you will reuse $ch without initializing it every time (call curl_init only once, in the beginning).
If you need to initialize $ch again at any point in your code you can access the currently stored cookies in $cookiearr and include them in the new $ch.
I wrote this function before I had enough experience with regular expressions so you won’t find any preg_match calls here.
I have used this code for quite a while and without any problems accessing gmail, yahoo, hotmail, aol etc.
where I had to go through login and a few pages before getting to what I was looking for.
Пример 8. Установка обработчика загрузки заголовка с помощью CURL РНР
Using cURL, I needed to call a third-party script which was returning binary data as attachment to pass on retrieved data again as attachment.
Problem was that the third-party script occassionally returned HTTP errors and I wanted to avoid passing on zero-length attachment in such case.
Combination of using CURLOPT_FAILONERROR and CURLOPT_HEADERFUNCTION callback helped to process the third-party script HTTP errors neatly:
function curlHeaderCallback($resURL, $strHeader) {
if (preg_match('/^HTTP/i', $strHeader)) {
header($strHeader);
header('Content-Disposition: attachment; filename="file-name.zip"');
}
return strlen($strHeader);
}
$resURL = curl_init('http://htmlweb.ru/');
curl_setopt($resURL, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($resURL, CURLOPT_HEADERFUNCTION, 'curlHeaderCallback');
curl_setopt($resURL, CURLOPT_FAILONERROR, 1);
curl_exec ($resURL);
$intReturnCode = curl_getinfo($resURL, CURLINFO_HTTP_CODE);
curl_close ($resURL);
if ($intReturnCode != 200) {
print 'Ошибка с кодом: ' . $intReturnCode;
}
Пример 9. Сохранение страницы в файл с подсчетом скорости передачи с помощью CURL РНР
WritePageToFile( 'http://es.php.net', 'es.php.net.txt' );
function WritePageToFile( $sHTMLpage, $sTxtfile ) {
$sh = curl_init( $sHTMLpage );
$hFile = FOpen( $sTxtfile, 'w' );
curl_setopt( $sh, CURLOPT_FILE, $hFile );
curl_setopt( $sh, CURLOPT_HEADER, 0 );
curl_exec ( $sh );
$sAverageSpeedDownload = curl_getInfo( $sh, CURLINFO_SPEED_DOWNLOAD );
$sAverageSpeedUpload = curl_getInfo( $sh, CURLINFO_SPEED_UPLOAD );
echo '<pre>';
echo 'Average speed download == ' . $sAverageSpeedDownload . '<br>';
echo 'Average Speed upload == ' . $sAverageSpeedUpload . '<br>';
echo '<br>';
$aCURLinfo = curl_getInfo( $sh );
print_r( $aCURLinfo );
echo '</pre>';
curl_close( $sh );
FClose ( $hFile );
echo '(<b>See the file "'.$sTxtfile.'" in the same path of the hosting'.
' to where this script PHP</b>).<br>';
}
Пример 9. Получение страницы через SSL соединение (https)
$ch=curl_init('https://htmlweb.ru');
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// Отключить ошибку "SSL certificate problem, verify that the CA cert is OK"
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
// Отключить ошибку "SSL: certificate subject name 'hostname.ru' does not match target host name '123.123'"
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
$out=curl_exec($ch);
//$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//echo "http_code=".$http_code,', err='.curl_error($ch);
curl_close($ch);
Пример 10. Использование сессий и cookie в curl
$cookie_filename=sys_get_temp_dir()+'/cookie.tmp';
$curl=curl_init('http://htmlweb.ru');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_filename);//сохранять полученные COOKIE в файл
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_filename); //отсылаем серверу COOKIE полученные от него при авторизации
$out=curl_exec($curl);
Пример 11. Отправка файла и многомерный массив в Curl. CURLOPT_POSTFIELDS + CurlFile
Если Вам нужно будет отправить в POST запросе многомерный массив и файл, то вы столкнетесь с неразрешимой проблемой.
Если передавать в CURLOPT_POSTFIELDS многомерный массив, то второй уровень будет передан как строка «Array».
Если преобразовать с помощью http_build_query, то Вы не сможете передать файл.
Ниже представлена функция кодирования двумерного массива с подгрузкой файлов для Curl,
которая будет работать как в старых версиях PHP 5.3, PHP 5.4, так и в PHP 5.6
/** преобразует многомерный массив в одномерный, используйя сложные индексы и заменяет @ в префиксе на CurlFile для испрользоания в Curl
* @param $inputArray
* @param string $inputKey
* @return array
$requestVars = array(
'id' => array(1, 2,'id'=>1234),
'name' => 'log',
'logfile' => '@/tmp/test.log');
получим:
["id[0]"]=> int(1)
["id[1]"]=> int(2)
["id[id]"]=> int(1234)
["name"]=> string(3) "log"
["logfile"]=> string(13) "/tmp/test.log" }
*/
function convertToStringArray($inputArray, $inputKey='') {
$resultArray=[];
foreach ($inputArray as $key => $value) {
$tmpKey = (bool)$inputKey ? $inputKey."[$key]" : $key;
if (is_array($value)) {
$resultArray+=convertToStringArray($value, $tmpKey);
} elseif ($value[0] == '@'){
$resultArray[$tmpKey] = (class_exists(' CURLFile ', false)) ? new CurlFile(ltrim($value, '@')) : $value;
} else {
$resultArray[$tmpKey] = $value;
}
}
return $resultArray;
}
// проверяем
$requestVars = array(
'id' => array(1, 2,'id'=>1234),
'name' => 'log',
'logfile' => '@/tmp/test.log');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'htmlweb.ru');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, convertToStringArray($requestVars));
$res = curl_exec($ch);
curl_close($ch);
Прикладные примеры использования Curl
Читать дальше: htaccess и PHP