首頁 > php教程 > php手册 > 主體

PHP中Libevent HTTP客户端实现程序

WBOY
發布: 2016-05-26 08:19:40
原創
1885 人瀏覽過

下面来给各位介绍一段用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 <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; 
	}
登入後複製

文章地址:

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

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板