首页 >php教程 >php手册 >PHP中Libevent HTTP客户端实现程序

PHP中Libevent HTTP客户端实现程序

WBOY
WBOY原创
2016-05-26 08:19:401892浏览

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

php Libevent HTTP,代码如下:

<?php 
	//请求完成回调 
	function _request_handler($req, $base) { 
	  global $pend_req; 
	  //echo __FUNCTION__, PHP_EOL; 
	 
	  if (is_null($req)) { 
	    //echo "Timed out\n"; 
	  } else { 
	    $response_code = $req->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 ade979de5fc0e1ca0540f360a64c230b 
	#include bbed3fed50f96ac7490cfc6a498c4bc5 
	#include 35a6225f6eb7f3c9d2345d8bc5e64e51 
	#include 8e359799bdf1a571032ba13cc96acda9 
	#include 00191394db1b73bf17e722f3018cddd0 
	#include f55648144b4a1c5cce7ad2f6519be0f3 
	#include c1fd870ac911b4c84310210b2f73406a 
	#include 9f82e380163b235007e7ab1201ffa1f7 
	#include 41b9eef9e46f9f21eff02544d96f564c 
	#include 699b0efa4187cfc0e2fc6447b71426b1 
	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; 
	}

文章地址:

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn