PHP中Libevent HTTP客户端实现程序
程序员文章站
2022-04-22 23:41:44
...
下面来给各位介绍一段用php实现的Libevent HTTP客户端实现程序,有需要了解的朋友可与小编一起来学习一下.
php Libevent HTTP,代码如下:
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#include #include #include #include #include #include #include #include #include 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; }
文章地址:
转载随意^^请带上本文地址!
推荐阅读
-
php下HTTP Response中的Chunked编码实现方法
-
php模拟asp中的XmlHttpRequest实现http请求的代码
-
http-新浪云存储中HTTP Request Header(Authorization)方式PHP实现?
-
php中数组遍历循环实现程序_PHP教程
-
可用于实现纯异步PHP程序:php_http_parser
-
PHP中24小时计时法时间实现程序_PHP教程
-
Redis3.0集群crc16算法php客户端实现方法(php获得redis3.0集群中redis数据所在的redis分区插槽,并根据分区插槽取得分区所在redis服务器地址)
-
如何在php服务器程序中实现对POST的结果返回
-
PHP 中实现Timer功能使用pcntl和libevent
-
用PHP实现动态产生XML文件以及从XML文件中抽取数据转化成HTML的小程序。。。不用DOM的。。