PHP中的cURL是什么?


Answers:


245

cURL是一个库,可让您使用PHP发出HTTP请求。您需要了解的所有内容(以及大多数其他扩展)都可以在PHP手册中找到。

为了使用PHP的cURL函数,您需要安装»libcurl软件包。PHP要求您使用libcurl 7.0.2-beta或更高版本。在PHP 4.2.3中,您将需要libcurl版本7.9.0或更高版本。从PHP 4.3.0起,您将需要7.9.8或更高版本的libcurl版本。PHP 5.0.0需要libcurl版本7.10.5或更高版本。

您也可以不使用cURL发出HTTP请求,尽管需要allow_url_fopenphp.ini文件中启用它。

// Make a HTTP GET request and print it (requires allow_url_fopen to be enabled)
print file_get_contents('http://www.example.com/');

1
@Johannes,如果没有cURL,是否可以进行HTTP发布请求?
Pacerier

2
这意味着,如果在服务器中未启用“ allow_url_fopen”,那么我们将无法使用file_get_contents()函数,但是在那种情况下,我们可以出于相同目的使用curl函数?我对么?
2014年

3
@Arun是,如果未启用“ allow_url_fopen”,则可以对相同任务使用curl而不是file_get_contents()函数。Curl使您可以设置更多选项,例如POST数据,cookies等,而file_get_contents()不提供这些选项。
Dinesh Nagar 2014年

157

cURL是一种可以从代码中访问URL以获得html响应的方法。cURL表示客户端URL,它允许您与其他URL连接并在代码中使用它们的响应。


3
在Javascript中,就像在代码中执行ajax一样。与PHP同步执行的不同操作,而在Javascript中同步执行。
Faris Rayhan

68

PHP中的CURL:

摘要:

curl_execPHP中的命令是curl从控制台使用的桥梁。curl_exec使得轻松快速地执行GET / POST请求,从JSON等其他服务器接收响应以及下载文件变得容易。

警告,危险:

curl如果使用不当,将是邪恶和危险的,因为这都是从Internet那里获取数据。有人可以在您的curl和另一台服务器之间穿梭,并将a rm -rf /注入您的响应中,然后为什么我掉到控制台ls -l上甚至无法正常工作?因为您误会了卷曲的危险力量。即使您在与自己的服务器通信,也不要相信curl带来的任何后果都是安全的。您可能会撤回恶意软件,以减轻他们的财富。

例子:

这些都是在Ubuntu 12.10上完成的

  1. 命令行中的基本curl:

    el@apollo:/home/el$ curl http://i.imgur.com/4rBHtSm.gif > mycat.gif
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100  492k  100  492k    0     0  1077k      0 --:--:-- --:--:-- --:--:-- 1240k
    

    然后,您可以在firefox中打开gif:

    firefox mycat.gif

    光荣的猫会进化成弓形虫,导致女性与猫保持联系,而男性则与女性保持联系。

  2. cURL示例获取访问google.com的请求,回显至命令行:

    这是通过phpsh终端完成的:

    php> $ch = curl_init();
    
    php> curl_setopt($ch, CURLOPT_URL, 'http://www.google.com');
    
    php> curl_exec($ch);
    

    哪个将一堆压缩的html和javascript(来自google)打印并转储到控制台。

  3. cURL示例将响应文本放入变量中:

    这是通过phpsh终端完成的:

    php> $ch = curl_init();
    
    php> curl_setopt($ch, CURLOPT_URL, 'http://i.imgur.com/wtQ6yZR.gif');
    
    php> curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    
    php> $contents = curl_exec($ch);
    
    php> echo $contents;

    变量现在包含二进制文件,该二进制文件是猫的动画gif,可能性是无限的。

  4. 从PHP文件中进行卷曲:

    将此代码放在一个名为myphp.php的文件中:

    <?php
      $curl_handle=curl_init();
      curl_setopt($curl_handle,CURLOPT_URL,'http://www.google.com');
      curl_setopt($curl_handle,CURLOPT_CONNECTTIMEOUT,2);
      curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1);
      $buffer = curl_exec($curl_handle);
      curl_close($curl_handle);
      if (empty($buffer)){
          print "Nothing returned from url.<p>";
      }
      else{
          print $buffer;
      }
    ?>

    然后通过命令行运行它:

    php < myphp.php

    您运行myphp.php并通过php解释器执行了这些命令,并将大量混乱的html和javascript转储到屏幕上。

    你可以这样做GET,并POST与卷曲的要求,你要做的就是指定的参数定义如下:使用curl来自动HTTP工作

