什么时候需要curl_global_init()

在开发libcurl程序中,发现有时候显示调用curl_global_init或不显示调用curl_global_init(都可以,那这个原因是?这个功能是否必要?

官方文档:

This function must be called at least once within a program (a program is all the code that shares a memory space) before the program calls any other function in libcurl. The environment it sets up is constant for the life of the program and is the same for every program,so multiple calls have the same effect as one call.

但请注意,在curl_easy_init的文件中:

If you did not already call curl_global_init(3),curl_easy_init(3) does it automatically. This may be lethal in multi-threaded cases,since curl_global_init(3) is not thread-safe,and it may result in resource problems because there is no corresponding cleanup.

上面两段简单来说就是当curl_global_init没有被调用时,curl_easy_init会调用curl_global_init。所以说,不是我们没有调用,只是我们没有显示调用curl_global_init而已。

但是由于curl_global_init是非线程安全的,所以在多线程的程中,如果利用curl_easy_init调用curl_global_init,可能会使程序奔溃,所以在多线程中,我们必需要调显示调用curl_global_init,再调用curl_easy_init获取相关的curl句柄去操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
QQ互联开发者必读 尊敬的QQ互联开发者: 您好,感谢您选择了PHP SDK 适用版本。 该版本运营环境:PHP + 数据库(可选) + MemCache(可选) PHP版本要求: PHP5.2 + (json_decode函数需要) 开启Curl模块:检查方式是 写一个 phpinfo();的测试文件,需要找到curl的描述方可有效。 如果选择数据库,需要开启mysql。(适用于中型网站) 如果选择MemCache,需要开启php_memcache 功能,同时需要Memcache的支持。(可用于大型网站) PHP SDK 操作流程: 在浏览器中,以网站的方式打开index.php(例如:http://www.example.com/index.php),首次将跳转到安装页面, 填好相关的APPID,APPKEY,选择对应的开放的API。选择session模式(系统支持三种,普通的session_start,基于数据库的session以及memcache的session,memcache的session支持需要MemCache的支持) 最后一个选项是debug功能,打开debug 功能,可以更加方面知道参数的传递地址,参数名称和数值以及结果的返回。 配置好了之后,点击确定,系统会验证相关的参数是否正确。值得注意的地方是:数据库会自动建立sessions表,sessions表的结构如下: CREATE TABLE if not exists `sessions` ( `sessionkey` varchar(32) NOT NULL, `sessionvalue` text NOT NULL, `sessionexpiry` datetime NOT NULL, `sessionip` varchar(15) DEFAULT NULL, PRIMARY KEY (`sessionkey`) ) DEFAULT CHARSET=utf8; 特别强调:在服务器运营环境中,请关闭debug功能。在配置选项完毕之后,删除install目录。在开发环境中,建议开启debug功能,这样,你可以很清晰的清楚传递的参数。 配置好了之后,系统会返回 index.php页面,你就可以开始 php sdk 的入门体验咯。 下面这些话是对coder说的: 代码结构采用api对应的目录,每个api对应相同文件名的PHP文件。代码中涉及到POST操作的部分,分为前后台,通过<?php if(isset($_POST)&&!empty($_POST)){ //这部分是POST处理的部分 //重点看这部分 //参数处理这里有点弱,没有做过多的判断,请在真实运营平台程序中加强 }else{ //这部分显示前台页面 } 每个API文件实现的基本思路是: $sUrl = ""; //指定API地址 $aGetParam = array(...); //指定GET参数 $aPOSTParam = array(...); //指定POST参数 $aFileParam = array(...); //指定文件上传的参数 $sContent = GET|POST|upload($sUrl,$aGETParam|$aPOSTParam,$aFileParam[upload的时候需要,其他时候无此参数]); If($sContent!==FALSE){ $aResult = json_decode($sContent,true); //转化成数组 ... //对数组的分析 } 下面对三个主要函数进行分析,文件位置在 common/function.php里面: GET函数: function get($sUrl,$aGetParam){ global $aConfig; //全局参数 $oCurl = curl_init(); //初始化curl if(stripos($sUrl,"https://")!==FALSE){ //对CURL对SSL的支持处理 curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE); } //拼接GET参数 $aGet = array(); foreach($aGetParam as $key=>$val){ $aGet[] = $key."=".urlencode($val); //注意此处的urlencode } curl_setopt($oCurl, CURLOPT_URL, $sUrl."?".join("&",$aGet));//设置访问URL curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );//设置调用返回 $sContent = curl_exec($oCurl);//执行访问 $aStatus = curl_getinfo($oCurl); //获取CURL的状态信息 curl_close($oCurl);//关闭CURL //系统自带的调试信息,运营环境可以删除这些调试信息 if(intval($aConfig["debug"])===1){ echo "<tr><td class='narrow-label'>请求地址:</td><td><pre>".$sUrl."</pre></td></tr>"; echo "<tr><td class='narrow-label'>GET参数:</td><td><pre>".var_export($aGetParam,true)."</pre></td></tr>"; echo "<tr><td class='narrow-label'>请求信息:</td><td><pre>".var_export($aStatus,true)."</pre></td></tr>"; if(intval($aStatus["http_code"])==200){ echo "<tr><td class='narrow-label'>返回结果:</td><td><pre>".$sContent."</pre></td></tr>"; if((@$aResult = json_decode($sContent,true))){ echo "<tr><td class='narrow-label'>结果集合解析:</td><td><pre>".var_export($aResult,true)."</pre></td></tr>"; } } } if(intval($aStatus["http_code"])==200){ //正常结果返回 return $sContent; //返回CURL获取到的内容 }else{ echo "返回出错:<pre>".$aStatus["http_code"].",请检查参数或者确实是腾讯服务器出错咯。</pre>"; //打印出错信息 return FALSE; //返回FALSE,注意在判断的时候,请用$sContent===FALSE 或者 $sContent!==FALSE 来判断 } } POST和upload 仅仅对不同的地方做说明: function post($sUrl,$aPOSTParam){ global $aConfig; ... //拼接POST数据 $aPOST = array(); foreach($aPOSTParam as $key=>$val){ $aPOST[] = $key."=".urlencode($val); } curl_setopt($oCurl, CURLOPT_URL, $sUrl); curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); //指定是POST curl_setopt($oCurl, CURLOPT_POST,true); curl_setopt($oCurl, CURLOPT_POSTFIELDS, join("&", $aPOST));//指定POST数据 $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); ...... } /* * 上传图片 */ function upload($sUrl,$aPOSTParam,$aFileParam){ ... //防止请求超时 set_time_limit(0); $oCurl = curl_init(); if(stripos($sUrl,"https://")!==FALSE){ curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false); } $aPOSTField = array(); foreach($aPOSTParam as $key=>$val){ $aPOSTField[$key]= $val; } foreach($aFileParam as $key=>$val){ $aPOSTField[$key] = "@".$val;);//文件路径,前面要加@,表明是文件上传 } curl_setopt($oCurl, CURLOPT_URL, $sUrl); curl_setopt($oCurl, CURLOPT_POST, true); curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt($oCurl, CURLOPT_POSTFIELDS, $aPOSTField); //这里也不同 $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); ... } 该PHP SDK 目前演示地址:http://www.172web.com/, 如果涉及到网站改版,具体演示地址见网站公告。 如有问题,请通过邮件咨询:[email protected].
`curl_global_init`和`curl_easy_init`都是libcurl库中的初始化函数,但是它们的作用不同。 `curl_global_init`用于初始化libcurl库的全局环境,包括SSL、Winsock等。它只需要在程序运行时调用一次。如果在多线程中使用libcurl库,应该在每个线程中调用`curl_global_init`函数来初始化全局环境。如果没有调用`curl_global_init`,则在使用libcurl库时会自动调用它进行初始化。 `curl_easy_init`用于初始化一个CURL句柄,CURL句柄用于执行HTTP请求和处理响应。每个HTTP请求需要创建一个CURL句柄,当HTTP请求完成后,需要使用`curl_easy_cleanup`函数清理CURL句柄。 在使用libcurl库时,应该先调用`curl_global_init`函数初始化全局环境,然后在需要执行HTTP请求时,使用`curl_easy_init`函数初始化一个CURL句柄。在HTTP请求完成后,使用`curl_easy_cleanup`函数清理CURL句柄,并在程序结束时调用`curl_global_cleanup`函数释放所有全局资源。 以下是一个示例,用于初始化libcurl库的全局环境并执行HTTP请求: ```c #include <stdio.h> #include <curl/curl.h> int main(void) { CURL *curl; CURLcode res; curl_global_init(CURL_GLOBAL_DEFAULT); // 初始化全局环境 curl = curl_easy_init(); // 初始化CURL句柄 if (curl) { curl_easy_setopt(curl, CURLOPT_URL, "https://example.com"); res = curl_easy_perform(curl); // 执行HTTP请求 if (res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); } curl_easy_cleanup(curl); // 清理CURL句柄 } curl_global_cleanup(); // 释放全局资源 return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值