Sivo 悉见

PHP WebSocket 客户端类 WebSocketClient

匿名 · 更新于 2018/3/24

摘要: PHP WebSocket 客户端类 WebSocketClient
<?php
namespace Common\Library;

// ini_set('display_errors', 1); // error_reporting(E_ALL);

/**   Very basic websocket client.   Supporting draft hybi-10.       @author Simon Samtleben <web@lemmingzshadow.net>   @version 2011-10-18  /

class WebSocketClient { private $_host; private $_port; private $_path; private $_origin; private $_Socket = null; private $_connected = false;

<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">public</span></span>&nbsp;<span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">function</span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&nbsp;</span><span class="hljs-title" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(239, 239, 143);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-title" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">__construct</span></span></span><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">()</span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&nbsp;</span></span>{&nbsp;}

<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">public</span></span>&nbsp;<span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">function</span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&nbsp;</span><span class="hljs-title" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(239, 239, 143);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-title" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">__destruct</span></span></span><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">()</span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">
</span></span>{
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;disconnect();
}

<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">public</span></span>&nbsp;<span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">function</span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&nbsp;</span><span class="hljs-title" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(239, 239, 143);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-title" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">sendData</span></span></span><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">($data,&nbsp;$type&nbsp;=&nbsp;</span></span><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;text&#39;</span></span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">,&nbsp;$masked&nbsp;=&nbsp;true)</span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">
</span></span>{
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">if</span></span>(<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_connected&nbsp;===&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">false</span></span>)
	{
		trigger_error(<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&quot;Not&nbsp;connected&quot;</span></span>,&nbsp;E_USER_WARNING);
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">return</span></span>&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">false</span></span>;
	}
	
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">if</span></span>(&nbsp;!is_string($data))&nbsp;{
		trigger_error(<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&quot;Not&nbsp;a&nbsp;string&nbsp;data&nbsp;was&nbsp;given.&quot;</span></span>,&nbsp;E_USER_WARNING);
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">return</span></span>&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">false</span></span>;		
	}
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">if</span></span>&nbsp;(strlen($data)&nbsp;==&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">0</span></span>)
	{
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">return</span></span>&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">false</span></span>;
	}
	$res&nbsp;=&nbsp;@fwrite(<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_Socket,&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_hybi10Encode($data,&nbsp;$type,&nbsp;$masked));
	
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">if</span></span>($res&nbsp;===&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">0</span></span>&nbsp;||&nbsp;$res&nbsp;===&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">false</span></span>)
	{
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">return</span></span>&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">false</span></span>;
	}		
	$buffer&nbsp;=&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;&nbsp;&#39;</span></span>;
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">while</span></span>($buffer&nbsp;!==&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;&#39;</span></span>)
	{			
		$buffer&nbsp;=&nbsp;fread(<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_Socket,&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">512</span></span>);
	}
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">return</span></span>&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">true</span></span>;
}

<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">public</span></span>&nbsp;<span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">function</span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&nbsp;</span><span class="hljs-title" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(239, 239, 143);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-title" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">connect</span></span></span><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">($host,&nbsp;$port,&nbsp;$path,&nbsp;$origin&nbsp;=&nbsp;false)</span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">
</span></span>{
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_host&nbsp;=&nbsp;$host;
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_port&nbsp;=&nbsp;$port;
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_path&nbsp;=&nbsp;$path;
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_origin&nbsp;=&nbsp;$origin;
	
	$key&nbsp;=&nbsp;base64_encode(<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_generateRandomString(<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">16</span></span>,&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">false</span></span>,&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">true</span></span>));				
	$header&nbsp;=&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&quot;GET&nbsp;&quot;</span></span>&nbsp;.&nbsp;$path&nbsp;.&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&quot;&nbsp;HTTP/1.1\r\n&quot;</span></span>;
	$header.=&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&quot;Host:&nbsp;&quot;</span></span>.$host.<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&quot;:&quot;</span></span>.$port.&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&quot;\r\n&quot;</span></span>;
	$header.=&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&quot;Upgrade:&nbsp;websocket\r\n&quot;</span></span>;
	$header.=&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&quot;Connection:&nbsp;Upgrade\r\n&quot;</span></span>;
	<span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(127, 159, 127);"><span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">//$header.=&nbsp;&quot;Sec-WebSocket-Extensions:&nbsp;permessage-deflate;&nbsp;client_max_window_bits\r\n&quot;;</span></span>
	$header.=&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&quot;Sec-WebSocket-Key:&nbsp;&quot;</span></span>&nbsp;.&nbsp;$key&nbsp;.&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&quot;\r\n&quot;</span></span>;

	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">if</span></span>($origin&nbsp;!==&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">false</span></span>)
	{
		$header.=&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&quot;Sec-WebSocket-Origin:&nbsp;&quot;</span></span>&nbsp;.&nbsp;$origin&nbsp;.&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&quot;\r\n&quot;</span></span>;
	}
	$header.=&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&quot;Sec-WebSocket-Version:&nbsp;13\r\n\r\n&quot;</span></span>;
	
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_Socket&nbsp;=&nbsp;fsockopen($host,&nbsp;$port,&nbsp;$errno,&nbsp;$errstr,&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">2</span></span>);
	socket_set_timeout(<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_Socket,&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">2</span></span>,&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">10000</span></span>);
	<span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(127, 159, 127);"><span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">//socket_write($this-&gt;_Socket,&nbsp;$header);</span></span>
	$res&nbsp;=&nbsp;@fwrite(<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_Socket,&nbsp;$header);
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">if</span></span>(&nbsp;$res&nbsp;===&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">false</span></span>&nbsp;){
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">echo</span></span>&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&quot;fwrite&nbsp;false&nbsp;\n&quot;</span></span>;
	}
	
	$response&nbsp;=&nbsp;@fread(<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_Socket,&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">1500</span></span>);
	<span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(127, 159, 127);"><span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">//$response&nbsp;=&nbsp;socket_read($this-&gt;_Socket);</span></span>
	preg_match(<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;#Sec-WebSocket-Accept:\s(.*)$#mU&#39;</span></span>,&nbsp;$response,&nbsp;$matches);
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">if</span></span>&nbsp;($matches)&nbsp;{
		$keyAccept&nbsp;=&nbsp;trim($matches[<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">1</span></span>]);
		$expectedResonse&nbsp;=&nbsp;base64_encode(pack(<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;H*&#39;</span></span>,&nbsp;sha1($key&nbsp;.&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;258EAFA5-E914-47DA-95CA-C5AB0DC85B11&#39;</span></span>)));
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_connected&nbsp;=&nbsp;($keyAccept&nbsp;===&nbsp;$expectedResonse)&nbsp;?&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">true</span></span>&nbsp;:&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">false</span></span>;
	}
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">return</span></span>&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_connected;
}

<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">public</span></span>&nbsp;<span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">function</span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&nbsp;</span><span class="hljs-title" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(239, 239, 143);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-title" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">checkConnection</span></span></span><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">()</span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">
</span></span>{
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_connected&nbsp;=&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">false</span></span>;
	
	<span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(127, 159, 127);"><span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">//&nbsp;send&nbsp;ping:</span></span>
	$data&nbsp;=&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;ping?&#39;</span></span>;
	@fwrite(<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_Socket,&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_hybi10Encode($data,&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;ping&#39;</span></span>,&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">true</span></span>));
	$response&nbsp;=&nbsp;@fread(<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_Socket,&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">300</span></span>);
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">if</span></span>(<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">empty</span></span>($response))
	{			
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">return</span></span>&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">false</span></span>;
	}
	$response&nbsp;=&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_hybi10Decode($response);
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">if</span></span>(!is_array($response))
	{			
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">return</span></span>&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">false</span></span>;
	}
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">if</span></span>(!<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">isset</span></span>($response[<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;type&#39;</span></span>])&nbsp;||&nbsp;$response[<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;type&#39;</span></span>]&nbsp;!==&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;pong&#39;</span></span>)
	{			
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">return</span></span>&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">false</span></span>;
	}
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_connected&nbsp;=&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">true</span></span>;
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">return</span></span>&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">true</span></span>;
}


<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">public</span></span>&nbsp;<span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">function</span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&nbsp;</span><span class="hljs-title" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(239, 239, 143);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-title" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">disconnect</span></span></span><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">()</span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">
</span></span>{
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_connected&nbsp;=&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">false</span></span>;
	is_resource(<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_Socket)&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">and</span></span>&nbsp;fclose(<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_Socket);
}

<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">public</span></span>&nbsp;<span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">function</span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&nbsp;</span><span class="hljs-title" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(239, 239, 143);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-title" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">reconnect</span></span></span><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">()</span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">
</span></span>{
	sleep(<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">10</span></span>);
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_connected&nbsp;=&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">false</span></span>;
	fclose(<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_Socket);
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;connect(<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_host,&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_port,&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_path,&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;_origin);		
}

<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">private</span></span>&nbsp;<span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">function</span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&nbsp;</span><span class="hljs-title" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(239, 239, 143);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-title" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">_generateRandomString</span></span></span><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">($length&nbsp;=&nbsp;</span></span><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">10</span></span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">,&nbsp;$addSpaces&nbsp;=&nbsp;true,&nbsp;$addNumbers&nbsp;=&nbsp;true)</span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">
</span></span>{&nbsp;&nbsp;
	$characters&nbsp;=&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!&quot;ยง$%&amp;/()=[]{}&#39;</span></span>;
	$useChars&nbsp;=&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">array</span></span>();
	<span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(127, 159, 127);"><span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">//&nbsp;select&nbsp;some&nbsp;random&nbsp;chars:&nbsp;&nbsp;&nbsp;&nbsp;</span></span>
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">for</span></span>($i&nbsp;=&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">0</span></span>;&nbsp;$i&nbsp;&lt;&nbsp;$length;&nbsp;$i++)
	{
		$useChars[]&nbsp;=&nbsp;$characters[mt_rand(<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">0</span></span>,&nbsp;strlen($characters)<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">-1</span></span>)];
	}
	<span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(127, 159, 127);"><span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">//&nbsp;add&nbsp;spaces&nbsp;and&nbsp;numbers:</span></span>
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">if</span></span>($addSpaces&nbsp;===&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">true</span></span>)
	{
		array_push($useChars,&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;&nbsp;&#39;</span></span>,&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;&nbsp;&#39;</span></span>,&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;&nbsp;&#39;</span></span>,&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;&nbsp;&#39;</span></span>,&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;&nbsp;&#39;</span></span>,&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;&nbsp;&#39;</span></span>);
	}
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">if</span></span>($addNumbers&nbsp;===&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">true</span></span>)
	{
		array_push($useChars,&nbsp;rand(<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">0</span></span>,<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">9</span></span>),&nbsp;rand(<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">0</span></span>,<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">9</span></span>),&nbsp;rand(<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">0</span></span>,<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">9</span></span>));
	}
	shuffle($useChars);
	$randomString&nbsp;=&nbsp;trim(implode(<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;&#39;</span></span>,&nbsp;$useChars));
	$randomString&nbsp;=&nbsp;substr($randomString,&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">0</span></span>,&nbsp;$length);
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">return</span></span>&nbsp;$randomString;
}

<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">private</span></span>&nbsp;<span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">function</span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&nbsp;</span><span class="hljs-title" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(239, 239, 143);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-title" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">_hybi10Encode</span></span></span><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">($payload,&nbsp;$type&nbsp;=&nbsp;</span></span><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;text&#39;</span></span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">,&nbsp;$masked&nbsp;=&nbsp;true)</span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">
</span></span>{
	$frameHead&nbsp;=&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">array</span></span>();
	$frame&nbsp;=&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;&#39;</span></span>;
	$payloadLength&nbsp;=&nbsp;strlen($payload);
	
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">switch</span></span>($type)
	{		
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">case</span></span>&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;text&#39;</span></span>:
			<span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(127, 159, 127);"><span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">//&nbsp;first&nbsp;byte&nbsp;indicates&nbsp;FIN,&nbsp;Text-Frame&nbsp;(10000001):</span></span>
			$frameHead[<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">0</span></span>]&nbsp;=&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">129</span></span>;				
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">break</span></span>;			
	
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">case</span></span>&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;close&#39;</span></span>:
			<span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(127, 159, 127);"><span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">//&nbsp;first&nbsp;byte&nbsp;indicates&nbsp;FIN,&nbsp;Close&nbsp;Frame(10001000):</span></span>
			$frameHead[<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">0</span></span>]&nbsp;=&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">136</span></span>;
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">break</span></span>;
	
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">case</span></span>&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;ping&#39;</span></span>:
			<span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(127, 159, 127);"><span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">//&nbsp;first&nbsp;byte&nbsp;indicates&nbsp;FIN,&nbsp;Ping&nbsp;frame&nbsp;(10001001):</span></span>
			$frameHead[<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">0</span></span>]&nbsp;=&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">137</span></span>;
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">break</span></span>;
	
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">case</span></span>&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;pong&#39;</span></span>:
			<span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(127, 159, 127);"><span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">//&nbsp;first&nbsp;byte&nbsp;indicates&nbsp;FIN,&nbsp;Pong&nbsp;frame&nbsp;(10001010):</span></span>
			$frameHead[<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">0</span></span>]&nbsp;=&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">138</span></span>;
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">break</span></span>;
	}
	
	<span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(127, 159, 127);"><span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">//&nbsp;set&nbsp;mask&nbsp;and&nbsp;payload&nbsp;length&nbsp;(using&nbsp;1,&nbsp;3&nbsp;or&nbsp;9&nbsp;bytes)&nbsp;</span></span>
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">if</span></span>($payloadLength&nbsp;&gt;&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">65535</span></span>)
	{
		$payloadLengthBin&nbsp;=&nbsp;str_split(sprintf(<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;%064b&#39;</span></span>,&nbsp;$payloadLength),&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">8</span></span>);
		$frameHead[<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">1</span></span>]&nbsp;=&nbsp;($masked&nbsp;===&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">true</span></span>)&nbsp;?&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">255</span></span>&nbsp;:&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">127</span></span>;
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">for</span></span>($i&nbsp;=&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">0</span></span>;&nbsp;$i&nbsp;&lt;&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">8</span></span>;&nbsp;$i++)
		{
			$frameHead[$i+<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">2</span></span>]&nbsp;=&nbsp;bindec($payloadLengthBin[$i]);
		}
		<span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(127, 159, 127);"><span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">//&nbsp;most&nbsp;significant&nbsp;bit&nbsp;MUST&nbsp;be&nbsp;0&nbsp;(close&nbsp;connection&nbsp;if&nbsp;frame&nbsp;too&nbsp;big)</span></span>
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">if</span></span>($frameHead[<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">2</span></span>]&nbsp;&gt;&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">127</span></span>)
		{
			<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">$this</span></span>-&gt;close(<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">1004</span></span>);
			<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">return</span></span>&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">false</span></span>;
		}
	}
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">elseif</span></span>($payloadLength&nbsp;&gt;&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">125</span></span>)
	{
		$payloadLengthBin&nbsp;=&nbsp;str_split(sprintf(<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;%016b&#39;</span></span>,&nbsp;$payloadLength),&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">8</span></span>);
		$frameHead[<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">1</span></span>]&nbsp;=&nbsp;($masked&nbsp;===&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">true</span></span>)&nbsp;?&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">254</span></span>&nbsp;:&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">126</span></span>;
		$frameHead[<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">2</span></span>]&nbsp;=&nbsp;bindec($payloadLengthBin[<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">0</span></span>]);
		$frameHead[<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">3</span></span>]&nbsp;=&nbsp;bindec($payloadLengthBin[<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">1</span></span>]);
	}
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">else</span></span>
	{
		$frameHead[<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">1</span></span>]&nbsp;=&nbsp;($masked&nbsp;===&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">true</span></span>)&nbsp;?&nbsp;$payloadLength&nbsp;+&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">128</span></span>&nbsp;:&nbsp;$payloadLength;
	}

	<span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(127, 159, 127);"><span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">//&nbsp;convert&nbsp;frame-head&nbsp;to&nbsp;string:</span></span>
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">foreach</span></span>(array_keys($frameHead)&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">as</span></span>&nbsp;$i)
	{
		$frameHead[$i]&nbsp;=&nbsp;chr($frameHead[$i]);
	}
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">if</span></span>($masked&nbsp;===&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">true</span></span>)
	{
		<span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(127, 159, 127);"><span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">//&nbsp;generate&nbsp;a&nbsp;random&nbsp;mask:</span></span>
		$mask&nbsp;=&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">array</span></span>();
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">for</span></span>($i&nbsp;=&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">0</span></span>;&nbsp;$i&nbsp;&lt;&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">4</span></span>;&nbsp;$i++)
		{
			$mask[$i]&nbsp;=&nbsp;chr(rand(<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">0</span></span>,&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">255</span></span>));
		}
		
		$frameHead&nbsp;=&nbsp;array_merge($frameHead,&nbsp;$mask);			
	}						
	$frame&nbsp;=&nbsp;implode(<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;&#39;</span></span>,&nbsp;$frameHead);

	<span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(127, 159, 127);"><span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">//&nbsp;append&nbsp;payload&nbsp;to&nbsp;frame:</span></span>
	$framePayload&nbsp;=&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">array</span></span>();	
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">for</span></span>($i&nbsp;=&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">0</span></span>;&nbsp;$i&nbsp;&lt;&nbsp;$payloadLength;&nbsp;$i++)
	{		
		$frame&nbsp;.=&nbsp;($masked&nbsp;===&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">true</span></span>)&nbsp;?&nbsp;$payload[$i]&nbsp;^&nbsp;$mask[$i&nbsp;%&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">4</span></span>]&nbsp;:&nbsp;$payload[$i];
	}

	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">return</span></span>&nbsp;$frame;
}

<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">private</span></span>&nbsp;<span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">function</span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&nbsp;</span><span class="hljs-title" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(239, 239, 143);"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-title" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">_hybi10Decode</span></span></span><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span class="hljs-params" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">($data)</span></span></span><span class="hljs-function" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">
</span></span>{
	$payloadLength&nbsp;=&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;&#39;</span></span>;
	$mask&nbsp;=&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;&#39;</span></span>;
	$unmaskedPayload&nbsp;=&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;&#39;</span></span>;
	$decodedData&nbsp;=&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">array</span></span>();
	
	<span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(127, 159, 127);"><span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">//&nbsp;estimate&nbsp;frame&nbsp;type:</span></span>
	$firstByteBinary&nbsp;=&nbsp;sprintf(<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;%08b&#39;</span></span>,&nbsp;ord($data[<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">0</span></span>]));		
	$secondByteBinary&nbsp;=&nbsp;sprintf(<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;%08b&#39;</span></span>,&nbsp;ord($data[<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">1</span></span>]));
	$opcode&nbsp;=&nbsp;bindec(substr($firstByteBinary,&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">4</span></span>,&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">4</span></span>));
	$isMasked&nbsp;=&nbsp;($secondByteBinary[<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">0</span></span>]&nbsp;==&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;1&#39;</span></span>)&nbsp;?&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">true</span></span>&nbsp;:&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">false</span></span>;
	$payloadLength&nbsp;=&nbsp;ord($data[<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">1</span></span>])&nbsp;&amp;&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">127</span></span>;		
	
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">switch</span></span>($opcode)
	{
		<span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(127, 159, 127);"><span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">//&nbsp;text&nbsp;frame:</span></span>
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">case</span></span>&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">1</span></span>:
			$decodedData[<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;type&#39;</span></span>]&nbsp;=&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;text&#39;</span></span>;				
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">break</span></span>;
	
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">case</span></span>&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">2</span></span>:
			$decodedData[<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;type&#39;</span></span>]&nbsp;=&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;binary&#39;</span></span>;
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">break</span></span>;
		
		<span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(127, 159, 127);"><span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">//&nbsp;connection&nbsp;close&nbsp;frame:</span></span>
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">case</span></span>&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">8</span></span>:
			$decodedData[<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;type&#39;</span></span>]&nbsp;=&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;close&#39;</span></span>;
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">break</span></span>;
		
		<span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(127, 159, 127);"><span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">//&nbsp;ping&nbsp;frame:</span></span>
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">case</span></span>&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">9</span></span>:
			$decodedData[<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;type&#39;</span></span>]&nbsp;=&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;ping&#39;</span></span>;				
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">break</span></span>;
		
		<span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(127, 159, 127);"><span class="hljs-comment" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">//&nbsp;pong&nbsp;frame:</span></span>
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">case</span></span>&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">10</span></span>:
			$decodedData[<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;type&#39;</span></span>]&nbsp;=&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;pong&#39;</span></span>;
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">break</span></span>;
		
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">default</span></span>:
			<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">return</span></span>&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">false</span></span>;
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">break</span></span>;
	}
	
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">if</span></span>($payloadLength&nbsp;===&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">126</span></span>)
	{
	&nbsp;&nbsp;&nbsp;$mask&nbsp;=&nbsp;substr($data,&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">4</span></span>,&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">4</span></span>);
	&nbsp;&nbsp;&nbsp;$payloadOffset&nbsp;=&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">8</span></span>;
	&nbsp;&nbsp;&nbsp;$dataLength&nbsp;=&nbsp;bindec(sprintf(<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;%08b&#39;</span></span>,&nbsp;ord($data[<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">2</span></span>]))&nbsp;.&nbsp;sprintf(<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;%08b&#39;</span></span>,&nbsp;ord($data[<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">3</span></span>])))&nbsp;+&nbsp;$payloadOffset;
	}
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">elseif</span></span>($payloadLength&nbsp;===&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">127</span></span>)
	{
		$mask&nbsp;=&nbsp;substr($data,&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">10</span></span>,&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">4</span></span>);
		$payloadOffset&nbsp;=&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">14</span></span>;
		$tmp&nbsp;=&nbsp;<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;&#39;</span></span>;
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">for</span></span>($i&nbsp;=&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">0</span></span>;&nbsp;$i&nbsp;&lt;&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">8</span></span>;&nbsp;$i++)
		{
			$tmp&nbsp;.=&nbsp;sprintf(<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;%08b&#39;</span></span>,&nbsp;ord($data[$i+<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">2</span></span>]));
		}
		$dataLength&nbsp;=&nbsp;bindec($tmp)&nbsp;+&nbsp;$payloadOffset;
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">unset</span></span>($tmp);
	}
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">else</span></span>
	{
		$mask&nbsp;=&nbsp;substr($data,&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">2</span></span>,&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">4</span></span>);	
		$payloadOffset&nbsp;=&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">6</span></span>;
		$dataLength&nbsp;=&nbsp;$payloadLength&nbsp;+&nbsp;$payloadOffset;
	}	
	
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">if</span></span>($isMasked&nbsp;===&nbsp;<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">true</span></span>)
	{
		<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">for</span></span>($i&nbsp;=&nbsp;$payloadOffset;&nbsp;$i&nbsp;&lt;&nbsp;$dataLength;&nbsp;$i++)
		{
			$j&nbsp;=&nbsp;$i&nbsp;-&nbsp;$payloadOffset;
			<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">if</span></span>(<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">isset</span></span>($data[$i]))
			{
				$unmaskedPayload&nbsp;.=&nbsp;$data[$i]&nbsp;^&nbsp;$mask[$j&nbsp;%&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">4</span></span>];
			}
		}
		$decodedData[<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;payload&#39;</span></span>]&nbsp;=&nbsp;$unmaskedPayload;
	}
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">else</span></span>
	{
		$payloadOffset&nbsp;=&nbsp;$payloadOffset&nbsp;-&nbsp;<span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(140, 208, 211);"><span class="hljs-number" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">4</span></span>;
		$decodedData[<span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(204, 147, 147);"><span class="hljs-string" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">&#39;payload&#39;</span></span>]&nbsp;=&nbsp;substr($data,&nbsp;$payloadOffset);
	}
	
	<span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(227, 206, 171);"><span class="hljs-keyword" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">return</span></span>&nbsp;$decodedData;
}

}

 

使用示例:

// 使用 WebSocket 通知客户端
		$client = new \Common\Library\WebSocketClient();
		$client->connect($_SERVER['HTTP_HOST'], 943'/');
	
		$payload = json_encode(array(
			'code' => 'xxx',
			'id' => '1'
		));
		$rs = $client->sendData($payload);
	
		if( $rs !== true ){
			echo "sendData error...\n";
		}else{
			echo "ok\n";
		}