PHP中Libevent HTTP客户端实现程序
发布:smiling 来源: PHP粉丝网 添加日期:2015-04-15 14:17:51 浏览: 评论:0
下面来给各位介绍一段用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.phpfensi.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);
- //开源软件:phpfensi.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;
- }
Tags: Libevent HTTP客户端
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)