Source

pecl-event / examples / httpv0client.php

<?php

/* Read callback */
function readcb($bev, $base) {
	$input = $bev->getInput();

	while (($n = $input->remove($buf, 1024)) > 0) {
		echo $buf;
	}
}

/* Event callback */
function eventcb($bev, $events, $base) {
	if ($events & EventBufferEvent::CONNECTED) {
		echo "Connected.\n";
	} elseif ($events & (EventBufferEvent::ERROR | EventBufferEvent::EOF)) {
		if ($events & EventBufferEvent::ERROR) {
			echo "DNS error: ", $bev->getDnsErrorString(), PHP_EOL;
		}

		echo "Closing\n";
		$base->exit();
		exit("Done\n");
	}
}

if ($argc != 3) {
	echo <<<EOS
Trivial HTTP 0.x client
Syntax: php {$argv[0]} [hostname] [resource]
Example: php {$argv[0]} www.google.com /
EOS;
	exit();
}

$base = new EventBase();

$dns_base = new EventDnsBase($base, TRUE); // We'll use async DNS resolving
if (!$dns_base) {
	exit("Failed to init DNS Base\n");
}

$bev = new EventBufferEvent($base, /* use internal socket */ NULL,
	EventBufferEvent::OPT_CLOSE_ON_FREE | EventBufferEvent::OPT_DEFER_CALLBACKS);
if (!$bev) {
	exit("Failed creating bufferevent socket\n");
}

$bev->setCallbacks("readcb", /* writecb */ NULL, "eventcb", $base);
$bev->enable(Event::READ | Event::WRITE);

$output = $bev->getOutput();
if (!$output->add(
	"GET {$argv[2]} HTTP/1.0\r\n".
	"Host: {$argv[1]}\r\n".
	"Connection: Close\r\n\r\n"
)) {
	exit("Failed adding request to output buffer\n");
}

if (!$bev->connectHost($dns_base, $argv[1], 80, EventUtil::AF_UNSPEC)) {
	exit("Can't connect to host {$argv[1]}\n");
}

$base->dispatch();
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.