危险提示:

请小心丢弃卷曲输出,如果其中任何一个得到解释和执行,盒子将归您所有,您的信用卡信息将被出售给第三方,您将从阿拉巴马州一个单人地板公司那里收取900美元的神秘费用,这是海外信用卡欺诈犯罪团伙的前线。


2
您能否提供一个链接来备份您在此处提到的“危险”?
floatingLomas

1
@floatingLomas Eric试图解释的是所有用户提供的内容都存在的问题:您无法信任任何人。与用户提供的内容一样,可以使用简单的MITM利用cURL将恶意代码注入您的应用程序。当然,只有按照Eric的正确说明“解释并执行”它才是一个问题。只要搜索的EVAL是邪恶的,你会发现很多可能存在的安全风险(如stackoverflow.com/questions/951373/when-is-eval-evil-in-php
法比奥·波洛尼

7
@floatingLomas ...而且,埃里克似乎对阿拉巴马州的单人地板公司收取900美元的偏执。
法比奥·波洛尼

除了iframe,还有其他选择吗?
珍妮佛·米歇尔

1
如果他们真的想卖给您地板,这不是妄想症。
Piersb

24

cURL是一种可以从代码中访问URL以获得HTML响应的方法。它用于PHP语言中的命令行cURL。

<?php
// Step 1
$cSession = curl_init(); 
// Step 2
curl_setopt($cSession,CURLOPT_URL,"http://www.google.com/search?q=curl");
curl_setopt($cSession,CURLOPT_RETURNTRANSFER,true);
curl_setopt($cSession,CURLOPT_HEADER, false); 
// Step 3
$result=curl_exec($cSession);
// Step 4
curl_close($cSession);
// Step 5
echo $result;
?> 

步骤1:使用初始化curl会话curl_init()

步骤2:为设置选项CURLOPT_URL。该值是我们向其发送请求的URL。curl使用parameter 附加搜索词q=。设置的选项CURLOPT_RETURNTRANSFER。True将告诉curl返回字符串,而不是打印出来。将选项设置为CURLOPT_HEADER,false将告诉curl忽略返回值中的标头。

步骤3:使用进行curl会话curl_exec()

步骤4:关闭我们创建的curl会话。

步骤5:输出返回字符串。

public function curlCall($apiurl, $auth, $rflag)
{
    $ch = curl_init($apiurl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    if($auth == 'auth') { 
        curl_setopt($ch, CURLOPT_USERPWD, "passw:passw");
    } else {
        curl_setopt($ch, CURLOPT_USERPWD, "ss:ss1");
    }
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $dt = curl_exec($ch);        
    curl_close($ch);
    if($rflag != 1) {
        $dt = json_decode($dt,true);        
    }
    return $dt;
}

这也用于身份验证。我们还可以设置用户名和密码进行身份验证。

有关更多功能,请参见用户手册或以下教程:

http://php.net/manual/en/ref.curl.php
http://www.startutorial.com/articles/view/php-curl


16

首先让我们了解一下curl,libcurl和PHP / cURL的概念。

  1. curl:使用URL语法获取或发送文件的命令行工具。

  2. libcurl:Daniel Stenberg创建的一个库,它使您可以通过许多不同类型的协议连接到许多不同类型的服务器并与之通信。libcurl当前支持http,https,ftp,gopher,telnet,dict,file和ldap协议。libcurl还支持HTTPS证书,HTTP POST,HTTP PUT,FTP上传(也可以使用PHP的ftp扩展名完成),基于HTTP表单的上传,代理,Cookie和用户+密码验证。

  3. PHP / cURL:PHP模块,使PHP程序可以使用libcurl。

如何使用它:

步骤1:使用curl_init()初始化curl会话。

步骤2:为CURLOPT_URL设置选项。此值是我们向其发送请求的URL。使用参数“ q =”附加搜索词“ curl”。设置选项CURLOPT_RETURNTRANSFER,如果为true,则告诉curl返回字符串而不是打印出来。设置CURLOPT_HEADER的选项,false将告诉curl忽略返回值中的标头。

第三步:执行卷曲使用会话curl_exec()。

第4步:关闭我们创建的curl会话。

步骤5:输出返回字符串。

使演示

您将需要创建两个PHP文件,并将它们放置在Web服务器可以从中提供PHP文件的文件夹中。为了简单起见,我将它们放在/ var / www /中。

1. helloservice.php2. demo.php

helloservice.php非常简单,实质上只是回显它获取的任何数据:

<?php
  // Here is the data we will be sending to the service
  $some_data = array(
    'message' => 'Hello World', 
    'name' => 'Anand'
  );  

  $curl = curl_init();
  // You can also set the URL you want to communicate with by doing this:
  // $curl = curl_init('http://localhost/echoservice');

  // We POST the data
  curl_setopt($curl, CURLOPT_POST, 1);
  // Set the url path we want to call
  curl_setopt($curl, CURLOPT_URL, 'http://localhost/demo.php');  
  // Make it so the data coming back is put into a string
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  // Insert the data
  curl_setopt($curl, CURLOPT_POSTFIELDS, $some_data);

  // You can also bunch the above commands into an array if you choose using: curl_setopt_array

  // Send the request
  $result = curl_exec($curl);

  // Get some cURL session information back
  $info = curl_getinfo($curl);  
  echo 'content type: ' . $info['content_type'] . '<br />';
  echo 'http code: ' . $info['http_code'] . '<br />';

  // Free up the resources $curl is using
  curl_close($curl);

  echo $result;
?>

2.demo.php页面,可以看到结果:

<?php 
   print_r($_POST);
   //content type: text/html; charset=UTF-8
   //http code: 200
   //Array ( [message] => Hello World [name] => Anand )
?>

嗨,您能告诉我一下页面1. using-curl.php
Kaveh

@Kaveh:对不起,我忘了第二页。更新的答案。现在请检查。
阿南德·潘迪



7

卷曲

  • cURL是一种可以从代码中访问URL以获得HTML响应的方法。
  • 它用于PHP语言中的命令行cURL。
  • cURL是一个库,可让您使用PHP发出HTTP请求。

PHP支持libcurl,这是Daniel Stenberg创建的一个库,它使您可以通过许多不同类型的协议连接到许多不同类型的服务器并与之通信。libcurl当前支持http,https,ftp,gopher,telnet,dict,file和ldap协议。libcurl还支持HTTPS证书,HTTP POST,HTTP PUT,FTP上传(也可以使用PHP的ftp扩展名完成),基于HTTP表单的上传,代理,Cookie和用户+密码验证。

使用cURL支持编译PHP后,就可以开始使用cURL函数了。cURL函数的基本思想是,使用curl_init()初始化cURL会话,然后可以通过curl_setopt()设置所有传输选项,然后可以使用curl_exec()执行会话,然后使用curl_close()完成会话。

样例代码

// error reporting
error_reporting(E_ALL);
ini_set("display_errors", 1);

//setting url
$url = 'http://example.com/api';

//data
$data = array("message" => "Hello World!!!");

try {
    $ch = curl_init($url);
    $data_string = json_encode($data);

    if (FALSE === $ch)
        throw new Exception('failed to initialize');

        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen($data_string)));
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);

        $output = curl_exec($ch);

    if (FALSE === $output)
        throw new Exception(curl_error($ch), curl_errno($ch));

    // ...process $output now
} catch(Exception $e) {

    trigger_error(sprintf(
        'Curl failed with error #%d: %s',
        $e->getCode(), $e->getMessage()),
        E_USER_ERROR);
}

