I wrote the following to see if a submitted URL has a valid http response code and also if it responds quickly.
Use the code like this:
<?php
$is_ok = http_response($url); // returns true only if http response code < 400
?>
The second argument is optional, and it allows you to check for a specific response code
<?php
http_response($url,'400'); // returns true if http status is 400
?>
The third allows you to specify how long you are willing to wait for a response.
<?php
http_response($url,'200',3); // returns true if the response takes less than 3 seconds and the response code is 200
?>
<?php
function http_response($url, $status = null, $wait = 3)
{
$time = microtime(true);
$expire = $time + $wait;
// we fork the process so we don't have to wait for a timeout
$pid = pcntl_fork();
if ($pid == -1) {
die('could not fork');
} else if ($pid) {
// we are the parent
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_NOBODY, TRUE); // remove body
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$head = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if(!$head)
{
return FALSE;
}
if($status === null)
{
if($httpCode < 400)
{
return TRUE;
}
else
{
return FALSE;
}
}
elseif($status == $httpCode)
{
return TRUE;
}
return FALSE;
pcntl_wait($status); //Protect against Zombie children
} else {
// we are the child
while(microtime(true) < $expire)
{
sleep(0.5);
}
return FALSE;
}
}
?>
Hope this example helps. It is not 100% tested, so any feedback [sent directly to me by email] is appreciated.
PHP.mk документација
cURL
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Патека
book.curl.php
Локална патека за оваа страница.
Извор
php.net/manual/en
Оригиналниот HTML се реупотребува и локално се стилизира.
Режим
Прокси + преведен приказ
Кодовите, табелите и белешките остануваат читливи во истиот тек.
Референца
book.curl.php
cURL
Референца за `book.curl.php` со подобрена типографија и навигација.
Библиотека за URL на клиентот
Вовед
PHP поддржува libcurl, библиотека креирана од Даниел Стенберг, која ви овозможува да се поврзете и комуницирате со многу различни типови на сервери со многу различни типови на протоколи. libcurl моментално поддржува http, https, ftp, gopher, telnet, dict, file и ldap протоколи. libcurl исто така поддржува HTTPS сертификати, HTTP POST, HTTP PUT, FTP качување (ова може да се направи и со ftp екстензијата на PHP), качување базирано на HTTP формула, прокси, колачиња и автентикација корисник+лозинка.
- Installing/Configuring
- Претходно дефинирани константи
- Примери
- - Иницијализирај cURL заедничка рачка
- curl_close — Затвори cURL сесија
- curl_copy_handle — Копирај cURL рачка заедно со сите нејзини преференции
- curl_errno — Врати го последниот број на грешка
- curl_error — Врати стринг што го содржи последниот грешка за тековната сесија
- curl_escape — URL кодира даден стринг
- curl_exec — Изврши cURL сесија
- curl_getinfo — Добиј информации во врска со специфичен трансфер
- curl_init — Иницијализирај cURL сесија
- curl_multi_add_handle — Додај нормална cURL рачка во cURL мулти рачка
- curl_multi_close — Отстрани ги сите cURL рачки од мулти рачка
- curl_multi_errno — Врати го последниот број на мулти curl грешка
- curl_multi_exec — Стартувај ги под-врските на тековната cURL рачка
- curl_multi_getcontent — Врати ја содржината на cURL рачка ако е поставено CURLOPT_RETURNTRANSFER
- curl_multi_info_read — Добиј информации за тековните трансфери
- curl_multi_init — Врати нова cURL мулти рачка
- curl_multi_remove_handle — Отстрани рачка од сет на cURL рачки
- curl_multi_select — Почекај додека читањето или пишувањето не е можно за било која cURL мулти рачка врска
- curl_multi_setopt — Постави опција за cURL multi
- curl_multi_strerror — Врати стринг што опишува код за грешка
- curl_pause — Паузирај и продолжи конекција
- curl_reset — Ресетирај ги сите опции на рачката на cURL сесијата
- curl_setopt — Постави опција за cURL трансфер
- curl_setopt_array — Постави повеќе опции за cURL трансфер
- curl_share_close — Затвори рачка на cURL за споделување
- curl_share_errno — Врати го последниот број на грешка при споделување на curl
- curl_share_init — Иницијализирај рачка на cURL за споделување
- curl_share_init_persistent — Иницијализирај постојана рачка на cURL за споделување
- curl_share_setopt — Постави опција за cURL за споделување
- curl_share_strerror — Врати стринг што опишува даден код за грешка
- curl_strerror — Врати стринг што опишува даден код за грешка
- curl_unescape — Декодирај го дадениот URL кодиран стринг
- curl_upkeep — Изврши проверки за одржување на конекцијата
- curl_version — Добиј информации за верзијата на cURL
- CurlHandle — Класата CurlHandle
- CurlMultiHandle — Класата CurlMultiHandle
- CurlShareHandle — Класата CurlShareHandle
- CurlSharePersistentHandle — Класата CurlSharePersistentHandle
- CURLFile — Класата CURLFile
- CURLFile::__construct — Креирај CURLFile објект
- CURLFile::getFilename — Земи име на датотека
- CURLFile::getMimeType — Земи MIME тип
- CURLFile::getPostFilename — Земи име на датотека за POST
- CURLFile::setMimeType — Постави MIME тип
- CURLFile::setPostFilename — Поставете име на датотека за POST
- CURLStringFile — Класата CURLStringFile
- CURLStringFile::__construct — Создадете објект CURLStringFile
Белешки од корисници 9 белешки
frank на interactinet dot com ¶
пред 15 години
artax_N_O_S_P_A_M_erxes2 на iname dot com ¶
пред 15 години
I needed to use cURL in a php script to download data using not only SSL for the server authentication but also for client authentication.
On a default install of Fedora, setting up the proper cURL parameters, I would get an error:
$ php curl.php
Peer certificate cannot be authenticated with known CA certificates
The data on http://curl.haxx.se/docs/sslcerts.html was most useful. Indeed, toward to bottom it tells you to add a missing link inside /etc/pki/nssdb to use the ca-bundle.crt file. You do it so:
# cd /etc/pki/nssdb
# ln -s /usr/lib64/libnssckbi.so libnssckbi.so
Now you can do client authentication, provided you have your certificate handy with:
<?php
$data = "<soap:Envelope>[...]</soap:Envelope>";
$tuCurl = curl_init();
curl_setopt($tuCurl, CURLOPT_URL, "https://example.com/path/for/soap/url/");
curl_setopt($tuCurl, CURLOPT_PORT , 443);
curl_setopt($tuCurl, CURLOPT_VERBOSE, 0);
curl_setopt($tuCurl, CURLOPT_HEADER, 0);
curl_setopt($tuCurl, CURLOPT_SSLVERSION, 3);
curl_setopt($tuCurl, CURLOPT_SSLCERT, getcwd() . "/client.pem");
curl_setopt($tuCurl, CURLOPT_SSLKEY, getcwd() . "/keyout.pem");
curl_setopt($tuCurl, CURLOPT_CAINFO, getcwd() . "/ca.pem");
curl_setopt($tuCurl, CURLOPT_POST, 1);
curl_setopt($tuCurl, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($tuCurl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($tuCurl, CURLOPT_POSTFIELDS, $data);
curl_setopt($tuCurl, CURLOPT_HTTPHEADER, array("Content-Type: text/xml","SOAPAction: \"/soap/action/query\"", "Content-length: ".strlen($data)));
$tuData = curl_exec($tuCurl);
if(!curl_errno($tuCurl)){
$info = curl_getinfo($tuCurl);
echo 'Took ' . $info['total_time'] . ' seconds to send a request to ' . $info['url'];
} else {
echo 'Curl error: ' . curl_error($tuCurl);
}
curl_close($tuCurl);
echo $tuData;
?>
ReflectionParameter::isPassedByReference() ¶
пред 9 години
WARNING WARNING
In this example: http://php.net/manual/en/book.curl.php#102885 by "frank at interactinet dot com"
There's a small bug in
<?php
...
elseif($status == $httpCode)
{
return TRUE;
}
return FALSE;
pcntl_wait($status); //Protect against Zombie children
} else {
// we are the child
while(microtime(true) < $expire)
...
?>
The code will immediately leave the function at the `return`, and pcntl_wait() will NEVER be executed, under any circumstances.
I can't see any other issues with this function however.
artem на zabsoft dot co dot in ¶
пред 16 години
Hey I modified script for php 5. Also I add support server auth. and fixed some little bugs on the script.
[EDIT BY danbrown AT php DOT net: Original was written by (unlcuky13 AT gmail DOT com) on 19-APR-09. The following note was included:
Below is the my way of using through PHP 5 objecte oriented encapsulation to make thing easier.]
<?php
class mycurl {
protected $_useragent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1';
protected $_url;
protected $_followlocation;
protected $_timeout;
protected $_maxRedirects;
protected $_cookieFileLocation = './cookie.txt';
protected $_post;
protected $_postFields;
protected $_referer ="http://www.google.com";
protected $_session;
protected $_webpage;
protected $_includeHeader;
protected $_noBody;
protected $_status;
protected $_binaryTransfer;
public $authentication = 0;
public $auth_name = '';
public $auth_pass = '';
public function useAuth($use){
$this->authentication = 0;
if($use == true) $this->authentication = 1;
}
public function setName($name){
$this->auth_name = $name;
}
public function setPass($pass){
$this->auth_pass = $pass;
}
public function __construct($url,$followlocation = true,$timeOut = 30,$maxRedirecs = 4,$binaryTransfer = false,$includeHeader = false,$noBody = false)
{
$this->_url = $url;
$this->_followlocation = $followlocation;
$this->_timeout = $timeOut;
$this->_maxRedirects = $maxRedirecs;
$this->_noBody = $noBody;
$this->_includeHeader = $includeHeader;
$this->_binaryTransfer = $binaryTransfer;
$this->_cookieFileLocation = dirname(__FILE__).'/cookie.txt';
}
public function setReferer($referer){
$this->_referer = $referer;
}
public function setCookiFileLocation($path)
{
$this->_cookieFileLocation = $path;
}
public function setPost ($postFields)
{
$this->_post = true;
$this->_postFields = $postFields;
}
public function setUserAgent($userAgent)
{
$this->_useragent = $userAgent;
}
public function createCurl($url = 'nul')
{
if($url != 'nul'){
$this->_url = $url;
}
$s = curl_init();
curl_setopt($s,CURLOPT_URL,$this->_url);
curl_setopt($s,CURLOPT_HTTPHEADER,array('Expect:'));
curl_setopt($s,CURLOPT_TIMEOUT,$this->_timeout);
curl_setopt($s,CURLOPT_MAXREDIRS,$this->_maxRedirects);
curl_setopt($s,CURLOPT_RETURNTRANSFER,true);
curl_setopt($s,CURLOPT_FOLLOWLOCATION,$this->_followlocation);
curl_setopt($s,CURLOPT_COOKIEJAR,$this->_cookieFileLocation);
curl_setopt($s,CURLOPT_COOKIEFILE,$this->_cookieFileLocation);
if($this->authentication == 1){
curl_setopt($s, CURLOPT_USERPWD, $this->auth_name.':'.$this->auth_pass);
}
if($this->_post)
{
curl_setopt($s,CURLOPT_POST,true);
curl_setopt($s,CURLOPT_POSTFIELDS,$this->_postFields);
}
if($this->_includeHeader)
{
curl_setopt($s,CURLOPT_HEADER,true);
}
if($this->_noBody)
{
curl_setopt($s,CURLOPT_NOBODY,true);
}
/*
if($this->_binary)
{
curl_setopt($s,CURLOPT_BINARYTRANSFER,true);
}
*/
curl_setopt($s,CURLOPT_USERAGENT,$this->_useragent);
curl_setopt($s,CURLOPT_REFERER,$this->_referer);
$this->_webpage = curl_exec($s);
$this->_status = curl_getinfo($s,CURLINFO_HTTP_CODE);
curl_close($s);
}
public function getHttpStatus()
{
return $this->_status;
}
public function __tostring(){
return $this->_webpage;
}
}
?>
[EDIT BY danbrown AT php DOT net: Contains a bugfix supplied by "roetsch.beni at googlemail (dot) com" on 02-AUG-09, with the following note: "Fixes the bugfix: 417 bug at lighthttp server."]
jcmargentina на gmail dot com ¶
пред 6 години
Please note that new versions of curl is using http2 as default, so if you are having some strange errors, 0 http status codes, etc, please explicitly specify the http version in your code.
ramez на dot dontspan dot zegenie dot com ¶
пред 15 години
CURL failed with PHP5.3 and Apache2.2.X on my Windows 7 machine.
It turns out that it's not enough to copy the two dll's mentioned (libeay32 and sslea32) from the php folder into your system32 folder. You HAVE TO UNBLOCK THESE TWO FILES.
Right click the file, select unblock, for each one. Then restart Apache.
Another very handy security feature added into Windows.
zle.lc ¶
пред 4 години
Sharing is caring, handles included.
<?php
$url_one = "php.net";
$url_two = "";
$user_agent = 'Mozilla HotFox 1.0';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url_one.$url_two);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOBODY, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$res = curl_exec($ch);
curl_close($ch);
$url_two = "lazyphp.net";
$url_one = "";
$res_two = curl_exec($ch);
curl_close($ch);
?>
qrworld.net ¶
пред 11 години
Here you have a function that I use to get the content of a URL using cURL:
function getUrlContent($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$data = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return ($httpcode>=200 && $httpcode<300) ? $data : false;
}
The source comes from this website:
http://softontherocks.blogspot.com/2014/11/descargar-el-contenido-de-una-url.html
fred dot knieper на gmail dot com ¶
12 години пред
After a lot of frustration with the fact that nobody has documented which curl commandline options go with which library functions, I discovered that the curl commandline will tell you (in the form of a C program) if you add `--libcurl foo.c`
If you've been struggling with trying to figure out how to get your fancy curl commandline to work in PHP, this makes it a breeze!