Клиентская библиотека работы с URL

Коментарии

In order to use curl with secure sites you will need a ca-bundle.crt file; here's a PHP script I've written which creates a fresh ca-bundle:
http://www.gknw.net/php/phpscripts/mk-ca-bundle.php
I've also written scripts in other languages, f.e. the Perl one which ships now with curl distributions:
http://curl.haxx.se/lxr/source/lib/mk-ca-bundle.pl
and also a Win32 WSH script if you prefer that:
http://www.gknw.net/vb/scripts/mk-ca-bundle.vbs

HTH, Guenter.
2008-10-05 12:45:34
http://php5.kiev.ua/manual/ru/book.curl.html
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($sCURLOPT_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."]
2009-05-11 14:43:18
http://php5.kiev.ua/manual/ru/book.curl.html
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($tuCurlCURLOPT_URL"https://example.com/path/for/soap/url/");
curl_setopt($tuCurlCURLOPT_PORT 443);
curl_setopt($tuCurlCURLOPT_VERBOSE0);
curl_setopt($tuCurlCURLOPT_HEADER0);
curl_setopt($tuCurlCURLOPT_SSLVERSION3);
curl_setopt($tuCurlCURLOPT_SSLCERTgetcwd() . "/client.pem");
curl_setopt($tuCurlCURLOPT_SSLKEYgetcwd() . "/keyout.pem");
curl_setopt($tuCurlCURLOPT_CAINFOgetcwd() . "/ca.pem");
curl_setopt($tuCurlCURLOPT_POST1);
curl_setopt($tuCurlCURLOPT_SSL_VERIFYPEER1);
curl_setopt($tuCurlCURLOPT_RETURNTRANSFER1);
curl_setopt($tuCurlCURLOPT_POSTFIELDS$data);
curl_setopt($tuCurlCURLOPT_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;
?>
2010-09-17 11:59:59
http://php5.kiev.ua/manual/ru/book.curl.html
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.
2010-10-28 00:19:23
http://php5.kiev.ua/manual/ru/book.curl.html
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($chCURLOPT_URL$url);
           
curl_setopt($chCURLOPT_HEADERTRUE);
           
curl_setopt($chCURLOPT_NOBODYTRUE); // remove body
           
curl_setopt($chCURLOPT_RETURNTRANSFERTRUE);
           
$head curl_exec($ch);
           
$httpCode curl_getinfo($chCURLINFO_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.
2011-03-11 23:29:24
http://php5.kiev.ua/manual/ru/book.curl.html
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!
2013-12-16 18:07:09
http://php5.kiev.ua/manual/ru/book.curl.html
Автор:
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
2014-11-11 18:41:33
http://php5.kiev.ua/manual/ru/book.curl.html
Автор:
WARNING WARNING

In this example: book.curl#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.
2016-03-30 01:48:33
http://php5.kiev.ua/manual/ru/book.curl.html
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.
2019-10-09 16:40:27
http://php5.kiev.ua/manual/ru/book.curl.html
Автор:
Sharing is caring, handles included.

<?php

$url_one 
"php.net";
$url_two "";

$user_agent 'Mozilla HotFox 1.0';

$ch curl_init();
curl_setopt($chCURLOPT_URL$url_one.$url_two);
curl_setopt($chCURLOPT_USERAGENT$user_agent);
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
curl_setopt($chCURLOPT_FOLLOWLOCATION1);
curl_setopt($chCURLOPT_HEADER0);
curl_setopt($chCURLOPT_NOBODY0);
curl_setopt($chCURLOPT_TIMEOUT30);
$res curl_exec($ch);
curl_close($ch);

$url_two "lazyphp.net";
$url_one "";
$res_two curl_exec($ch);
curl_close($ch);

?>
2021-04-13 05:15:45
http://php5.kiev.ua/manual/ru/book.curl.html

    Поддержать сайт на родительском проекте КГБ