有关更多信息,请检查-


1

Curl只是PHP的扩展,它继承了主要为Linux / Unix命令行工具编写的常规curl命令和库的行为。

什么是卷毛? cURL代表客户端URL。cURL用于将数据发送到任何URL。有关确切的卷曲的更多详细信息,请访问CURL网站。

PHP中的cURL现在PHP中引入了相同的概念,以通过不同的协议(例如HTTP或FTP)将数据发送到任何可访问的URL。有关更多详细信息,请参阅PHP Curl教程。


1

php卷曲功能(POST,GET,DELETE,PUT)

function curl($post = array(), $url, $token = '', $method = "POST", $json = false, $ssl = true){
    $ch = curl_init();  
    curl_setopt($ch, CURLOPT_URL, $url);    
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
    if($method == 'POST'){
        curl_setopt($ch, CURLOPT_POST, 1);
    }
    if($json == true){
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Content-Type: application/json','Authorization: Bearer '.$token,'Content-Length: ' . strlen($post)));
    }else{
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
    }
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSLVERSION, 6);
    if($ssl == false){
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    }
    // curl_setopt($ch, CURLOPT_HEADER, 0);     
    $r = curl_exec($ch);    
    if (curl_error($ch)) {
        $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $err = curl_error($ch);
        print_r('Error: ' . $err . ' Status: ' . $statusCode);
        // Add error
        $this->error = $err;
    }
    curl_close($ch);
    return $r;
}

