php curl 简介

http://www.phpddt.com/manual/php/res/book.curl.html

Client URL Library

User Contributed Notes

frank at interactinet dot com  11-Mar-2011 09:29
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.
ramez at dot dontspan dot zegenie dot com  27-Oct-2010 09:19
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.
cliffclof atty gmail dotty com  05-Apr-2010 02:21
A solution that addresses repeat calls to the same set of urls using the same connection simulating frequent ajax calls in separate browser tabs. 

In a unique situation you may need to set a cookie then use that cookie for multiple separate persistent connections using the same session cookie.  The problem is the session cookie may change while your doing your persistent calls.  If you set every curl handle to update a shared cookiejar on close you may overwrite the new found session value with the old session value depending on the closing order of your handles. Also, because the cookiejar is only written to on a curl_close, you may be using dissimilar or old session info in some of your 'faked browser tabs'. 

To solve this problem I created a unique handle that opens and closes specifically to set a cookie file using CURLOPT_COOKIEJAR. Then I just use the read-only CURLOPT_COOKIEFILE on the multiple separate persistent handles. 

This solves the problem of shared cookies fighting to write their values and keep persistent calls using the most up to date cookie information. 

Note: In my case the multiple calls were in a while loop and I was using php in shell.  The session cookie value plus browser type limited the number of connections available and i wanted to use the max connections per session.
Chris Pollett  18-Jan-2010 06:56
This is something obscure I noticed... If you try to use something like: 

<?php 
curl_setopt
($agentCURLOPT_POSTtrue); 
curl_setopt($agentCURLOPT_POSTFIELDS$post_data);    
?> 

so that you POST something to a URL. Then if you screwed up your URL slightly like: 

http://www.example.com 

rather than 

http://www.example.com/ (note the slash

