clean code

i create stuff

PHP cURL使用小结

| Comments

实习这段时间主要在写PHP和很少的Python和Java。之前写过的PHP不超过100行,Java几乎没写过,算是都入了个门。

项目需要作为客户端发起HTTP请求,查一些API来分析一些数据,于是就接触了cURL这个库。作为天生的web语言,PHP在这方面真是太厉害了,居然自带了HTTP请求的函数。除了cURL外,file_get_contents这个函数也可以发起HTTP请求,不过不是专门干这个的,不好配置参数,还是cURL好。

官方文档里的例子很有用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
        // create curl resource 
        $ch = curl_init();

        // set url 
        curl_setopt($ch, CURLOPT_URL, "example.com");

        //return the transfer as a string 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        // $output contains the output string 
        $output = curl_exec($ch);

        // close curl resource to free up system resources 
        curl_close($ch);
?>

主要就是对curl的选项进行配置,即curl_setopt()这个函数。有几个参数很重要:

  • CURLOPT_URL:url,没得说
  • CURLOPT_RETURNTRANSFER:设为1才会将响应结果存到变量,否则会echo到页面
  • CURLOPT_HTTPHEADER:设置一个HTTP请求头,必须为array,否则会报错
  • CURLOPT_TIMEOUT:设置cURL执行超时长度,单位是秒,注意是执行时间,而不是连接时间,那要用CURLOPT_CONNECTTIMEOUT
  • CURLOPT_TIMEOUT_MS:同上,毫秒

更多的配置查手册吧。

有时候执行完curl_exec()会发现没有任何东西返回,这时候需要curl_errno()curl_error()来查看错误号和错误原因了,不过一定要放在curl_exec()后面,不要像我一样蠢……(躲角落哭)

1
2
3
4
5
6
7
8
9
10
11
12
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);  // 10s内拿不到数据就放弃
$result = curl_exec($ch);
  
// 请求失败时打入log
if (curl_errno($ch)) {
    $now = date('Y-m-d H:i:s');
    crond_log("cannot get $url at $now", 'mochi_crond');
}

别忘了PHP才是最好的语言!

参考资料
[1] Client URL Library
[2] Setting Curl’s Timeout in PHP

Comments