0

php curl类(GET,POST,文件上传,会话,发送POST JSON,强制自签名SSL / TLS):

<?php
    // Php curl class
    class Curl {

        public $error;

        function __construct() {}

        function Get($url = "http://hostname.x/api.php?q=jabadoo&txt=gin", $forceSsl = false,$cookie = "", $session = true){
            // $url = $url . "?". http_build_query($data);
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_HEADER, false);        
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_TIMEOUT, 60);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
            if($session){
                curl_setopt($ch, CURLOPT_COOKIESESSION, true );
                curl_setopt($ch , CURLOPT_COOKIEJAR, 'cookies.txt');
                curl_setopt($ch , CURLOPT_COOKIEFILE, 'cookies.txt');
            }
            if($forceSsl){
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 1, 2
            }
            if(!empty($cookie)){            
                curl_setopt($ch, CURLOPT_COOKIE, $cookie); // "token=12345"
            }
            $info = curl_getinfo($ch);
            $res = curl_exec($ch);        
            if (curl_error($ch)) {
                $this->error = curl_error($ch);
                throw new Exception($this->error);
            }else{
                curl_close($ch);
                return $res;
            }        
        }

        function GetArray($url = "http://hostname.x/api.php", $data = array("name" => "Max", "age" => "36"), $forceSsl = false, $cookie = "", $session = true){
            $url = $url . "?". http_build_query($data);
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_HEADER, false);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_TIMEOUT, 60);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
            if($session){
                curl_setopt($ch, CURLOPT_COOKIESESSION, true );
                curl_setopt($ch , CURLOPT_COOKIEJAR, 'cookies.txt');
                curl_setopt($ch , CURLOPT_COOKIEFILE, 'cookies.txt');
            }
            if($forceSsl){
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 1, 2
            }
            if(!empty($cookie)){
                curl_setopt($ch, CURLOPT_COOKIE, $cookie); // "token=12345"
            }
            $info = curl_getinfo($ch);
            $res = curl_exec($ch);        
            if (curl_error($ch)) {
                $this->error = curl_error($ch);
                throw new Exception($this->error);
            }else{
                curl_close($ch);
                return $res;
            }        
        }

        function PostJson($url = "http://hostname.x/api.php", $data = array("name" => "Max", "age" => "36"), $forceSsl = false, $cookie = "", $session = true){
            $data = json_encode($data);
            $ch = curl_init($url);                                                                      
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);                                                                  
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_TIMEOUT, 60);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
            if($session){
                curl_setopt($ch, CURLOPT_COOKIESESSION, true );
                curl_setopt($ch , CURLOPT_COOKIEJAR, 'cookies.txt');
                curl_setopt($ch , CURLOPT_COOKIEFILE, 'cookies.txt');
            }
            if($forceSsl){
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 1, 2
            }
            if(!empty($cookie)){
                curl_setopt($ch, CURLOPT_COOKIE, $cookie); // "token=12345"
            }
            curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                'Authorization: Bearer helo29dasd8asd6asnav7ffa',                                                      
                'Content-Type: application/json',                                                                                
                'Content-Length: ' . strlen($data))                                                                       
            );        
            $res = curl_exec($ch);
            if (curl_error($ch)) {
                $this->error = curl_error($ch);
                throw new Exception($this->error);
            }else{
                curl_close($ch);
                return $res;
            } 
        }

        function Post($url = "http://hostname.x/api.php", $data = array("name" => "Max", "age" => "36"), $files = array('ads/ads0.jpg', 'ads/ads1.jpg'), $forceSsl = false, $cookie = "", $session = true){
            foreach ($files as $k => $v) {
                $f = realpath($v);
                if(file_exists($f)){
                    $fc = new CurlFile($f, mime_content_type($f), basename($f)); 
                    $data["file[".$k."]"] = $fc;
                }
            }
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");        
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);    
            curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); // !!!! required as of PHP 5.6.0 for files !!!
            curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)");
            curl_setopt($ch, CURLOPT_TIMEOUT, 60);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
            if($session){
                curl_setopt($ch, CURLOPT_COOKIESESSION, true );
                curl_setopt($ch , CURLOPT_COOKIEJAR, 'cookies.txt');
                curl_setopt($ch , CURLOPT_COOKIEFILE, 'cookies.txt');
            }
            if($forceSsl){
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 1, 2
            }
            if(!empty($cookie)){
                curl_setopt($ch, CURLOPT_COOKIE, $cookie); // "token=12345"
            }
            $res = curl_exec($ch);
            if (curl_error($ch)) {
                $this->error = curl_error($ch);
                throw new Exception($this->error);
            }else{
                curl_close($ch);
                return $res;
            } 
        }
    }
