当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP中Libevent HTTP客户端实现程序

发布:smiling 来源: PHP粉丝网  添加日期:2015-04-15 14:17:51 浏览: 评论:0 

下面来给各位介绍一段用php实现的Libevent HTTP客户端实现程序,有需要了解的朋友可与小编一起来学习一下.

php Libevent HTTP,代码如下:

  1. <?php 
  2. //请求完成回调 
  3. function _request_handler($req$base) { 
  4.   global $pend_req
  5.   //echo __FUNCTION__, PHP_EOL; 
  6.  
  7.   if (is_null($req)) { 
  8.     //echo "Timed out\n"; 
  9.   } else { 
  10.     $response_code = $req->getResponseCode(); 
  11.  
  12.     if ($response_code == 0) { 
  13.       //echo "Connection refused\n"; 
  14.     } elseif ($response_code != 200) { 
  15.       //echo "Unexpected response: $response_code\n"; 
  16.     } else { 
  17.       //echo "Success: $response_code\n"; 
  18.       /* 
  19.       $buf = $req->getInputBuffer(); 
  20.       echo "Body:\n"; 
  21.       while ($s = $buf->readLine(EventBuffer::EOL_ANY)) { 
  22.       echo $s, PHP_EOL; 
  23.       } 
  24.        */ 
  25.     } 
  26.   } 
  27.   $pend_req--; 
  28.   //退出循环 
  29.   if (!$pend_req) { 
  30.     $base = $conn->getBase(); 
  31.     $base->exit(NULL); 
  32.   } 
  33.   //释放内存 
  34.   unset($req); 
  35.   unset($conn); 
  36.  
  37. //$address = "www.phpfensi.com"; 
  38. $pend_req = 0; 
  39. $port = 80; 
  40. //初始化event base 
  41. $base = new EventBase(); 
  42. echo "Event method used: "$base->getMethod(), PHP_EOL; 
  43.  //使用异步DNS 
  44. $dns_base = new EventDnsBase($base, TRUE); 
  45. $ffopen("./50000.txt","r"); 
  46. while (!feof($f)) 
  47.   $line = fgets($f); 
  48.   //echo $address; 
  49.   $address = trim($line); 
  50.   //新建http连接事件到base 
  51.   $conn = new EventHttpConnection($base$dns_base$address$port); 
  52.   $conn->setTimeout(1); 
  53.   //设置请求回调 
  54.   $req = new EventHttpRequest("_request_handler"$conn); 
  55.   //开源软件:phpfensi.com 
  56.   $req->addHeader("Host"$address, EventHttpRequest::OUTPUT_HEADER); 
  57.   $req->addHeader("Content-Length""0", EventHttpRequest::OUTPUT_HEADER); 
  58.   $conn->makeRequest($req, EventHttpRequest::CMD_GET, "/"); 
  59.   $pend_req++; 
  60. fclose($f); 
  61. //事件主循环 
  62. $base->loop(); 
  63. ?> 

c语言版,代码如下:

  1. #include <stdio.h> 
  2. #include <string.h> 
  3. #include <ctype.h> 
  4. #include <stdlib.h> 
  5. #include <signal.h> 
  6. #include <unistd.h> 
  7. #include <evhttp.h> 
  8. #include <event2/event.h> 
  9. #include <event2/http.h> 
  10. #include <event2/bufferevent.h> 
  11. typedef struct my_struct_s my_struct_t; 
  12.  
  13. struct my_struct_s { 
  14.   struct evhttp_connection *conn; 
  15.   struct evhttp_request *req; 
  16.   struct evhttp_uri *uri; 
  17.   struct event *cleanup; 
  18. }; 
  19.  
  20. struct event_base *Base_Primary; 
  21.  
  22. char *trimwhitespace(char *str) 
  23.   char *end
  24.  
  25.   // Trim leading space 
  26.   while(isspace(*str)) str++; 
  27.  
  28.   if(*str == 0)  // All spaces? 
  29.     return str; 
  30.  
  31.   // Trim trailing space 
  32.   end = str + strlen(str) - 1; 
  33.   while(end > str && isspace(*end)) end--; 
  34.  
  35.   // Write new null terminator 
  36.   *(end+1) = 0; 
  37.  
  38.   return str; 
  39.  
  40. void connection_free(int sock, short which, void *arg) { 
  41.   //printf("freeing connection!!! The socket's FD would have been closed when the HTTP request ended and the ->req object would have been free'd\n"); 
  42.  
  43.   // Get our structure object 
  44.   my_struct_t *myStruct = arg; 
  45.  
  46.   // Cleanup our properties 
  47.   event_free(myStruct->cleanup); 
  48.   evhttp_connection_free(myStruct->conn); 
  49.   evhttp_request_free(myStruct->req); 
  50.   evhttp_uri_free(myStruct->uri); 
  51.  
  52.   // Free our custom structure 
  53.   free(myStruct); 
  54.  
  55. void http_request_done(struct evhttp_request *req, void *arg){ 
  56.  
  57.   // Get our custom struct 
  58.   my_struct_t *myStruct = arg; 
  59.  
  60.   // Setup our timeout information (we delay 5 seconds) 
  61.   struct timeval Timeout; 
  62.   Timeout.tv_sec = 0; 
  63.   Timeout.tv_usec = 0; 
  64.  
  65.   // Add this structure to our cleanup base to be cleaned up synchronously 
  66.   // TODO: Probably not the best way to cleanup and event, but it'l work for the purposes of illustration. 
  67.   // This way would ensure no race conditions exist, but it's probably not the most efficient depending on how many requests, etc we're dealing with. 
  68.   myStruct->cleanup = evtimer_new(Base_Primary, connection_free, (void *)myStruct); 
  69.   evtimer_add(myStruct->cleanup, &Timeout); 
  70.  
  71.   //printf("http_request_done, we put our custom strucutre into a cleanup event to be freed!\n"); 
  72.  
  73. int http_req(char *uri) { 
  74.  
  75.   // Allocate our custom struture 
  76.   my_struct_t *myStruct = malloc(sizeof(my_struct_t)); 
  77.  
  78.   // Create our EVHTP connection and request 
  79.   myStruct->uri = evhttp_uri_parse(uri); 
  80.   myStruct->conn = evhttp_connection_base_new(Base_Primary, NULL, uri, 80); 
  81.   myStruct->req = evhttp_request_new(http_request_done, myStruct); 
  82.   evhttp_add_header(evhttp_request_get_output_headers(myStruct->req), "Host""localhost"); 
  83.   evhttp_add_header(evhttp_request_get_output_headers(myStruct->req), "Connection""close"); 
  84.   evhttp_make_request(myStruct->conn, myStruct->req, EVHTTP_REQ_GET, uri); 
  85.   evhttp_connection_set_timeout(myStruct->req->evcon, 2); 
  86.   return 1; 
  87.  
  88.  
  89. // Define our primary function 
  90. int main(int argc, char *argv[]) { 
  91.  
  92.   // Initialize our bases 
  93.   Base_Primary = event_base_new(); 
  94.  
  95.   char filename[] = "/tmp/50000.txt"//文件名 
  96.   FILE *fp;  
  97.   char StrLine[1024];             //每行最大读取的字符数 
  98.   char *host; 
  99.   if((fp = fopen(filename,"r")) == NULL) //判断文件是否存在及可读 
  100.   {  
  101.     printf("error!");  
  102.     return -1;  
  103.   }  
  104.  
  105.   while (!feof(fp))  
  106.   {  
  107.     fgets(StrLine,1024,fp);  //读取一行 
  108.     host = StrLine; 
  109.     host = trimwhitespace(host); 
  110.     //printf("%s", host); //输出 
  111.     http_req(host); 
  112.   } 
  113.   fclose(fp);   
  114.  
  115.   // 
  116.   //event_base_loop(Base_Primary); 
  117.   event_base_dispatch(Base_Primary); 
  118.  
  119.   // Free our primary base 
  120.   event_base_free(Base_Primary); 
  121.   return 1; 
  122. }

Tags: Libevent HTTP客户端

分享到: