基于PHP的cURL快速入门


1 / 16 基于PHP PHP PHP PHP 的cURL cURL cURL cURL 快速入门 cURL 是 一个 利用 URL 语 法规 定来 传输 文件 和数 据的 工具 ,支 持很 多协 议, 如 HTTP、FTP、TELNET 等。 最 爽的 是, PHP 也 支持 cURL 库 。本 文将 介绍 cURL 的 一些 高级 特性 ,以 及在 PHP 中 如何 运用 它。 为 什么 要用 cURL?cURL?cURL?cURL? 是 的, 我们 可以 通过 其他 办法 获取 网页 内容 。大 多数 时候 ,我 因为 想偷 懒, 都直 接用 简单 的 PHP 函 数: 以 下为 引用 的内 容: $content = file_get_contents("http://www.nettuts.com"); // or $lines = file("http://www.nettuts.com"); // or readfile(http://www.nettuts.com); 不过,这种做法缺乏灵活性和有效的错误处理。而且,你也不能用它完成一些高难度任务——比如处理 coockies、 验证 、表 单提 交、 文件 上传 等等 。 引 用: cURL 是 一种 功能 强大 的库 ,支 持很 多不 同的 协议 、选 项, 能提 供 URL 请 求相 关的 各种 细节 信息 。 基 本结 构 在 学习 更为 复杂 的功 能之 前, 先来 看一 下在 PHP 中 建立 cURL 请 求的 基本 步骤 : � 初 始化 � 设 置变 量 � 执 行并 获取 结果 � 释放cURL 句柄 以 下为 引用 的内 容: // 1. 初 始化 $ch = curl_init(); // 2. 设 置选 项, 包括 URL curl_setopt($ch, CURLOPT_URL,"http://www.nettuts.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. 执 行并 获取 HTML 文 档内 容 $output = curl_exec($ch); 2 / 16 // 4. 释放curl 句柄 curl_close($ch); 第二步(也就是curl_setopt() )最为重要,一切玄妙均在此。有一长串cURL 参数可供设置,它们能指定 URL 请求的各个细节。要一次性全部看完并理解可能比较困难,所以今天我们只试一下那些更常用也更有用的 选 项。 检 查错 误 你 可以 加一 段检 查错 误的 语句 (虽 然这 并不 是必 需的 ): 以 下为 引用 的内 容: //... $output = curl_exec($ch); if ($output === FALSE){ echo "cURL Error: ". curl_error($ch); } //... 请注意,比较的时候我们用的是“=== FALSE”,而非“== FALSE”。因为我们得区分空输出和布尔值 FALSE, 后者 才是 真正 的错 误。 获 取信 息 这 是另 一个 可选 的设 置项 ,能 够在 cURL 执 行后 获取 这一 请求 的有 关信 息: 以 下为 引用 的内 容: //... curl_exec($ch); $info = curl_getinfo($ch); echo '获取'. $info['url'] .'耗时'. $info['total_time'] .'秒'; //... 返 回的 数组 中包 括了 以下 信息 : � “url”//资 源网 络地 址 � “content_type”//内 容编 码 � “http_code”//HTTP 状 态码 � “header_size”//header 的 大小 � “request_size”//请 求的 大小 � “filetime”//文 件创 建时 间 3 / 16 � “ssl_verify_result”//SSL 验 证结 果 � “redirect_count”//跳 转技 术 � “total_time”//总 耗时 � “namelookup_time”//DNS 查 询耗 时 � “connect_time”//等 待连 接耗 时 � “pretransfer_time”//传 输前 准备 耗时 � “size_upload”//上 传数 据的 大小 � “size_download”//下 载数 据的 大小 � “speed_download”//下 载速 度 � “speed_upload”//上 传速 度 � “download_content_length”//下 载内 容的 长度 � “upload_content_length”//上 传内 容的 长度 � “starttransfer_time”//开 始传 输的 时间 � “redirect_time”//重 定向 耗时 基 于浏 览器 的重 定向 在 第一 个例 子中 ,我 们将 提供 一段 用于 侦测 服务 器是 否有 基于 浏览 器的 重定 向的 代码 。例如,有 些网 站会 根 据 是否 是手 机浏 览器 甚至 用户 来自 哪个 国家 来重 定向 网页 。 我 们利 用 CURLOPT_HTTPHEADER 选 项来 设定 我们 发送 出的 HTTP 请 求头 信息 (http headers),包括user agent 信 息和 默认 语言 。然 后我 们来 看看 这些 特定 网站 是否 会把 我们 重定 向到 不同 的 URL。 以 下为 引用 的内 容: // 测 试用 的 URL $urls = array( "http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com" ); // 测 试用 的浏 览器 信息 $browsers = array ( "standard" => array ( "user_agent" => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NETCLR 3.5.30729)", "language" => "en-us,en;q=0.5" 4 / 16 ), "iphone" => array ( "user_agent" => "Mozilla/5.0 (iPhone; U;CPU like Mac OSX; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A537a Safari/419.3", "language" => "en" ), "french" => array ( "user_agent" => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; GTB6; .NETCLR 2.0.50727)", "language" => "fr,fr-FR;q=0.5" ) ); foreach ($urls as $url) { echo "URL: $url\n"; foreach ($browsers as $test_name => $browser) { $ch = curl_init(); // 设置url curl_setopt($ch, CURLOPT_URL, $url); // 设 置浏 览器 的特 定 header curl_setopt( $ch, CURLOPT_HTTPHEADER, array( "User-Agent: {$browser['user_agent']}", "Accept-Language: {$browser['language']}" ) ); // 页 面内 容我 们并 不需 要 curl_setopt($ch, CURLOPT_NOBODY, 1); // 只 需返 回 HTTP header curl_setopt($ch, CURLOPT_HEADER, 1); // 返 回结 果, 而不 是输 出它 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); 5 / 16 // 有 重定 向的 HTTP 头 信息 吗 ? if (preg_match("!Location: (.*)!", $output, $matches)) { echo "$test_name: redirects to $matches[1]\n"; } else { echo "$test_name: no redirection\n"; } } echo "\n\n"; } 首 先, 我们 建立 一组 需要 测试 的 URL, 接着 指定 一组 需要 测试 的浏 览器 信息 。最 后通 过循 环测 试各 种 URL 和 浏览 器匹 配可 能产 生的 情况 。 因 为我 们指 定了 cURL 选 项, 所以 返回 的输 出内 容则 只包 括 HTTP 头 信息 (被 存放 于 $output 中)。 利用 一 个 简单 的正 则, 我们 检查 这个 头信 息中 是否 包含 了 “Location:”字 样。 运 行这 段代 码应 该会 返回 如下 结果 : 用POST POST POST POST 方 法发 送数 据 当 发起 GET 请 求时 ,数 据可 以通 过 “查 询字 串 ”(query string)传 递给 一个 URL。例如,在google 中 搜索 时 , 搜 索关 键即 为 URL 的 查询 字串 的一 部分 : http://www.google.com/search?q=nettuts 这 种情 况下 你可 能并 不需 要 cURL 来 模拟 。把 这个 URL 丢给“file_get_contents()”就 能得 到相 同结 果。 不 过有 一些 HTML 表 单是 用 POST 方 法提 交的 。这 种表 单提 交时 ,数 据是 通过 HTTP 请 求体 (request body) 发 送, 而不 是查 询字 串。 例如 ,当 使用 CodeIgniter 论 坛的 表单 ,无 论你 输入 什么 关键 字, 总是 被 POST 到 如下 6 / 16 页 面: http://codeigniter.com/forums/do_search/ 你 可以 用 PHP 脚 本来 模拟 这种 URL 请求。首先,新 建一 个可 以接 受并 显示 POST 数 据的 文件 ,我 们给 它命 名为post_output.php: print_r($_POST); 接 下来 ,写 一段 PHP 脚 本来 执行 cURL 请 求: 以 下为 引用 的内 容: $url = "http://localhost/post_output.php"; $post_data = array ( "foo" => "bar", "query" => "Nettuts", "action" => "Submit" ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 我 们在 POST 数 据哦 ! curl_setopt($ch, CURLOPT_POST, 1); // 把post 的 变量 加上 curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $output; 执 行代 码后 应该 会得 到以 下结 果: 这 段脚 本发 送一 个 POST 请 求给 post_output.php ,这 个页 面 $_POST 变 量并 返回 ,我 们利 用 cURL 捕 捉了 这 个输 出。 7 / 16 文 件上 传 上 传文 件和 前面 的 POST 十 分相 似。 因为 所有 的文 件上 传表 单都 是通 过 POST 方 法提 交的 。 首 先新 建一 个接 收文 件的 页面 ,命 名为 upload_output.php: print_r($_FILES); 以 下是 真正 执行 文件 上传 任务 的脚 本: 以 下为 引用 的内 容: $url = "http://localhost/upload_output.php"; $post_data = array ( "foo" => "bar", // 要 上传 的本 地文 件地 址 "upload" => "@C:/wamp/www/test.zip" ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $output; 如 果你 需要 上传 一个 文件 ,只 需要 把文 件路 径像 一个 post 变 量一 样传 过去 ,不 过记 得在 前面 加上 @符号。执 行 这段 脚本 应该 会得 到如 下输 出: 8 / 16 cURL cURL cURL cURL 批 处理 ( multimultimultimulti cURLcURLcURLcURL) cURL 还 有一 个高 级特 性 ——批 处理 句柄 ( handle)。 这一 特性 允许 你同 时或 异步 地打 开多 个 URL 连 接。 下 面是 来自 来自 php.net 的 示例 代码 : 以 下为 引用 的内 容: // 创 建两 个 cURL 资源 $ch1 = curl_init(); $ch2 = curl_init(); // 指定URL 和 适当 的参 数 curl_setopt($ch1, CURLOPT_URL,"http://lxr.php.net/"); curl_setopt($ch1, CURLOPT_HEADER, 0); curl_setopt($ch2, CURLOPT_URL,"http://www.php.net/"); curl_setopt($ch2, CURLOPT_HEADER, 0); // 创建cURL 批 处理 句柄 $mh = curl_multi_init(); // 加 上前 面两 个资 源句 柄 curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); // 预 定义 一个 状态 变量 $active = null; // 执 行批 处理 do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active && $mrc == CURLM_OK){ if (curl_multi_select($mh) != -1) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } // 关 闭各 个句 柄 curl_multi_remove_handle($mh, $ch1); 9 / 16 curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh); 这 里要 做的 就是 打开 多个 cURL 句 柄并 指派 给一 个批 处理 句柄 。然 后你 就只 需在 一个 while 循 环里 等它 执行 完 毕。 这 个示 例中 有两 个主 要循 环。 第一 个 do-while 循 环重 复调 用 curl_multi_exec() 。 这个 函数 是无 隔断 (non-blocking) 的, 但会 尽可 能少 地执 行。 它返 回一 个状 态值 ,只 要这 个值 等于 常量 CURLM_CALL_MULTI_PERFORM, 就代 表还 有一 些刻 不容 缓的 工作 要做 (例 如, 把对 应 URL 的http 头 信息 发 送出 去 )。 也就 是说 ,我 们需 要不 断调 用该 函数 ,直 到返 回值 发生 改变 。 而 接下 来的 while 循 环, 只在 $active 变 量为 true 时 继续 。这 一变 量之 前作 为第 二个 参数 传给 了 curl_multi_exec() , 代表 只要 批处 理句 柄中 是否 还有 活动 连接 。接 着, 我们 调用 curl_multi_select() , 在活 动连 接(例 如接 受服 务器 响应 )出 现之 前 ,它 都是 被 “屏蔽”的。这 个函 数成 功执 行后 ,我 们又 会进 入另 一个 do-while 循 环, 继续 下一 条 URL。 还 是来 看一 看怎 么把 这一 功能 用到 实处 吧: WordPressWordPressWordPressWordPress 连 接检 查器 想 象一 下你 有一 个文 章数 目庞 大的 博客 ,这 些文 章中 包含 了大 量外 部网 站链 接 。一 段时 间之 后 ,因 为这 样那 样 的原 因, 这些 链接 中相 当数 量都 失效 了。 要么 是被 和谐 了, 要么 是整 个站 点都 被功 夫网 了 ... 我 们下 面建 立一 个脚 本, 分析 所有 这些 链接 ,找 出打 不开 或者 404 的 网站 /网 页, 并生 成一 个报 告。 请 注意 ,以 下并 不是 一个 真正 可用 的 WordPress 插 件, 仅仅 是一 段独 立功 能的 脚本 而已 ,仅 供演 示, 谢谢 。 好 ,开 始吧 。首 先, 从数 据库 中读 取所 有这 些链 接: 以 下为 引用 的内 容: //CONFIG $db_host = 'localhost'; $db_user = 'root'; $db_pass = ''; $db_name = 'wordpress'; $excluded_domains = array ('localhost', 'www.mydomain.com'); $max_connections = 10; // 初 始化 一些 变量 $url_list = array(); $working_urls = array(); $dead_urls = array(); 10 / 16 $not_found_urls = array(); $active = null; // 连到MySQL if (!mysql_connect($db_host, $db_user, $db_pass)) { die('Could not connect: '. mysql_error()); } if (!mysql_select_db($db_name)) { die('Could not select db: '. mysql_error()); } // 找 出所 有含 有链 接的 文章 $q = "SELECT post_content FROM wp_posts WHERE post_content LIKE'%href=%' AND post_status = 'publish' AND post_type = 'post'"; $r = mysql_query($q) or die(mysql_error()); while ($d = mysql_fetch_assoc($r)) { // 用 正则 匹配 链接 if (preg_match_all("!href=\"(.*?)\"!", $d['post_content'], $matches)) { foreach ($matches[1] as $url) { // exclude some domains $tmp = parse_url($url); if (in_array($tmp['host'], $excluded_domains)) { continue; } // store the url $url_list []= $url; } } } // 移 除重 复链 接 $url_list = array_values(array_unique($url_list)); if (!$url_list) { 11 / 16 die('No URL to check'); } 我 们首 先配 置好 数据 库, 一系 列要 排除 的域 名( $excluded_domains), 以及 最大 并发 连接 数 ($max_connections)。 然后 ,连 接数 据库 ,获 取文 章和 包含 的链 接, 把它 们收 集到 一个 数组 中( $url_list)。 下 面的 代码 有点 复杂 了, 因此 我将 一小 步一 小步 地详 细解 释: 以 下为 引用 的内 容: // 1. 批 处理 器 $mh = curl_multi_init(); // 2. 加 入需 批量 处理 的 URL for ($i = 0; $i < $max_connections; $i++) { add_url_to_multi_handle($mh, $url_list); } // 3. 初 始处 理 do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 4. 主 循环 while ($active && $mrc == CURLM_OK){ // 5. 有 活动 连接 if (curl_multi_select($mh) != -1) { // 6. 干活 do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 7. 有 信息 否? if ($mhinfo = curl_multi_info_read($mh)) { // 意 味着 该连 接正 常结 束 // 8. 从curl 句 柄获 取信 息 $chinfo = curl_getinfo($mhinfo['handle']); // 9. 死 链么 ? if (!$chinfo['http_code']) { 12 / 16 $dead_urls []= $chinfo['url']; // 10. 404 了? } else if ($chinfo['http_code'] == 404) { $not_found_urls []= $chinfo['url']; // 11. 还 能用 } else { $working_urls []= $chinfo['url']; } // 12. 移 除句 柄 curl_multi_remove_handle($mh, $mhinfo['handle']); curl_close($mhinfo['handle']); // 13. 加 入新 URL, 干活 if (add_url_to_multi_handle($mh, $url_list)) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } } } // 14. 完了 curl_multi_close($mh); echo "==Dead URLs==\n"; echo implode("\n",$dead_urls) ."\n\n"; echo "==404 URLs==\n"; echo implode("\n",$not_found_urls) ."\n\n"; echo "==Working URLs==\n"; echo implode("\n",$working_urls); // 15. 向 批处 理器 添加 url function add_url_to_multi_handle($mh, $url_list) { static $index = 0; // 如 果还 剩 url 没用 13 / 16 if ($url_list[$index]) { // 新建curl 句柄 $ch = curl_init(); // 配置url curl_setopt($ch, CURLOPT_URL, $url_list[$index]); // 不 想输 出返 回的 内容 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 重 定向 到哪 儿我 们就 去哪 儿 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 不 需要 内容 体, 能够 节约 带宽 和时 间 curl_setopt($ch, CURLOPT_NOBODY, 1); // 加 入到 批处 理器 中 curl_multi_add_handle($mh, $ch); // 拨 一下 计数 器, 下次 调用 该函 数就 能添 加下 一个 url 了 $index++; return true; } else { // 没 有新 的 URL 需 要处 理了 return false; } } 下 面解 释一 下以 上代 码。 列表 的序 号对 应着 代码 注释 中的 顺序 数字 。 1.新 建一 个批 处理 器。 Created a multi handle. 2.稍 后我 们将 创建 一个 把 URL 加 入批 处理 器的 函数 add_url_to_multi_handle() 。 每当 这个 函数 被调 用 ,就 有 一个 新 url 被 加入 批处 理器 。一 开始 ,我 们给 批处 理器 添加 了 10个URL(这 一数 字由 $max_connections 所决 定)。 3.运行curl_multi_exec() 进 行初 始化 工作 是必 须的 ,只 要它 返回 CURLM_CALL_MULTI_PERFORM 就 还 有事 情要 做。 这么 做主 要是 为了 创建 连接 ,它 不会 等待 完整 的 URL 响 应。 4.只 要批 处理 中还 有活 动连 接主 循环 就会 一直 持续 。 5.curl_multi_select() 会 一直 等待 ,直 到某 个 URL 查 询产 生活 动连 接。 6.cURL 的 活儿 又来 了, 主要 是获 取响 应数 据。 14 / 16 7.检 查各 种信 息。 当一 个 URL 请 求完 成时 ,会 返回 一个 数组 。 8.在 返回 的数 组中 有一 个 cURL 句 柄。 我们 利用 其获 取单 个 cURL 请 求的 相应 信息 。 9.如 果这 是一 个死 链或 者请 求超 时, 不会 返回 http 状 态码 。 10.如 果这 个页 面找 不到 了, 会返 回 404 状 态码 。 11.其 他情 况我 们都 认为 这个 链接 是可 用的 (当 然, 你也 可以 再检 查一 下 500 错 误之 类 ...)。 12.从 该批 次移 除这 个 cURL 句 柄, 因为 它已 经没 有利 用价 值了 ,关 了它 ! 13.很 好, 现在 可以 另外 加一 个 URL 进 来了 。再 一次 地, 初始 化工 作又 开始 进行 ... 14.嗯 ,该 干的 都干 了。 关闭 批处 理器 ,生 成报 告。 15.回 过头 来看 给批 处理 器添 加新 URL 的 函数 。这 个函 数每 调用 一次 ,静 态变 量 $index 就 递增 一次 ,这 样 我们 才能 知道 还剩 多少 URL 没 处理 。 我 把这 个脚 本在 我的 博客 上跑 了一 遍( 测试 需要 ,有 一些 错误 链接 是故 意加 上的 ), 结果 如下 : 以 下为 引用 的内 容: 共 检查 约 40个URL, 只耗 费两 秒不 到。 当需 要检 查更 加大 量的 URL 时 ,其 省心 省力 的效 果可 想而 知! 如 果 你同 时打 开 10个 连接 ,还 能再 快上 10倍 !另 外, 你还 可以 利用 cURL 批 处理 的无 隔断 特性 来处 理大 量 URL 请 求, 而不 会阻 塞你 的 Web 脚 本。 另 一些 有用 的 cURLcURLcURLcURL 选项 HTTPHTTPHTTPHTTP 认证 如 果某 个 URL 请 求需 要基 于 HTTP 的 身份 验证 ,你 可以 使用 下面 的代 码: 以 下为 引用 的内 容: $url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 发 送用 户名 和密 码 curl_setopt($ch, CURLOPT_USERPWD,"myusername:mypassword"); // 你 可以 允许 其重 定向 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 下 面的 选项 让 cURL 在 重定 向后 // 也 能发 送用 户名 和密 码 curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); 15 / 16 $output = curl_exec($ch); curl_close($ch); FTPFTPFTPFTP 上传 PHP 自 带有 FTP 类 库, 但 你也 能用 cURL: 以 下为 引用 的内 容: // 开 一个 文件 指针 $file = fopen("/path/to/file", "r"); // url 里 包含 了大 部分 所需 信息 $url = "ftp://username:password@mydomain.com:21/path/to/new/file"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 上 传相 关的 选项 curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/path/to/file")); // 是 否开 启 ASCII 模式(上 传文 本文 件时 有用 ) curl_setopt($ch, CURLOPT_FTPASCII, 1); $output = curl_exec($ch); curl_close($ch); 翻 墙术 你 可以 用代 理发 起 cURL 请 求: 以 下为 引用 的内 容: $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,'http://www.example.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 指 定代 理地 址 curl_setopt($ch, CURLOPT_PROXY,'11.11.11.11:8080'); // 如 果需 要的 话, 提供 用户 名和 密码 curl_setopt($ch, CURLOPT_PROXYUSERPWD,'user:pass'); $output = curl_exec($ch); 16 / 16 curl_close ($ch); 回 调函 数 可 以在 一个 URL 请 求过 程中 ,让 cURL 调 用某 指定 的回 调函 数。 例如 ,在 内容 或者 响应 下载 的过 程中 立刻 开 始利 用数 据, 而不 用等 到完 全下 载完 。 以 下为 引用 的内 容: $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,'http://net.tutsplus.com'); curl_setopt($ch, CURLOPT_WRITEFUNCTION,"progress_function"); curl_exec($ch); curl_close ($ch); function progress_function($ch,$str) { echo $str; return strlen($str); } 这 个回 调函 数必 须返 回字 串的 长度 ,不 然此 功能 将无 法正 常使 用。 在URL 响 应接 收的 过程 中, 只要 收到 一个 数据 包, 这个 函数 就会 被调 用。 小结 今 天我 们一 起学 习了 cURL 库 的强 大功 能和 灵活 的扩 展性 。希 望你 喜欢 。下 一次 要发 起 URL 请 求时 ,考 虑 下cURL 吧!
还剩15页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

iat.net.cn

贡献于2014-04-14

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf