php的socket编程方式有多种方式,本文只介绍以下三种
- php自带select()方法
- 基于pecl的event库(linux需要安装libevent开发库)
基于pecl的libevent库(linux需要安装libevent开发库)
本文只介绍event的实现
event是PECL在libevent基础上实现基于事件驱动的扩展库,它有着高效并发处理能力。所以本文基于它来实现一个H5的websocket的DEMO,请不要用于生产环境。
首先定义一个基础事件管理类:
class MyEvent
{
protected $eventBase;
protected $allEvents = [];
public function __construct()
{
if (!extension_loaded('event')) {
echo 'event extension is require' . PHP_EOL;
exit(250);
}
$this->eventBase = new \EventBase();
}
public function add($fd, $flag, $func, $args = array())
{
$fd_key = (int)$fd;
$event = new \Event($this->eventBase, $fd, $flag | \Event::PERSIST, $func, $fd);
if (!$event || !$event->add()) {
return false;
}
$this->allEvents[$fd_key][$flag] = $event;
return true;
}
public function del($fd, $flag)
{
$fd_key = (int)$fd;
if (isset($this->allEvents[$fd_key][$flag])) {
$this->allEvents[$fd_key][$flag]->del();
unset($this->allEvents[$fd_key][$flag]);
}
}
public function loop()
{
$this->eventBase->loop();
}
}
socket类如下:
class Socket
{
const READ_BUFFER_SIZE = 65535;
protected $mainSocket;
protected $context;
protected $socketName;
protected static $connectPools = [];
protected $sendBuffer;
public $reusePort = false;
protected $eventBase;
protected $event;
public function __construct($socketName, $context = [])
{
$this->socketName = $socketName;