(推荐)PHP采集工具curl快速入门教程

为什么要用CURL?

CURL(Client URL Library Functions)是一个利用URL语法在命令行方式下工作的文件传输工具。它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER,  TELNET, DICT, FILE 以及 LDAP。CURL同样支持HTTPS认证,HTTP POST方法, HTTP PUT方法,FTP 上传, kerberos认证,HTTP上传, 代理服务器, cookies, 用户名/密码认证,下载文件断点续传,上载文件断点续传, http代理服务器管道( proxy tunneling),甚至它还支持IPv6, socks5代理服务器, 通过http代理服务器上传文件到FTP服务器等等,功能十分强大。

是的,我们可以通过其他办法获取网页内容。大多数时候,我因为想偷懒,都直接用简单的PHP函数:

1 $content file_get_contents("http://blog.snsgou.com/blog/");
2 // or
3 $lines = file("http://blog.snsgou.com");
4 // or
5 readfile("http://blog.snsgou.com");

不过,这种做法缺乏灵活性和有效的错误处理。而且,你也不能用它完成一些高难度任务——比如处理coockies、验证、表单提交、文件上传等等。

引用:

CURL 是一种功能强大的库,支持很多不同的协议、选项,能提供 URL 请求相关的各种细节信息。

基本结构:

在学习更为复杂的功能之前,先来看一下在PHP中建立CURL请求的基本步骤:

  1. 初始化
  2. 设置变量
  3. 执行并获取结果
  4. 释放CURL句柄
01 // 1. 初始化
02 $ch = curl_init();
03 // 2. 设置选项,包括URL
04 curl_setopt($ch, CURLOPT_URL, "http://blog.snsgou.com");
05 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
06 curl_setopt($ch, CURLOPT_HEADER, 0);
07 // 3. 执行并获取HTML文档内容
08 $output = curl_exec($ch);
09 // 4. 释放curl句柄
10 curl_close($ch);

第二步(也就是 curl_setopt() )最为重要,一切玄妙均在此。有一长串CURL参数可供设置,它们能指定URL请求的各个细节。要一次性全部看完并理解可能比较困难,所以今天我们只试一下那些更常用也更有用的选项。

检查错误

你可以加一段检查错误的语句(虽然这并不是必需的):

1 // ...
2 $output = curl_exec($ch);
3 if  ($output === FALSE) {
4     echo "CURL Error: " . curl_error($ch);
5 }
6 // ...

请注意,比较的时候我们用的是“=== FALSE”,而非“== FALSE”。因为我们得区分 空输出 和 布尔值FALSE,后者才是真正的错误。

获取信息

这是另一个可选的设置项,能够在CURL执行后获取这一请求的有关信息:

1 // ...
2 curl_exec($ch);
3 $info = curl_getinfo($ch);
4 echo "获取"$info["url"] . "耗时"$info["total_time"] . "秒";
5 // ...

返回的数组中包括了以下信息:

  • "url" //资源网络地址
  • "content_type" //内容编码
  • "http_code" //HTTP状态码
  • "header_size" //header的大小
  • "request_size" //请求的大小
  • "filetime" //文件创建时间
  • "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。

