欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

PHP中Libevent HTTP客户端实现程序

程序员文章站 2022-04-22 23:41:44
...
下面来给各位介绍一段用php实现的Libevent HTTP客户端实现程序,有需要了解的朋友可与小编一起来学习一下.

php Libevent HTTP,代码如下:

getResponseCode(); 
	 
	    if ($response_code == 0) { 
	      //echo "Connection refused\n"; 
	    } elseif ($response_code != 200) { 
	      //echo "Unexpected response: $response_code\n"; 
	    } else { 
	      //echo "Success: $response_code\n"; 
	      /* 
	      $buf = $req->getInputBuffer(); 
	      echo "Body:\n"; 
	      while ($s = $buf->readLine(EventBuffer::EOL_ANY)) { 
	      echo $s, PHP_EOL; 
	      } 
	       */ 
	    } 
	  } 
	  $pend_req--; 
	  //退出循环 
	  if (!$pend_req) { 
	    $base = $conn->getBase(); 
	    $base->exit(NULL); 
	  } 
	  //释放内存 
	  unset($req); 
	  unset($conn); 
	} 
	 
	//$address = "www.phprm.com"; 
	$pend_req = 0; 
	$port = 80; 
	//初始化event base 
	$base = new EventBase(); 
	echo "Event method used: ", $base->getMethod(), PHP_EOL; 
	 //使用异步DNS 
	$dns_base = new EventDnsBase($base, TRUE); 
	$f= fopen("./50000.txt","r"); 
	while (!feof($f)) 
	{ 
	  $line = fgets($f); 
	  //echo $address; 
	  $address = trim($line); 
	  //新建http连接事件到base 
	  $conn = new EventHttpConnection($base, $dns_base, $address, $port); 
	  $conn->setTimeout(1); 
	  //设置请求回调 
	  $req = new EventHttpRequest("_request_handler", $conn); 
	   
	  $req->addHeader("Host", $address, EventHttpRequest::OUTPUT_HEADER); 
	  $req->addHeader("Content-Length", "0", EventHttpRequest::OUTPUT_HEADER); 
	  $conn->makeRequest($req, EventHttpRequest::CMD_GET, "/"); 
	  $pend_req++; 
	} 
	fclose($f); 
	//事件主循环 
	$base->loop(); 
	 

c语言版,代码如下:

#include  
	#include  
	#include  
	#include  
	#include  
	#include  
	#include  
	#include  
	#include  
	#include  
	typedef struct my_struct_s my_struct_t; 
	 
	struct my_struct_s { 
	  struct evhttp_connection *conn; 
	  struct evhttp_request *req; 
	  struct evhttp_uri *uri; 
	  struct event *cleanup; 
	}; 
	 
	struct event_base *Base_Primary; 
	 
	char *trimwhitespace(char *str) 
	{ 
	  char *end; 
	 
	  // Trim leading space 
	  while(isspace(*str)) str++; 
	 
	  if(*str == 0)  // All spaces? 
	    return str; 
	 
	  // Trim trailing space 
	  end = str + strlen(str) - 1; 
	  while(end > str && isspace(*end)) end--; 
	 
	  // Write new null terminator 
	  *(end+1) = 0; 
	 
	  return str; 
	} 
	 
	void connection_free(int sock, short which, void *arg) { 
	  //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"); 
	 
	  // Get our structure object 
	  my_struct_t *myStruct = arg; 
	 
	  // Cleanup our properties 
	  event_free(myStruct->cleanup); 
	  evhttp_connection_free(myStruct->conn); 
	  evhttp_request_free(myStruct->req); 
	  evhttp_uri_free(myStruct->uri); 
	 
	  // Free our custom structure 
	  free(myStruct); 
	} 
	 
	void http_request_done(struct evhttp_request *req, void *arg){ 
	 
	  // Get our custom struct 
	  my_struct_t *myStruct = arg; 
	 
	  // Setup our timeout information (we delay 5 seconds) 
	  struct timeval Timeout; 
	  Timeout.tv_sec = 0; 
	  Timeout.tv_usec = 0; 
	 
	  // Add this structure to our cleanup base to be cleaned up synchronously 
	  // TODO: Probably not the best way to cleanup and event, but it'l work for the purposes of illustration. 
	  // 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. 
	  myStruct->cleanup = evtimer_new(Base_Primary, connection_free, (void *)myStruct); 
	  evtimer_add(myStruct->cleanup, &Timeout); 
	 
	  //printf("http_request_done, we put our custom strucutre into a cleanup event to be freed!\n"); 
	} 
	 
	int http_req(char *uri) { 
	 
	  // Allocate our custom struture 
	  my_struct_t *myStruct = malloc(sizeof(my_struct_t)); 
	 
	  // Create our EVHTP connection and request 
	  myStruct->uri = evhttp_uri_parse(uri); 
	  myStruct->conn = evhttp_connection_base_new(Base_Primary, NULL, uri, 80); 
	  myStruct->req = evhttp_request_new(http_request_done, myStruct); 
	  evhttp_add_header(evhttp_request_get_output_headers(myStruct->req), "Host", "localhost"); 
	  evhttp_add_header(evhttp_request_get_output_headers(myStruct->req), "Connection", "close"); 
	  evhttp_make_request(myStruct->conn, myStruct->req, EVHTTP_REQ_GET, uri); 
	  evhttp_connection_set_timeout(myStruct->req->evcon, 2); 
	  return 1; 
	} 
	 
	 
	// Define our primary function 
	int main(int argc, char *argv[]) { 
	 
	  // Initialize our bases 
	  Base_Primary = event_base_new(); 
	 
	  char filename[] = "/tmp/50000.txt"; //文件名 
	  FILE *fp;  
	  char StrLine[1024];             //每行最大读取的字符数 
	  char *host; 
	  if((fp = fopen(filename,"r")) == NULL) //判断文件是否存在及可读 
	  {  
	    printf("error!");  
	    return -1;  
	  }  
	 
	  while (!feof(fp))  
	  {  
	    fgets(StrLine,1024,fp);  //读取一行 
	    host = StrLine; 
	    host = trimwhitespace(host); 
	    //printf("%s", host); //输出 
	    http_req(host); 
	  } 
	  fclose(fp);   
	 
	  // 
	  //event_base_loop(Base_Primary); 
	  event_base_dispatch(Base_Primary); 
	 
	  // Free our primary base 
	  event_base_free(Base_Primary); 
	  return 1; 
	}

文章地址:

转载随意^^请带上本文地址!