Libcurl库常⽤接⼝使⽤说明,限速设置
libcurl 接⼝调⽤⽅式
libcurl提供了⼀组C语⾔API函数直接调⽤。⾸先需要提到的两个函数就是curl_global_init()和 curl_global_cleanup()。libcurl要⽤到⼀系列的全局常量,curl_global_init()函数就是初始化这些变量,并分配⼀些全局资源;curl_global_cleanup()则负责释放这些资源。因此⼀般情况下,在调⽤libcurl函数之前,先⽤ curl_global_init(CURL_GLOBAL_ALL)做初始化,在调⽤完毕后,⽤curl_global_cleanup()退出。
需要注意的是,这些全局变量和资源并不是线程安全的,因此,在多线程应⽤的环境中,最好不要多次调⽤curl_global_init()和
curl_global_cleanup(),调⽤其他函数并不会改变这些全局变量和资源。
libcurl⽀持3种不同的接⼝调⽤⽅式,分别是"easy"、"multi"和"share"模式。
libcurl-easy是⼀组同步接⼝,函数都是curl_easy_*形式,这种模式调⽤curl_easy_perform()函数进⾏URL数据传输,直到传输完成函数才返回;
libcurl- multi是⼀组异步接⼝,函数都是curl_multi_*形式,调⽤curl_multi_perform()函数进⾏传输,但是每次调⽤只传⼀⽚数据,我们可以⽤select()函数控制多个下载任务进⾏同步下载,来实现在⼀个线程中同时下载多个⽂件;
libcurl-share允许在多线程中操作共享数据。下⾯以libcurl-easy为例讲⼀下libcurl的函数。
1、CURL *curl_easy_init()
此函数需要最先被调⽤,返回CRUL easy句柄;后续其他函数调⽤都要⽤到这个句柄。如果没有调⽤curl_global_init(),该函数⾃动调⽤,但是考虑到线程安全的问题,最好⾃⼰调⽤curl_global_init()。
CURLOPT_WRITEFUNCTION
函数指针类型,该选项设置⼀个处理接收到的下载数据的回调函数,函数原型为:
size_t function( void *ptr, size_t size, size_t nmemb, void *stream);
其中,ptr指向接收到的数据,数据⼤⼩为size*nmemb,stream指向调⽤CURLOPT_WRITEDATA选项设置的参数。
如果函数指针置为NULL,则会调⽤默认的函数,将数据写⼊到由CURLOPT_WRITEDATA指定的FILE*中。
CURLOPT_HTTPHEADER
curl_slist结构体类型,该选项⾃定义请求头信息。
CURLOPT_NOPROGRESS
布尔值类型,设置该值为⾮零值关闭PHP为CRUL传输显⽰的进度条。
CURLOPT_INFILESIZE
当你上传⼀个⽂件到远程站点,这个选项告诉PHP你上传⽂件的⼤⼩。
CURLOPT_VERBOSE
如果你想CURL报告每⼀件意外的事情,设置这个选项为⼀个⾮零值。
CURLOPT_HEADER
如果你想把⼀个头包含在输出中,设置这个选项为⼀个⾮零值。
CURLOPT_NOBODY
如果你不想在输出中包含body部分,设置这个选项为⼀个⾮零值。
CURLOPT_FAILONERROR
如果你想让PHP在发⽣错误(HTTP代码返回⼤于等于300)时,不显⽰,设置这个选项为⼀⼈⾮零值。默认⾏为是返回⼀个正常页,忽略代码。
CURLOPT_UPLOAD:如果你想让PHP为上传做准备,设置这个选项为⼀个⾮零值。
*CURLOPT_POST: 如果你想PHP去做⼀个正规的HTTPPOST,设置这个选项为⼀个⾮零值。这个POST是普通的application/x-www-from-urlencoded 类型,多数被HTML表单使⽤。
*CURLOPT_FTPLISTONLY:设置这个选项为⾮零值,PHP将列出FTP的⽬录名列表。
*CURLOPT_FTPAPPEND:设置这个选项为⼀个⾮零值,PHP将应⽤远程⽂件代替覆盖它。
*CURLOPT_NETRC: 设置这个选项为⼀个⾮零值,PHP将在你的 ~./netrc⽂件中查你要建⽴连接的远程站点的⽤户名及密码。
*CURLOPT_FOLLOWLOCATION: 设置这个选项为⼀个⾮零值(象“Location:“)的头,服务器会把它当做HTTP头的⼀部分发送(注意这是递归的,PHP将发送形如“Location: “的头)。
*CURLOPT_PUT:设置这个选项为⼀个⾮零值去⽤HTTP上传⼀个⽂件。要上传这个⽂件必须设置CURLOPT_INFILE
和 CURLOPT_INFILESIZE选项.*CURLOPT_MUTE:设置这个选项为⼀个⾮零值,PHP对于CURL函数将完全沉默。
*CURLOPT_LOW_SPEED_LIMIT:设置⼀个长整形数,控制传送多少字节。
*CURLOPT_LOW_SPEED_TIME:设置⼀个长整形数,控制多少秒传送CURLOPT_LOW_SPEED_LIMIT规定的字节数。
*CURLOPT_RESUME_FROM:传递⼀个包含字节偏移地址的长整形参数,(你想转移到的开始表单)。
*CURLOPT_SSLVERSION:传递⼀个包含SSL版本的长参数。默认PHP将被它⾃⼰努⼒的确定,在更多的安全中你必须⼿⼯设置。
*CURLOPT_TIMECONDITION:传递⼀个长参数,指定怎么处理CURLOPT_TIMEVALUE参数。你可以设置这个参数为
TIMECOND_IFMODSINCE或 TIMECOND_ISUNMODSINCE。这仅⽤于HTTP。
*CURLOPT_TIMEVALUE:传递⼀个从1970-1-1开始到现在的秒数。这个时间将被CURLOPT_TIMEVALUE选项作为指定值使⽤,或被默认TIMECOND_IFMODSINCE使⽤。下列选项的值将被作为字符串: 
*CURLOPT_USERPWD:传递⼀个形如[username]:[password]风格的字符串,作⽤PHP去连接。
*CURLOPT_PROXYUSERPWD: 传递⼀个形如[username]:[password]格式的字符串去连接HTTP代理。
*CURLOPT_RANGE:传递⼀个你想指定的范围。它应该是”X-Y”格式,X或Y是被除外的。HTTP传送同样⽀持⼏个间隔,⽤逗句来分隔(X-Y,N-M)。
*CURLOPT_POSTFIELDS: 传递⼀个作为HTTP“POST”操作的所有数据的字符串。
*CURLOPT_REFERER:在HTTP请求中包含⼀个”referer”头的字符串。
*CURLOPT_USERAGENT:在HTTP请求中包含⼀个”user-agent”头的字符串。
*CURLOPT_FTPPORT: 传递⼀个包含被ftp“POST”指令使⽤的IP地址。这个POST指令告诉远程服务器去连接我们指定的IP地址。这个字符串可以是⼀个IP地址,⼀个主机名,⼀个⽹络界⾯名(在UNIX下),或是‘-’(使⽤系统默认IP地址)。
*CURLOPT_COOKIE: 传递⼀个包含HTTP cookie的头连接。
*CURLOPT_SSLCERT: 传递⼀个包含PEM格式证书的字符串。
*CURLOPT_SSLCERTPASSWD:传递⼀个包含使⽤CURLOPT_SSLCERT证书必需的密码。
*CURLOPT_COOKIEFILE:传递⼀个包含cookie数据的⽂件的名字的字符串。这个cookie⽂件可以是Netscape格式,或是堆存在⽂件中的
HTTP风格的头。
*CURLOPT_CUSTOMREQUEST:当进⾏HTTP请求时,传递⼀个字符被GET或HEAD使⽤。为进⾏DELETE或其它操作是有益的,更
Passa string to be used instead of GET or HEAD when doing an HTTPrequest. This is useful for doing or another, more obscure, HTTPrequest. 注意:在确认你的服务器⽀持命令先不要去这样做。下列的选项要求⼀个⽂件描述(通过使⽤fopen()函数获得): 
*CURLOPT_FILE:这个⽂件将是你放置传送的输出⽂件,默认是STDOUT.
*CURLOPT_INFILE: 这个⽂件是你传送过来的输⼊⽂件。
*CURLOPT_STDERR:这个⽂件写有错误⽽不是stderr。⽤来获取需要登录的页⾯的例⼦,当前做法是每次或许都登录⼀次,有需要的⼈再做
改进了:)
3、void curl_easy_reset(CURL *handle )
重新初始化CURL句柄的选项设置。
4、CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ... )
查询CRUL会话的内部信息,具体说明请参考curl⾃带⽂档。
5、void curl_easy_cleanup(CURL * handle )
该函数与curl_easy_init函数成对出现,handle即为调⽤curl_easy_init返回的句柄。该函数在CURL会话结束退出时调⽤,之后handle⽆
效。
Webkit模块
⽤到的第三⽅库如下:
cairo⼀个2D绘图库
casqt Unicode处理⽤的库,从QT中抽取部分代码形成的
expat⼀个XML SAX解析器的库
freetype⽮量字库接⼝库,⽤于存取ttf⽮量字体⽂件
libcurl⼀个开源的url库,⽀持HTTP、FTP等协议
Libjpeg,libpng图像解码库
libxml基于DOM树的XML解析器
libxslt XML transform engine
pthread Pthread库, port of the POSIX thread library
sqlite3⼀个⼩型的数据库,据称在型⼊式平台是存取速度最快的数据库。开源,编译后就⼀个400K的 sqlite.dll。移植⾮常⽅便,纯C写的。
wceshunt⼀个⽤于Windows CE平台下的C常⽤函数封装库
Zlib Zlib库。⽤于解压缩。
2.      Webkit 源代码由三⼤模块组成:
1). WebCore,
2). WebKit,
3). JavaScriptCore。
WebCore:排版引擎核⼼,WebCore包含主要以下模块:Loader, Parser(DOM,Render), Layout,Paint。
WebKit:移植层,主要包含: GUI,File System, Thread,Text,图⽚编解码等与平台相关的函数。
JavaScriptCore:JS虚拟机,相对独⽴,主要⽤于操作DOM, DOM是W3C定义的规范,主要⽤于定义外部可以操作的浏览器内核的接⼝,⽽webcore必须实现DOM规范。
(具体的DOM规范可以查w3c.)
3.      WebKit分模块介绍(这⾥简单列出,后⾯再具体介绍)
Webkit平台相关
1)      CURL⽹络库
2)      libPng, LibJpeg图形处理相关
3)      sqlite⼩型关系数据库
WebCore核⼼
1)      Loader加载资源及Cache 实现(Curl)
2)      DOM : HTML词法分析与语法分析
3)      DOM : DOM节点与Render节点创建,形成DOM树
4)      Render:Render树介绍,RenderBox
5)      Layout:排版介绍
6)      Css Parser模块
7)      Binding-DOM与JavascriptCore绑定的功能
JavascriptCore-javascript引擎
1)      API-基本javascript功能
2)      Binding与其它功能绑定的功能,如:DOM,C,JNI
3)      DerviedSource⾃动产⽣的代码
4)      PCRE-Perl-Compatible Regular Expressions
5)      KJS-Javascript Kernel
4. 页⾯的整个处理流程—(简单介绍,详细流程在后⾯笔记中)
1). ⽤户输⼊⽹址后,FrameLoader::load函数会接收到URL。
   2). 把URL 请求传给CURL库。
   3). CURL发出http请求,得到数据后,传给Loader,开始解析。
   4). 通过Dom Builder按W3C的html规范⽣成Dom树
   5). 如果有javascript,JSEngine就通过ECMA-262标准完善Dom树
   6). 在⽣成DOM树的同时,同步⽣成Render树。
   7). 解析完后,调⽤Layout排版
   8). Paint出来