hence, causing a redirect, then your posted data won't be sent once the redirect occurs.
artem at zabsoft dot co dot in  11-May-2009 11:43
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."]
web at davss dot com  26-Jan-2009 02:00
Here is a reusable curl object - please help me improve it. There is no erro handling (I don't need it) which can be implemented

<?php
class cURL {

    
# defaul global options
    
var $opts = array(
            
CURLOPT_HEADER => FALSE,
            
CURLOPT_RETURNTRANSFER => TRUE
    
);

    function 
cURL(){
    }

    function 
r($ch,$opt){
        
# assign global options array
        
$opts $this->opts;
        
# assign user's options
        
foreach($opt as $k=>$v){$opts[$k] = $v;}
        
curl_setopt_array($ch,$opts);
        
curl_exec($ch);
        
$r['code'] = curl_getinfo($ch,CURLINFO_HTTP_CODE);
        
$r['cr'] = curl_exec($ch);
        
$r['ce'] = curl_errno($ch);
        
curl_close($ch);
        return 
$r;
    }

    function 
get($url='',$opt=array()){
        
# create cURL resource
        
$ch curl_init($url);
        return 
$this->r($ch,$opt);
    }

    function 
post($url='',$data=array(),$opt=array()){
        
# set POST options
        
$opts[CURLOPT_POST] = TRUE;
        
$opts[CURLOPT_POSTFIELDS] = $data;

        
# create cURL resource
        
$ch curl_init($url);
        return 
$this->r($ch,$opt);
    }
};
$cURL = new cURL();

#
# END of CLASS
#

/*
* test.php files for testing purposes - must be in the same folder undelss you specify $url path
*
<?php
echo " WORKING!!<p>";
if($_GET > 0){
print_r($_GET);
}
elseif($_POST > 0){
print_r($_POST);
}
?>
*/
/*
# EXAMPLE OF USE
$path = "http://"; # path to test.php file
$file = "test.php"; # safe the above code in text.php file
$url = $path . $file;
$post_data = array("FLD1"=>"VAL1","FLD2"=>"VAL2");
# user's curl options that override global if necessary
$o = array(CURLOPT_HEADER => TRUE,CURLOPT_RETURNTRANSFER => TRUE,CURLOPT_FAILONERROR=>TRUE);

function ccc($arr){
    echo "CODE: " . $arr['code'] . "<p>";
    echo "CE: " . $arr['ce'] . "<p>";
    echo "CR: <br />" . $arr['cr'] . "<p>";
}

#POST TEST
$cPost = $cURL->post($url,$post_data,$o); // you can remove options
echo "<h2>cPost</h2>";
ccc($cPost);

#GET TEST
$cGet = $cURL->post($url,$post_data,$o); // you can remove options
echo "<h2>cGet</h2>";
ccc($cGet);
*/

?>
<a name="86391" "="" style="color: rgb(0, 0, 153); background-color: transparent;">
pyromus at gmail dot com  16-Oct-2008 04:37
You can use this class for fast entry 

<?php 
class cURL 
var 
$headers
var 
$user_agent
var 
$compression
var 
$cookie_file
var 
$proxy
function 
cURL($cookies=TRUE,$cookie='cookies.txt',$compression='gzip',$proxy='') { 
$this->headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg'
$this->headers[] = 'Connection: Keep-Alive'
$this->headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8'
$this->user_agent 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)'
$this->compression=$compression
$this->proxy=$proxy
$this->cookies=$cookies
if (
$this->cookies == TRUE$this->cookie($cookie); 

function 
cookie($cookie_file) { 
if (
file_exists($cookie_file)) { 
$this->cookie_file=$cookie_file
} else { 
fopen($cookie_file,'w') or $this->error('The cookie file could not be opened. Make sure this directory has the correct permissions'); 
$this->cookie_file=$cookie_file
fclose($this->cookie_file); 


function 
get($url) { 
$process curl_init($url); 
curl_setopt($processCURLOPT_HTTPHEADER$this->headers); 
curl_setopt($processCURLOPT_HEADER0); 
curl_setopt($processCURLOPT_USERAGENT$this->user_agent); 
if (
$this->cookies == TRUEcurl_setopt($processCURLOPT_COOKIEFILE$this->cookie_file); 
if (
$this->cookies == TRUEcurl_setopt($processCURLOPT_COOKIEJAR$this->cookie_file); 
curl_setopt($process,CURLOPT_ENCODING $this->compression); 
curl_setopt($processCURLOPT_TIMEOUT30); 
if (
$this->proxycurl_setopt($processCURLOPT_PROXY$this->proxy); 
curl_setopt($processCURLOPT_RETURNTRANSFER1); 
curl_setopt($processCURLOPT_FOLLOWLOCATION1); 
$return curl_exec($process); 
curl_close($process); 
return 
$return

function 
post($url,$data) { 
$process curl_init($url); 
curl_setopt($processCURLOPT_HTTPHEADER$this->headers); 
curl_setopt($processCURLOPT_HEADER1); 
curl_setopt($processCURLOPT_USERAGENT$this->user_agent); 
if (
$this->cookies == TRUEcurl_setopt($processCURLOPT_COOKIEFILE$this->cookie_file); 
if (
$this->cookies == TRUEcurl_setopt($processCURLOPT_COOKIEJAR$this->cookie_file); 
curl_setopt($processCURLOPT_ENCODING $this->compression); 
curl_setopt($processCURLOPT_TIMEOUT30); 
if (
$this->proxycurl_setopt($processCURLOPT_PROXY$this->proxy); 
curl_setopt($processCURLOPT_POSTFIELDS$data); 
curl_setopt($processCURLOPT_RETURNTRANSFER1); 
curl_setopt($processCURLOPT_FOLLOWLOCATION1); 
curl_setopt($processCURLOPT_POST1); 
$return curl_exec($process); 
curl_close($process); 
return 
$return

function 
error($error) { 
echo 
"<center><div style='width:500px;border: 3px solid #FFEEFF; padding: 3px; background-color: #FFDDFF;font-family: verdana; font-size: 10px'><b>cURL Error</b><br>$error</div></center>"
die; 


$cc = new cURL(); 
$cc->get('http://www.example.com'); 
$cc->post('http://www.example.com','foo=bar'); 
?> 

[EDIT BY danbrown AT php DOT net: Includes a bugfix provided by "Anonymous" on 01-Dec-2008 @ 06:52.  Also replaced real URL with example.com as per RFC 2606.] 

[EDIT BY danbrown AT php DOT net: Includes a bugfix provided by (manuel AT rankone DOT ch) on 24-NOV-09 to properly reference cURL initialization.]
<a name="86143" "="" style="color: rgb(0, 0, 153); background-color: transparent;">
eflash at gmx dot net  05-Oct-2008 09:45
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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值