设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP里Libevent HTTP客户端实现程序

发布时间:2022-02-23 15:02 所属栏目:121 来源:互联网
导读:下面来给各位介绍一段用php实现的Libevent HTTP客户端实现程序,有需要了解的朋友可与小编一起来学习一下. php Libevent HTTP,代码如下: ?php //请求完成回调 function _request_handler($req, $base) { global $pend_req; //echo __FUNCTION__, PHP_EOL; if
  下面来给各位介绍一段用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;
  }

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读