?>

例:

<?php
    $urlget = "http://hostname.x/api.php?id=123&user=bax";
    $url = "http://hostname.x/api.php";
    $data = array("name" => "Max", "age" => "36");
    $files = array('ads/ads0.jpg', 'ads/ads1.jpg');

    $curl = new Curl();
    echo $curl->Get($urlget, true, "token=12345");
    echo $curl->GetArray($url, $data, true);
    echo $curl->Post($url, $data, $files, true);
    echo $curl->PostJson($url, $data, true);
?>

php文件:api.php

<?php
    /*
    $Cookie = session_get_cookie_params();
    print_r($Cookie);
    */
    session_set_cookie_params(9000, '/', 'hostname.x', isset($_SERVER["HTTPS"]), true);
    session_start();

    $_SESSION['cnt']++;
    echo "Session count: " . $_SESSION['cnt']. "\r\n";
    echo $json = file_get_contents('php://input');
    $arr = json_decode($json, true);
    echo "<pre>";
    if(!empty($json)){ print_r($arr); }
    if(!empty($_GET)){ print_r($_GET); }
    if(!empty($_POST)){ print_r($_POST); }
    if(!empty($_FILES)){ print_r($_FILES); }
    // request headers
    print_r(getallheaders());
    print_r(apache_response_headers());
    // Fetch a list of headers to be sent.
    // print_r(headers_list());
?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.