加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

在 PHP 中实现了 Libevent 的 WebHTTP 客户端模块

发布时间:2023-09-13 13:58:45 所属栏目:PHP教程 来源:
导读:下面来给各位介绍一段用php实现的Libevent HTTP客户端实现程序,有需要了解的朋友可与小编一起来学习一下.

php Libevent HTTP,代码如下:

<?php
//请求完成回调
function _request_handler($req, $base) {
下面来给各位介绍一段用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.Cuoxin.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); 
  //开源软件:Cuoxin.com 
  $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'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; 
}

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章