Source

pecl-event / examples / listener.php

Diff from to

File examples/listener.php

  * 3) start typing. The server should repeat the input.
  */
 
+class MyListenerConnection {
+	private $bev, $base;
+
+	public function __destruct() {
+		$this->bev->free();
+	}
+
+	public function __construct($base, $fd) {
+		$this->base = $base;
+
+		$this->bev = new EventBufferEvent($base, $fd, EventBufferEvent::OPT_CLOSE_ON_FREE);
+
+		$this->bev->setCallbacks(array($this, "echoReadCallback"), NULL,
+			array($this, "echoEventCallback"), NULL);
+
+		if (!$this->bev->enable(Event::READ)) {
+			echo "Failed to enable READ\n";
+			return;
+		}
+	}
+
+	public function echoReadCallback($bev, $ctx) {
+		// Copy all the data from the input buffer to the output buffer
+		
+		// Variant #1
+		$bev->output->addBuffer($bev->input);
+
+		/* Variant #2 */
+		/*
+		$input	= $bev->getInput();
+		$output = $bev->getOutput();
+		$output->addBuffer($input);
+		*/
+	}
+
+	public function echoEventCallback($bev, $events, $ctx) {
+		if ($events & EventBufferEvent::ERROR) {
+			echo "Error from bufferevent\n";
+		}
+
+		if ($events & (EventBufferEvent::EOF | EventBufferEvent::ERROR)) {
+			//$bev->free();
+			$this->__destruct();
+		}
+	}
+}
+
 class MyListener {
 	public $base,
 		$listener,
-		$bev,
 		$socket;
+	private $conn = array();
+
+	public function __destruct() {
+		foreach ($this->conn as &$c) $c = NULL;
+	}
 
 	public function __construct($port) {
 		$this->base = new EventBase();
 			exit(1);
 		}
 		$this->listener = new EventListener($this->base,
-			array($this, "accept_conn_cb"), $this->base,
+			array($this, "acceptConnCallback"), $this->base,
 			EventListener::OPT_CLOSE_ON_FREE | EventListener::OPT_REUSEABLE,
 			-1, $this->socket);
 		 */
 
-//		Variant #2
+		// Variant #2
  		$this->listener = new EventListener($this->base,
- 			array($this, "accept_conn_cb"), $this->base,
+ 			array($this, "acceptConnCallback"), $this->base,
  			EventListener::OPT_CLOSE_ON_FREE | EventListener::OPT_REUSEABLE, -1,
  			"0.0.0.0:$port");
 
 	}
 
 	// This callback is invoked when there is data to read on $bev
-	public function echo_read_cb($bev, $ctx) {
-		// Copy all the data from the input buffer to the output buffer
-		
-		// Variant #1
-		$bev->output->addBuffer($bev->input);
-
-		/* Variant #2 */
-		/*
-		$input	= $bev->getInput();
-		$output = $bev->getOutput();
-		$output->addBuffer($input);
-		*/
-	}
-
-	public function echo_event_cb($bev, $events, $ctx) {
-		if ($events & EventBufferEvent::ERROR)
-			echo "Error from bufferevent\n";
-
-		if ($events & (EventBufferEvent::EOF | EventBufferEvent::ERROR)) {
-			$bev->free();
-		}
-	}
-
-	public function accept_conn_cb($listener, $fd, $address, $ctx) {
-		/* We got a new connection! Set up a bufferevent for it. */
-		//$base = $ctx;
-		//$base = $listener->getBase();
+	public function acceptConnCallback($listener, $fd, $address, $ctx) {
+		// We got a new connection! Set up a bufferevent for it. */
 		$base = $this->base;
-
-		$this->bev = new EventBufferEvent($base, $fd, EventBufferEvent::OPT_CLOSE_ON_FREE);
-
-		$this->bev->setCallbacks(array($this, "echo_read_cb"), NULL, array($this, "echo_event_cb"), NULL);
-
-		if (!$this->bev->enable(Event::READ | Event::WRITE)) {
-			echo "Failed to enable READ | WRITE\n";
-			exit();
-		}
+		$this->conn[] = new MyListenerConnection($base, $fd);
 	}
 
 	public function accept_error_cb($listener, $ctx) {
-		//$base = $listener->getBase();
 		$base = $this->base;
 
 		fprintf(STDERR, "Got an error %d (%s) on the listener. "
 	$port = (int) $argv[1];
 }
 if ($port <= 0 || $port > 65535) {
-	puts("Invalid port");
-	return 1;
+	exit("Invalid port");
 }
 
 $l = new MyListener($port);