Heim > php教程 > php手册 > Hauptteil

PHP中Libevent HTTP客户端实现程序

WBOY
Freigeben: 2016-05-26 08:19:40
Original
1885 Leute haben es durchsucht

下面来给各位介绍一段用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(); 
	 
Nach dem Login kopieren

c语言版,代码如下:

#include <stdio.h> 
	#include <string.h> 
	#include <ctype.h> 
	#include <stdlib.h> 
	#include <signal.h> 
	#include <unistd.h> 
	#include <evhttp.h> 
	#include <event2/event.h> 
	#include <event2/http.h> 
	#include <event2/bufferevent.h> 
	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&#39;s FD would have been closed when the HTTP request ended and the ->req object would have been free&#39;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&#39;l work for the purposes of illustration. 
	  // This way would ensure no race conditions exist, but it&#39;s probably not the most efficient depending on how many requests, etc we&#39;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; 
	}
Nach dem Login kopieren

文章地址:

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

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage