blob: 0a3b090ef356bc11522cd71d963486325c79b56f [file] [log] [blame]
Mark Slee6e536442006-06-30 18:28:50 +00001<?php
2
3/**
4 * Sockets implementation of the TTransport interface.
5 *
6 * @package thrift.transport
7 * @author Mark Slee <mcslee@facebook.com>
8 */
9class TSocket extends TTransport {
10
11 /**
12 * Handle to PHP socket
13 *
14 * @var resource
15 */
16 private $handle_ = null;
17
18 /**
19 * Remote hostname
20 *
21 * @var string
22 */
23 private $host_ = 'localhost';
24
25 /**
26 * Remote port
27 *
28 * @var int
29 */
30 private $port_ = '9090';
31
32 /**
33 * Persistent socket or plain?
34 *
35 * @var bool
36 */
37 private $persist_ = false;
38
39 /**
40 * Socket constructor
41 *
42 * @param string $host Remote hostname
43 * @param int $port Remote port
44 * @param bool $persist Whether to use a persistent socket
45 */
46 public function __construct($host='localhost', $port=9090, $persist=false) {
47 $this->host_ = $host;
48 $this->port_ = $port;
49 $this->persist_ = $persist;
50 }
51
52 /**
53 * Tests whether this is open
54 *
55 * @return bool true if the socket is open
56 */
57 public function isOpen() {
58 return is_resource($this->handle_);
59 }
60
61 /**
62 * Connects the socket.
63 */
64 public function open() {
65 if ($this->persist_) {
66 $this->handle_ = pfsockopen($this->host_, $this->port_);
67 } else {
68 $this->handle_ = fsockopen($this->host_, $this->port_);
69 }
70 if ($this->handle_ === FALSE) {
71 throw new Exception('TSocket: Could not connect to '.
72 $this->host_.':'.$this->port_);
73 }
74 }
75
76 /**
77 * Closes the socket
78 */
79 public function close() {
80 if (!$this->persist_) {
81 fclose($this->handle_);
82 }
83 }
84
85 /**
86 * Uses stream get contents to do the reading
87 */
88 public function readAll($len) {
89 return stream_get_contents($this->handle_, $len);
90 }
91
92 /**
93 * Read from the socket
94 */
95 public function read($len) {
96 $data = fread($this->handle_, 1);
97 if ($data === FALSE) {
98 throw new Exception('TSocket: Could not read '.$len.' bytes from '.
99 $this->host_.':'.$this->port_);
100 }
101 return $data;
102 }
103
104 /**
105 * Write to the socket.
106 */
107 public function write($buf) {
108 while (!empty($buf)) {
109 $got = fwrite($this->handle_, $buf);
110 if ($got == false) {
111 throw new Exception('TSocket: Could not write '.strlen($buf).' bytes '.
112 $this->host_.':'.$this->port_);
113 }
114 $buf = substr($buf, $got);
115 }
116 }
117
118 /**
119 * Flush output to the socket.
120 */
121 public function flush() {
122 fflush($this->handle_);
123 }
124}
125
126?>