01 // 测试用的URL
02 $urls array(
03     "http://www.cnn.com",
04     "http://www.mozilla.com",
05     "http://www.facebook.com"
06 );
07  
08 // 测试用的浏览器信息
09 $browsers array(
10     "standard" => array(
11         "user_agent" => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)",
12         "language" => "en-us,en;q=0.5"
13     ),
14     "iphone" => array(
15         "user_agent" => "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A537a Safari/419.3",
16         "language" => "en"
17     ),
18     "french" => array(
19         "user_agent" => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)",
20         "language" => "fr,fr-FR;q=0.5"
21     )
22 );
23  
24 foreach ($urls as $url) {
25     echo "URL: $url
26 ";
27     foreach ($browsers as $test_name => $browser) {
28         $ch = curl_init();
29  
30         // 设置 url
31         curl_setopt($ch, CURLOPT_URL, $url);
32  
33         // 设置浏览器的特定header
34         curl_setopt($ch, CURLOPT_HTTPHEADER, array(
35             "User-Agent: {$browser["user_agent"]}",
36             "Accept-Language: {$browser["language"]}"
37         ));
38  
39         // 页面内容我们并不需要
40         curl_setopt($ch, CURLOPT_NOBODY, 1);
41  
42         // 只需返回HTTP header
43         curl_setopt($ch, CURLOPT_HEADER, 1);
44  
45         // 返回结果,而不是输出它
46         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
47  
48         $output = curl_exec($ch);
49         curl_close($ch);
50  
51         // 有重定向的HTTP头信息吗?
52         if (preg_match("!Location: (.*)!"$output$matches)) {
53             echo "$test_name: redirects to $matches[1]
54 ";
55         else {
56             echo "$test_name: no redirection
57 ";
58         }
59     }
60  
61     echo "
62  
63 ";
64 }

首先,我们建立一组需要测试的URL,接着指定一组需要测试的浏览器信息。最后通过循环测试各种URL和浏览器匹配可能产生的情况。

因为我们指定了CURL选项,所以返回的输出内容则只包括HTTP头信息(被存放于 $output 中)。利用一个简单的正则,我们检查这个头信息中是否包含了“Location:”字样。

运行这段代码应该会返回如下结果:

用POST方法发送数据

当发起GET请求时,数据可以通过“查询字串”(query string)传递给一个URL。例如,在google中搜索时,搜索关键即为URL的查询字串的一部分:

http://www.google.com/search?q=snsgou.com

这种情况下你可能并不需要CURL来模拟。把这个URL丢给“file_get_contents()”就能得到相同结果。

不过有一些HTML表单是用POST方法提交的。这种表单提交时,数据是通过 HTTP请求体(request body) 发送,而不是查询字串。例如,当使用CodeIgniter论坛的表单,无论你输入什么关键字,总是被POST到如下页面:

http://codeigniter.com/forums/do_search/

你可以用PHP脚本来模拟这种URL请求。首先,新建一个可以接受并显示POST数据的文件,我们给它命名为post_output.php:

print_r($_POST);

接下来,写一段PHP脚本来执行CURL请求:

01 $url "http://localhost/post_output.php";
02 $post_data array (
03     "foo" => "bar",
04     "query" => "Nettuts",
05     "action" => "Submit"
06 );
07 $ch = curl_init();
08 curl_setopt($ch, CURLOPT_URL, $url);
09 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
10  
11 // 我们在POST数据哦!
12 curl_setopt($ch, CURLOPT_POST, 1);
13  
14 // 把post的变量加上
15 curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
16  
17 $output = curl_exec($ch);
18 curl_close($ch);
19  
20 echo $output;

执行代码后应该会得到以下结果:

这段脚本发送一个POST请求给 post_output.php ,这个页面 $_POST 变量并返回,我们利用CURL捕捉了这个输出。

文件上传

上传文件和前面的POST十分相似。因为所有的文件上传表单都是通过POST方法提交的。

首先新建一个接收文件的页面,命名为 upload_output.php:

print_r($_FILES);

以下是真正执行文件上传任务的脚本:

01 $url "http://localhost/upload_output.php";
02 $post_data array (
03     "foo" => "bar",
04     // 要上传的本地文件地址
05     "upload" => "@C:/wamp/www/test.zip"
06 );
07 $ch = curl_init();
08 curl_setopt($ch, CURLOPT_URL, $url);
09 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
10 curl_setopt($ch, CURLOPT_POST, 1);
11 curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
12 $output = curl_exec($ch);
13 curl_close($ch);
14 echo $output;

如果你需要上传一个文件,只需要把文件路径像一个post变量一样传过去,不过记得在前面加上@符号。执行这段脚本应该会得到如下输出:

1 /** 保存文件 */
2 if (is_uploaded_file($_FILES[‘upload‘][‘tmp_name‘])) {
3     $filename $_FILES[‘upload‘][‘tmp_name‘];
4     $destination = DATA_PATH . ‘xxxyyyzzz.rar‘;
5     move_uploaded_file($filename$destination);
6 }
7  
8 echo ‘upload sucess‘;

CURL批处理(multi CURL)

CURL还有一个高级特性——批处理句柄(handle)。这一特性允许你同时或异步地打开多个URL连接。

下面是来自来自php.net的示例代码:

01 // 创建两个CURL资源
02 $ch1 = curl_init();
03 $ch2 = curl_init();
04  
05 // 指定URL和适当的参数
06 curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
07 curl_setopt($ch1, CURLOPT_HEADER, 0);
08 curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
09 curl_setopt($ch2, CURLOPT_HEADER, 0);
10  
11 // 创建CURL批处理句柄
12 $mh = curl_multi_init();
13  
14 // 加上前面两个资源句柄
15 curl_multi_add_handle($mh,$ch1);
16 curl_multi_add_handle($mh,$ch2);
17  
18 // 预定义一个状态变量
19 $active = null;
20  
21 // 执行批处理
22 do {
23     $mrc = curl_multi_exec($mh$active);
24 while ($mrc == CURLM_CALL_MULTI_PERFORM);
25  
26 while ($active && $mrc == CURLM_OK) {
27     if (curl_multi_select($mh) != -1) {
28         do {
29             $mrc = curl_multi_exec($mh$active);
30         while ($mrc == CURLM_CALL_MULTI_PERFORM);
31     }
32 }
33 // 关闭各个句柄
34 curl_multi_remove_handle($mh$ch1);
35 curl_multi_remove_handle($mh$ch2);
36 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。

还是来看一看怎么把这一功能用到实处吧:

WordPress 连接检查器

想象一下你有一个文章数目庞大的博客,这些文章中包含了大量外部网站链接。一段时间之后,因为这样那样的原因,这些链接中相当数量都失效了。要么是被和谐了,要么是整个站点都被功夫网了...

我们下面建立一个脚本,分析所有这些链接,找出打不开或者404的网站/网页,并生成一个报告。

请注意,以下并不是一个真正可用的WordPress插件,仅仅是一段独立功能的脚本而已,仅供演示,谢谢。

好,开始吧。首先,从数据库中读取所有这些链接:

01 // CONFIG
02 $db_host "localhost";
03 $db_user "root";
04 $db_pass "";
05 $db_name "wordpress";
06 $excluded_domains array(
07 "localhost""www.mydomain.com");
08 $max_connections = 10;
09  
10 // 初始化一些变量
11 $url_list array();
12 $working_urls array();
13 $dead_urls array();
14 $not_found_urls array();
15 $active = null;
16  
17 // 连到 MySQL
18 if (!mysql_connect($db_host$db_user$db_pass)) {
19     die("Could not connect: " . mysql_error());
20 }
21  
22 if (!mysql_select_db($db_name)) {
23     die("Could not select db: " . mysql_error());
24 }
25  
26 // 找出所有含有链接的文章
27 $q = "SELECT post_content FROM wp_posts
28 WHERE post_content LIKE "%href=%"
29 AND post_status = "publish"
30 AND post_type = "post"";
31  
32 $r = mysql_query($qor die(mysql_error());
33 while ($d = mysql_fetch_assoc($r)) {
34     // 用正则匹配链接
35     if (preg_match_all("!href="(.*?)"!"$d["post_content"], $matches)) {
36         foreach ($matches[1] as $url) {
37  
38             // exclude some domains
39             $tmp parse_url($url);
40             if (in_array($tmp["host"], $excluded_domains)) {
41                 continue;
42             }
43  
44             // store the url
45             $url_list []= $url;
46         }
47     }
48 }
49 // 移除重复链接
50 $url_list array_values(array_unique($url_list));
51 if (!$url_list) {
52 die("No URL to check");
53 }

我们首先配置好数据库,一系列要排除的域名($excluded_domains),以及最大并发连接数($max_connections)。然后,连接数据库,获取文章和包含的链接,把它们收集到一个数组中($url_list)。

下面的代码有点复杂了,因此我将一小步一小步地详细解释:

001 // 1. 批处理器
002 $mh = curl_multi_init();
003  
004 // 2. 加入需批量处理的URL
005 for ($i = 0; $i $max_connections$i++) {
006     add_url_to_multi_handle($mh$url_list);
007 }
008  
009 // 3. 初始处理
010 do {
011     $mrc = curl_multi_exec($mh$active);
012 while ($mrc == CURLM_CALL_MULTI_PERFORM);
013  
014 // 4. 主循环
015 while ($active && $mrc == CURLM_OK) {
016  
017     // 5. 有活动连接
018     if (curl_multi_select($mh) != -1) {
019  
020         // 6. 干活
021         do {
022             $mrc = curl_multi_exec($mh$active);
023         while ($mrc == CURLM_CALL_MULTI_PERFORM);
024  
025         // 7. 有信息否?
026         if ($mhinfo = curl_multi_info_read($mh)) {
027  
028             // 意味着该连接正常结束
029             // 8. 从curl句柄获取信息
030             $chinfo = curl_getinfo($mhinfo["handle"]);
031  
032             // 9. 死链么?
033             if (!$chinfo["http_code"]) {
034                 $dead_urls []= $chinfo["url"];
035                 // 10. 404了?
036             else if ($chinfo["http_code"] == 404) {
037                 $not_found_urls []= $chinfo["url"];
038                 // 11. 还能用
039             else {
040                 $working_urls []= $chinfo["url"];
041             }
042  
043             // 12. 移除句柄
044             curl_multi_remove_handle($mh$mhinfo["handle"]);
045             curl_close($mhinfo["handle"]);
046  
047             // 13. 加入新URL,干活
048             if (add_url_to_multi_handle($mh$url_list)) {
049                 do {
050                     $mrc = curl_multi_exec($mh$active);
051                 while ($mrc == CURLM_CALL_MULTI_PERFORM);
052             }
053         }
054     }
055 }
056  
057 // 14. 完了
058 curl_multi_close($mh);
059 echo "==Dead URLs==
060 ";
061 echo implode("
062 ",$dead_urls) . "
063  
064 ";
065 echo "==404 URLs==
066 ";
067 echo implode("
068 ",$not_found_urls) . "
069  
070 ";
071 echo "==Working URLs==
072 ";
073 echo implode("
074 ",$working_urls);
075  
076 // 15. 向批处理器添加url
077 function add_url_to_multi_handle($mh$url_list) {
078     static $index = 0;
079  
080     // 如果还剩url没用
081     if ($url_list[$index]) {
082  
083         // 新建curl句柄
084         $ch = curl_init();
085  
086         // 配置url
087         curl_setopt($ch, CURLOPT_URL, $url_list[$index]);
088  
089         // 不想输出返回的内容
090         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
091  
092         // 重定向到哪儿我们就去哪儿
093         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
094  
095         // 不需要内容体,能够节约带宽和时间
096         curl_setopt($ch, CURLOPT_NOBODY, 1);
097  
098         // 加入到批处理器中
099         curl_multi_add_handle($mh$ch);
100  
101         // 拨一下计数器,下次调用该函数就能添加下一个url了
102         $index++;
103         return true;
104  
105     else {
106         // 没有新的URL需要处理了
107         return false;
108     }
109 }

下面解释一下以上代码。列表的序号对应着代码注释中的顺序数字。

  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的活儿又来了,主要是获取响应数据。
  7. 检查各种信息。当一个URL请求完成时,会返回一个数组。
  8. 在返回的数组中有一个 CURL 句柄。我们利用其获取单个CURL请求的相应信息。
  9. 如果这是一个死链或者请求超时,不会返回http状态码。
  10. 如果这个页面找不到了,会返回404状态码。
  11. 其他情况我们都认为这个链接是可用的(当然,你也可以再检查一下500错误之类...)。
  12. 从该批次移除这个CURL句柄,因为它已经没有利用价值了,关了它!
  13. 很好,现在可以另外加一个URL进来了。再一次地,初始化工作又开始进行...
  14. 嗯,该干的都干了。关闭批处理器,生成报告。
  15. 回过头来看给批处理器添加新URL的函数。这个函数每调用一次,静态变量 $index 就递增一次,这样我们才能知道还剩多少URL没处理。

我把这个脚本在我的博客上跑了一遍(测试需要,有一些错误链接是故意加上的),结果如下:

1 <img border="0" src="/program/UploadPic/2011-7/2011751305355.png" />

共检查约40个URL,只耗费两秒不到。当需要检查更加大量的URL时,其省心省力的效果可想而知!如果你同时打开10个连接,还能再快上10倍!另外,你还可以利用CURL批处理的无隔断特性来处理大量URL请求,而不会阻塞你的Web脚本。

另一些有用的CURL 选项

HTTP 认证

如果某个URL请求需要基于 HTTP 的身份验证,你可以使用下面的代码:

01 $url "http://www.somesite.com/members/";
02 $ch = curl_init();
03 curl_setopt($ch, CURLOPT_URL, $url);
04 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
05  
06 // 发送用户名和密码
07 curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword");
08  
09 // 你可以允许其重定向
10 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
11  
12 // 下面的选项让 CURL 在重定向后
13 // 也能发送用户名和密码
14 curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1);
15  
16 $output = curl_exec($ch);
17 curl_close($ch);

FTP 上传

PHP 自带有 FTP 类库, 但你也能用CURL:

01 // 开一个文件指针
02 $file fopen("/path/to/file""r");
03  
04 // url里包含了大部分所需信息
05 $url "ftp://username:[email protected]:21/path/to/new/file";
06 $ch = curl_init();
07 curl_setopt($ch, CURLOPT_URL, $url);
08 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
09  
10 // 上传相关的选项
11 curl_setopt($ch, CURLOPT_UPLOAD, 1);
12 curl_setopt($ch, CURLOPT_INFILE, $fp);
13 curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/path/to/file"));
14  
15 // 是否开启ASCII模式 (上传文本文件时有用)
16 curl_setopt($ch, CURLOPT_FTPASCII, 1);
17  
18 $output = curl_exec($ch);
19 curl_close($ch);

FQ术

你可以用代理发起CURL请求:

01 $ch = curl_init();
02 curl_setopt($ch, CURLOPT_URL,"http://blog.snsgou.com");
03 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
04  
05 // 指定代理地址
06 curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080");
07  
08 // 如果需要的话,提供用户名和密码
09 curl_setopt($ch, CURLOPT_PROXYUSERPWD,"user:pass");
10 $output = curl_exec($ch);
11 curl_close ($ch);

回调函数

可以在一个URL请求过程中,让CURL调用某指定的回调函数。例如,在内容或者响应下载的过程中立刻开始利用数据,而不用等到完全下载完。

1 $ch = curl_init();
2 curl_setopt($ch, CURLOPT_URL, "http://blog.snsgou.com");
3 curl_setopt($ch, CURLOPT_WRITEFUNCTION, "progress_function");
4 curl_exec($ch);
5 curl_close ($ch);
6 function progress_function($ch$str) {
7     echo $str;
8     return strlen($str);
9 }

这个回调函数必须返回字串的长度,不然此功能将无法正常使用。

在URL响应接收的过程中,只要收到一个数据包,这个函数就会被调用。

小结

今天我们一起学习了CURL库的强大功能和灵活的扩展性。希望你喜欢。下一次要发起URL请求时,考虑下CURL吧!

原文:基于PHP的CURL快速入门

英文原文:http://net.tutsplus.com/tutorials/php/techniques-and-resources-for-mastering-curl/

原文作者:Burak Guzel

时间: 2024-10-18 19:12:33

(推荐)PHP采集工具curl快速入门教程的相关文章

NetBeans工具学习之道:NetBeans IDE Java 快速入门教程

欢迎使用 NetBeans IDE! 本教程通过指导您创建一个简单的 "Hello World" Java 控制台应用程序,简要介绍 NetBeans IDE 工作流.学习完本教程后,您将对如何在 IDE 中创建和运行应用程序有一个基本了解. 学习完本教程所需的时间不到 10 分钟. 学完本教程后,您可以转至文档.培训和支持页中链接的学习资源.这些学习资源提供了综合性教程,其中重点介绍适用各种应用程序类型的更多 IDE 功能和编程技巧.如果您不希望创建 "Hello Worl

专为设计师而写的GitHub快速入门教程

原文出处: Kevin Li 在互联网行业工作的想必都多多少少听说过GitHub的大名,除了是最大的开源项目托管平台,许多企业也都是用GitHub来协同开发工作,当然我 们彩程也是其中之一.笔者最初决定学习Git也是因为在团队内部设计方案初步被开发出来后,难免会有一些细节需要调整,而为了调整几像素的问题再求前端工 程师出马,其实是很影响整体效率的,所以希望通过学习GitHub好在必要的时候直接参与开发,能发挥自己的一点CSS技术以更直接快速的解决问题. 但是期间竟然发现网上无一篇为设计师而备的G

Android 2D游戏引擎AndEngine快速入门教程

Android 2D游戏引擎AndEngine快速入门教程 介绍:AndEngine是一款知名的Android 2D游戏引擎.该引擎代码开源,并且可以免费使用.本书详细讲解如何使用AndEngine引擎开发2D游戏. 试读下载地址:http://pan.baidu.com/s/1c0CODiw 前言 作为一款免费的手机操作系统,Android系统占据大半的手机系统份额.在Android众多的应用类型中,游戏应用由其娱乐性成为最大的分支.由于手机的操控特点,2D游戏成为Android游戏的主流,如

CMake快速入门教程-实战

http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/ http://blog.csdn.net/dbzhang800/article/details/6314073 http://www.cnblogs.com/coderfenghc/archive/2013/01/20/2846621.html http://blog.sina.com.cn/s/blog_4aa4593d0100q3bt.html http://hahack.com/c

EntityFramework6 快速入门教程

EntityFramework6 快速入门教程 不得不说EF在国内实在是太小众,相关的技术文章真实屈指可数,而且很多文章都很旧了,里面使用的版本跟如今的EF6差别还是比较大.我刚开始弄这个的时候真是绕了不少弯路. 学习EF还是需要一些条件,使用EF并不意味着你就可以完全不跟数据库打交道了,要学好EF,数据库中的什么主键.外键.索引.SQL等你还是要懂,另外EF中将大量使用LINQ来进行数据查询,数据模型中还将涉及到特性与泛型,所以对于C#的基础要求还比较高. 在我看来EF并不适合初学者使用,虽然

Velocity快速入门教程

Velocity快速入门教程-脚本语法详解(转) 1.变量 (1)变量的定义: #set($name = "hello")      说明:velocity中变量是弱类型的. 当使用#set 指令时,括在双引号中的字面字符串将解析和重新解释,如下所示: #set($directoryRoot = "www" ) #set($templateName = "index.vm" ) #set($template = "$directoryR

BeagleBone Black快速入门教程第1章嵌入式Linux之于Maker们

BeagleBone Black快速入门教程第1章嵌入式Linux之于Maker们 Maker的中文含义类似"创客".创客是指一群酷爱科技.热衷实践的人群,他们以分享技术.交流思想为乐.但为了保持Maker的原味,这里我们一致使用英文的Maker.Maker文化是DIY(Do IT Yourself)文化的延伸,它在其中糅合了技术元素.本文选自<BeagleBone Black快速入门教程大学霸> 1.1  Maker的世界 Maker们的兴趣主要集中在以工程化为导向的主题

Arduino Yun快速入门教程(大学霸内部资料)

Arduino Yun快速入门教程(大学霸内部资料) 本资料为国内第一本Arduino Yun教程.详细讲解Arduino Yun的基本结构.开发环境.系统配置,并着力讲解关键功能--Bridge.最后,本书实现了一个智能家居控制系统--家居环境监测.该系统具有温度监控.湿度监控.安防监控.家电控制等重要功能.基于该系统,读者可以扩展出更丰富的功能,打造更智能的现代家居环境. 试读样章下载:http://pan.baidu.com/s/1kTIE5M3 目  录 第1章  Arduino Yun

转:CMake快速入门教程-实战

CMake快速入门教程:实战 收藏人:londonKu     2012-05-07 | 阅:10128  转:34    |   来源   |  分享      0. 前言一个多月前,由于工程项目的需要,匆匆的学习了一下cmake的使用方法,现在有时间拿出来整理一下.本文假设你已经学会了cmake的使用方法,如果你还不会使用cmake,请参考相关资料之后再继续向下看.本文中介绍的是生成可执行程序的方法和步骤,生成动态库和静态库的方法与此有所不同,随后会介绍动态库和静态库项目中cmake的编写方