curl命令发送post请求带参数
libCurl库介绍
前⾯有说道webkit仅仅是⼀个页⾯排版的引擎,所以,对webkit来说,⽹页数据(html⽂件,图⽚,.css,.js⽂件)的请求与接收都是通过第三⽅的库:libCurl来处理。
打开webkit开发⼯程(.sln)即可以看到,libcurl可以被静态或动态链接到主⼯程中。
Libcurl就是指的curl,只是在webkit⼯程中,不作为单独的进程存在,⽽是被编译成动态库。
webkit主要⽤到curl的以下功能:
1)      Http协议。包含:Get, put, Post, Cookie管理。
2)      https协议。
3)      本地⽂件缓存。(前进,后退管理)
Webkit具体调⽤了哪些curl接⼝,详见后⾯Loader模块介绍章节。这⾥简单列举:
1)          curl_global_init(CURL_GLOBAL_ALL);
2)          curl_multi_init()
3)          curl_share_init()
4)          curl_share_setopt()
5)          curl_easy_getinfo()
6)          curl_multi_fdset()
7)          curl_multi_perform()
8)          curl_multi_info_read()
9)          curl_multi_cleanup()
10)      curl_share_cleanup()
11)      curl_global_cleanup();
可以看到,由于webkit要⽀持同时请求多个http数据,所以⽤到的是curl的multi接⼝。
在介绍Loader之前,先介绍⼀下libcurl,打下基础。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。