PHP中的cURL是什么?

250
在PHP中,我在许多PHP项目中看到了cURL这个词。它是什么?它如何工作?
参考链接:cURL

15
(参考) PHP 手册:客户端 URL 库 - Gordon
1
请查看以下两个链接,我认为这将有助于您了解cURL是什么。http://phpsense.com/2007/php-curl-functions/ http://blog.unitedheroes.net/curl/ - Dhaval
1
即时将CURL命令转换为PHP代码:https://incarnate.github.io/curl-to-php/ - Nabi K.A.Z.
10个回答

270

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开始,您将需要一个libcurl版本为7.9.8或更高版本。PHP 5.0.0需要libcurl版本7.10.5或更高版本。

您也可以在没有cURL的情况下进行HTTP请求,但这需要在您的php.ini文件中启用allow_url_fopen

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

2
@Johannes,是否可以在没有cURL的情况下进行HTTP post请求? - Pacerier
2
这意味着,如果服务器上未启用'allow_url_fopen',则我们无法使用file_get_contents()函数,但在这种情况下,我们可以使用curl函数来实现相同的目的,我说得对吗? - ARUN
4
如果 'allow_url_fopen'未开启,您可以使用curl替换file_get_contents()函数。Curl使您能够设置更多选项,如POST数据、cookies等,而file_get_contents()不提供这些功能。 - Dinesh Nagar

160

cURL可以让您从代码中调用一个URL,并获取其返回的HTML响应。cURL代表客户端URL,它允许您连接其他URL并在您的代码中使用它们的响应。


5
在 JavaScript 中,它的使用方式与您在代码中执行 AJAX 请求的方式相同。与 PHP 不同的是,您在 JavaScript 中进行的操作是异步执行的,而不是同步执行的。 - Faris Rayhan

80

PHP中的CURL:

概述:

curl_exec命令在PHP中是使用命令行curl的桥梁。使用curl_exec可以轻松快速地进行GET / POST请求、接收来自其他服务器的响应(如JSON)和下载文件。

警告,危险:

curl如果使用不当,就会变得恶意和危险,因为它完全是从互联网中获取数据。有人可以在您的curl和另一个服务器之间插入一个rm -rf /,然后我为什么掉到了控制台,而且 ls -l甚至不再起作用?因为您低估了curl的危险力量。不要相信从curl返回的任何内容都是安全的,即使您正在与自己的服务器通信也是如此。您可能会拉回恶意软件以窃取傻瓜的财富。

示例:

这些示例是在Ubuntu 12.10上完成的。

  1. Basic curl from the commandline:

    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
    

    Then you can open up your gif in firefox:

    firefox mycat.gif
    

    Glorious cats evolving Toxoplasma gondii to cause women to keep cats around and men likewise to keep the women around.

  2. cURL example get request to hit google.com, echo to the commandline:

    This is done through the phpsh terminal:

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

    Which prints and dumps a mess of condensed html and javascript (from google) to the console.

  3. cURL example put the response text into a variable:

    This is done through the phpsh terminal:

    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;
    

    The variable now contains the binary which is an animated gif of a cat, possibilities are infinite.

  4. Do a curl from within a PHP file:

    Put this code in a file called 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;
      }
    ?>
    

    Then run it via commandline:

    php < myphp.php
    

    You ran myphp.php and executed those commands through the php interpreter and dumped a ton of messy html and javascript to screen.

    You can do GET and POST requests with curl, all you do is specify the parameters as defined here: Using curl to automate HTTP jobs

危险提醒:

小心处理curl输出,如果有任何输出被解释和执行,您的计算机将被攻击并且您的信用卡信息将被出售给第三方,之后您会收到来自阿拉巴马州一家单人地板公司的神秘900美元费用,该公司是海外信用卡欺诈犯罪集团的幌子。


2
你能提供一个支持你在这里提到的“危险”的链接吗? - floatingLomas
3
@floatingLomas Eric试图解释的是所有用户提供内容都存在的问题:你不能相信任何人。由于用户提供的内容,使用简单的MITM可以利用cURL将恶意代码注入到您的应用程序中。当然,只有在像Eric正确指出的那样被“解释和执行”时才会出现这个问题。只需搜索“eval is evil”,您就会发现许多可能的安全风险(例如https://dev59.com/b3NA5IYBdhLWcg3wdtpd)。 - Fabio Poloni
10
@floatingLomas...另外,Eric似乎对阿拉巴马州的一人地板公司有妄想症,这些公司向他收取900美元。 - Fabio Poloni
除了iframe,还有其他的替代方案吗? - Jen
4
如果他们真的想要卖给你地板,那么你的警惕并不是偏执狂。 - piersb

26
是一种你可以从代码中发送请求到指定的URL地址并获取HTML响应的方式。它通常用于PHP语言中的命令行。
<?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;
?> 

第一步:使用curl_init()初始化一个curl会话。

第二步:设置CURLOPT_URL选项。这个值是我们发送请求的URL。使用参数q=添加搜索词curl。设置CURLOPT_RETURNTRANSFER选项。True将告诉curl返回字符串而不是直接打印出来。设置CURLOPT_HEADER选项,false将告诉curl忽略返回值中的头信息。

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

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

第五步:输出返回的字符串。

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/zh/book.curl.php
http://www.startutorial.com/articles/view/php-curl


21

首先让我们了解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上传、代理、Cookies和用户+密码身份验证。

  3. PHP/cURL:使PHP程序能够使用libcurl的PHP模块。

如何使用:

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

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

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

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

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

制作DEMO:

您需要创建两个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 )
?>

你好,请问你能告诉我关于 using-curl.php 页面的内容吗? - Kaveh
@Kaveh: 对不起,我忘记了第二页。已更新答案,请核对。 - Anand Pandey
我已经使用cURL有一段时间了,错过了curl_getinfo函数的价值,感谢您提供的提示。 - Clinton

12

PHP的cURL扩展旨在让您能够在PHP脚本内使用各种Web资源。


10

在PHP中,cURL是使用命令行cURL的桥梁


7

cURL

  • 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上传、代理、Cookies以及用户+密码身份验证。

一旦您使用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);
}

如需更多信息,请查看 -


2

Php curl function (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;
}

-1

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());
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接