李昕樾 發表於 2019-6-17 11:27:00

php socket如何实现长连接

<p><strong>长连接是什么?</strong></p>
<p>&nbsp;</p>
<p>朋友们应该都见过很多在线聊天工具和网页在线聊天的工具。学校内有一种熟悉的功能,如果有人回复你了,网站会马上出现提示,此时你并没有刷新页面;Gmail也有此功能,如果邮箱里收到了新的邮件,网站会马上提醒你,即使你的网页一直未刷新过。说到这里大家肯定不陌生,就是复用一个链接持续不断的进行数据交互。在现下很多互联网业务场景都需要长连接的支持,比如:游戏、聊天、信息推送等等等,这么多类似的功能都离不开长连接。前一章节介绍了php socket通信,本章来介绍一下php socket长连接。</p>
<p><strong>长连接和短链接</strong></p>
<p>短连接一般都是单项请求数据,服务器不能主动把数据“推”想客户端,但有了长连接就好多了,利用后端与前端的技术组合起来,可以实现服务器的“推送信息”功能,如果数据库里面有更新,后端程序可以立即把数据“推送出来”,而不要多次反复请求,多次建立连接,多次断开。</p>
<p>其大概有如下的几种解释:</p>
<ol class=" list-paddingleft-2">
<li>
<p>所谓长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差;所谓短连接指建立SOCKET连接后发送后接收完数据后马上断开连接,一般银行都使用短连接</p>
</li>
<li>
<p>长连接就是指在基于tcp的通讯中,一直保持连接,不管当前是否发送或者接收数据。而短连接就是只有在有数据传输的时候才进行连接,客户-服务器通信/传输数据完毕就关闭连接。</p>
</li>
<li>
<p>通信方式&nbsp;<br>各网元之间共有两种连接方式:长连接和短连接。所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需 要双方发检测包以维持此连接。短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,即每次TCP连接只完成一对 CMPP消息的发送。&nbsp;<br>现阶段,要求ISMG之间必须采用长连接的通信方式,建议SP与ISMG之间采用长连接的通信方式。</p>

</li>
<li>
<p>短连接:比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。长连接:有些服务需要长时间连接到服务器,比如CMPP,一般需要自己做在线维持。</p>

</li>

</ol>
<p><strong>实现socket长连接</strong></p>
<p>每次我们访问PHP脚本的时候,都是当所有的PHP脚本执行完成后,我们才得到返回结果。如果我们需要一个脚本持续的运行,那么我们就要通过php长连接的方式,来达到运行目的。</p>
<p>想要玩长连接就需要跟socket打交道,socket的封装自然是少不的了。下面就通过代码来进行socket长连接。</p>
<p><strong>其实例代码如下:</strong></p>
<table class="syntaxhighlighterphp" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<p class="line number1 index0 alt2">1</p>
<p class="line number2 index1 alt1">2</p>
<p class="line number3 index2 alt2">3</p>
<p class="line number4 index3 alt1">4</p>
<p class="line number5 index4 alt2">5</p>
<p class="line number6 index5 alt1">6</p>
<p class="line number7 index6 alt2">7</p>
<p class="line number8 index7 alt1">8</p>
<p class="line number9 index8 alt2">9</p>
<p class="line number10 index9 alt1">10</p>
<p class="line number11 index10 alt2">11</p>
<p class="line number12 index11 alt1">12</p>
<p class="line number13 index12 alt2">13</p>
<p class="line number14 index13 alt1">14</p>
<p class="line number15 index14 alt2">15</p>
<p class="line number16 index15 alt1">16</p>
<p class="line number17 index16 alt2">17</p>
<p class="line number18 index17 alt1">18</p>
<p class="line number19 index18 alt2">19</p>
<p class="line number20 index19 alt1">20</p>
<p class="line number21 index20 alt2">21</p>
<p class="line number22 index21 alt1">22</p>
<p class="line number23 index22 alt2">23</p>
<p class="line number24 index23 alt1">24</p>
<p class="line number25 index24 alt2">25</p>
<p class="line number26 index25 alt1">26</p>
<p class="line number27 index26 alt2">27</p>
<p class="line number28 index27 alt1">28</p>
<p class="line number29 index28 alt2">29</p>
<p class="line number30 index29 alt1">30</p>
<p class="line number31 index30 alt2">31</p>
<p class="line number32 index31 alt1">32</p>
<p class="line number33 index32 alt2">33</p>
<p class="line number34 index33 alt1">34</p>
<p class="line number35 index34 alt2">35</p>
<p class="line number36 index35 alt1">36</p>
<p class="line number37 index36 alt2">37</p>
<p class="line number38 index37 alt1">38</p>

</td>
<td class="code">
<div class="container">
<p class="line number1 index0 alt2"><code class="php plain">&lt;?php</code></p>
<p class="line number2 index1 alt1"><code class="php variable">$sfd</code> <code class="php plain">= socket_create(AF_INET, SOCK_STREAM, 0);&nbsp; </code></p>
<p class="line number3 index2 alt2"><code class="php plain">socket_bind(</code><code class="php variable">$sfd</code><code class="php plain">, </code><code class="php string">"0.0.0.0"</code><code class="php plain">, 1234);&nbsp; </code></p>
<p class="line number4 index3 alt1"><code class="php plain">socket_listen(</code><code class="php variable">$sfd</code><code class="php plain">, 511);&nbsp; </code></p>
<p class="line number5 index4 alt2"><code class="php plain">socket_set_option(</code><code class="php variable">$sfd</code><code class="php plain">, SOL_SOCKET, SO_REUSEADDR, 1);&nbsp; </code></p>
<p class="line number6 index5 alt1"><code class="php plain">socket_set_nonblock(</code><code class="php variable">$sfd</code><code class="php plain">);&nbsp; </code></p>
<p class="line number7 index6 alt2"><code class="php variable">$rfds</code> <code class="php plain">= </code><code class="php keyword">array</code><code class="php plain">(</code><code class="php variable">$sfd</code><code class="php plain">);&nbsp; </code></p>
<p class="line number8 index7 alt1"><code class="php variable">$wfds</code> <code class="php plain">= </code><code class="php keyword">array</code><code class="php plain">(); </code></p>
<p class="line number9 index8 alt2"><code class="php spaces">&nbsp;</code>&nbsp;</p>
<p class="line number10 index9 alt1"><code class="php keyword">do</code><code class="php plain">{&nbsp; </code></p>
<p class="line number11 index10 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$rs</code> <code class="php plain">= </code><code class="php variable">$rfds</code><code class="php plain">;&nbsp; </code></p>
<p class="line number12 index11 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$ws</code> <code class="php plain">= </code><code class="php variable">$wfds</code><code class="php plain">;&nbsp; </code></p>
<p class="line number13 index12 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$es</code> <code class="php plain">= </code><code class="php keyword">array</code><code class="php plain">();&nbsp; </code></p>
<p class="line number14 index13 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$ret</code> <code class="php plain">= socket_select(</code><code class="php variable">$rs</code><code class="php plain">, </code><code class="php variable">$ws</code><code class="php plain">, </code><code class="php variable">$es</code><code class="php plain">, 3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code></p>
<p class="line number15 index14 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php comments">//读取事件 </code></p>
<p class="line number16 index15 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">foreach</code><code class="php plain">(</code><code class="php variable">$rs</code> <code class="php keyword">as</code> <code class="php variable">$fd</code><code class="php plain">){&nbsp; </code></p>
<p class="line number17 index16 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">if</code><code class="php plain">(</code><code class="php variable">$fd</code> <code class="php plain">== </code><code class="php variable">$sfd</code><code class="php plain">){ </code></p>
<p class="line number18 index17 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$cfd</code> <code class="php plain">= socket_accept(</code><code class="php variable">$sfd</code><code class="php plain">);&nbsp; </code></p>
<p class="line number19 index18 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">socket_set_nonblock(</code><code class="php variable">$cfd</code><code class="php plain">);&nbsp; </code></p>
<p class="line number20 index19 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$rfds</code><code class="php plain">[] = </code><code class="php variable">$cfd</code><code class="php plain">;&nbsp; </code></p>
<p class="line number21 index20 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php functions">echo</code> <code class="php string">"new client coming, fd=$cfd\n"</code><code class="php plain">;&nbsp; </code></p>
<p class="line number22 index21 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">}</code><code class="php keyword">else</code><code class="php plain">{&nbsp; </code></p>
<p class="line number23 index22 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$msg</code> <code class="php plain">= socket_read(</code><code class="php variable">$fd</code><code class="php plain">, 1024); </code></p>
<p class="line number24 index23 alt1"><code class="php spaces">&nbsp;</code>&nbsp;</p>
<p class="line number25 index24 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">if</code><code class="php plain">(</code><code class="php variable">$msg</code> <code class="php plain">&lt;= 0){&nbsp; </code></p>
<p class="line number26 index25 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php comments">//close&nbsp; </code></p>
<p class="line number27 index26 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">}</code><code class="php keyword">else</code><code class="php plain">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code></p>
<p class="line number28 index27 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php functions">echo</code> <code class="php string">"on message, fd=$fd data=$msg\n"</code><code class="php plain">;&nbsp; </code></p>
<p class="line number29 index28 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">}&nbsp; </code></p>
<p class="line number30 index29 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">}&nbsp; </code></p>
<p class="line number31 index30 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">} </code></p>
<p class="line number32 index31 alt1"><code class="php spaces">&nbsp;&nbsp;</code>&nbsp;</p>
<p class="line number33 index32 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php comments">//写入事件 </code></p>
<p class="line number34 index33 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">foreach</code><code class="php plain">(</code><code class="php variable">$ws</code> <code class="php keyword">as</code> <code class="php variable">$fd</code><code class="php plain">){&nbsp; </code></p>
<p class="line number35 index34 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">socket_write(</code><code class="php variable">$fd</code><code class="php plain">, ........);&nbsp; </code></p>
<p class="line number36 index35 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code></p>
<p class="line number37 index36 alt2"><code class="php plain">}</code><code class="php keyword">while</code><code class="php plain">(true);</code></p>
<p class="line number38 index37 alt1"><code class="php plain">?&gt;</code></p>

</div>

</td>

</tr>

</tbody>

</table>
<p><strong>下面来提高下效率:</strong></p>
<table class="syntaxhighlighterphp" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<p class="line number1 index0 alt2">1</p>
<p class="line number2 index1 alt1">2</p>
<p class="line number3 index2 alt2">3</p>
<p class="line number4 index3 alt1">4</p>
<p class="line number5 index4 alt2">5</p>
<p class="line number6 index5 alt1">6</p>
<p class="line number7 index6 alt2">7</p>
<p class="line number8 index7 alt1">8</p>
<p class="line number9 index8 alt2">9</p>
<p class="line number10 index9 alt1">10</p>
<p class="line number11 index10 alt2">11</p>
<p class="line number12 index11 alt1">12</p>
<p class="line number13 index12 alt2">13</p>
<p class="line number14 index13 alt1">14</p>
<p class="line number15 index14 alt2">15</p>
<p class="line number16 index15 alt1">16</p>
<p class="line number17 index16 alt2">17</p>
<p class="line number18 index17 alt1">18</p>
<p class="line number19 index18 alt2">19</p>
<p class="line number20 index19 alt1">20</p>
<p class="line number21 index20 alt2">21</p>
<p class="line number22 index21 alt1">22</p>
<p class="line number23 index22 alt2">23</p>
<p class="line number24 index23 alt1">24</p>
<p class="line number25 index24 alt2">25</p>
<p class="line number26 index25 alt1">26</p>
<p class="line number27 index26 alt2">27</p>
<p class="line number28 index27 alt1">28</p>
<p class="line number29 index28 alt2">29</p>
<p class="line number30 index29 alt1">30</p>
<p class="line number31 index30 alt2">31</p>
<p class="line number32 index31 alt1">32</p>
<p class="line number33 index32 alt2">33</p>
<p class="line number34 index33 alt1">34</p>
<p class="line number35 index34 alt2">35</p>

</td>
<td class="code">
<div class="container">
<p class="line number1 index0 alt2"><code class="php plain">&lt;?php</code></p>
<p class="line number2 index1 alt1"><code class="php variable">$sfd</code> <code class="php plain">= stream_socket_server (</code><code class="php string">'tcp://0.0.0.0:1234'</code><code class="php plain">, </code><code class="php variable">$errno</code><code class="php plain">, </code><code class="php variable">$errstr</code><code class="php plain">);&nbsp; </code></p>
<p class="line number3 index2 alt2"><code class="php plain">stream_set_blocking(</code><code class="php variable">$sfd</code><code class="php plain">, 0);&nbsp; </code></p>
<p class="line number4 index3 alt1"><code class="php variable">$base</code> <code class="php plain">= event_base_new();&nbsp; </code></p>
<p class="line number5 index4 alt2"><code class="php variable">$event</code> <code class="php plain">= event_new();&nbsp; </code></p>
<p class="line number6 index5 alt1"><code class="php plain">event_set(</code><code class="php variable">$event</code><code class="php plain">, </code><code class="php variable">$sfd</code><code class="php plain">, EV_READ | EV_PERSIST, </code><code class="php string">'ev_accept'</code><code class="php plain">, </code><code class="php variable">$base</code><code class="php plain">);&nbsp; </code></p>
<p class="line number7 index6 alt2"><code class="php plain">event_base_set(</code><code class="php variable">$event</code><code class="php plain">, </code><code class="php variable">$base</code><code class="php plain">);&nbsp; </code></p>
<p class="line number8 index7 alt1"><code class="php plain">event_add(</code><code class="php variable">$event</code><code class="php plain">);&nbsp; </code></p>
<p class="line number9 index8 alt2"><code class="php plain">event_base_loop(</code><code class="php variable">$base</code><code class="php plain">); </code></p>
<p class="line number10 index9 alt1"><code class="php spaces">&nbsp;</code>&nbsp;</p>
<p class="line number11 index10 alt2"><code class="php keyword">function</code> <code class="php plain">ev_accept(</code><code class="php variable">$socket</code><code class="php plain">, </code><code class="php variable">$flag</code><code class="php plain">, </code><code class="php variable">$base</code><code class="php plain">)&nbsp; </code></p>
<p class="line number12 index11 alt1"><code class="php plain">{&nbsp; </code></p>
<p class="line number13 index12 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$connection</code> <code class="php plain">= stream_socket_accept(</code><code class="php variable">$socket</code><code class="php plain">);&nbsp; </code></p>
<p class="line number14 index13 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">stream_set_blocking(</code><code class="php variable">$connection</code><code class="php plain">, 0);&nbsp; </code></p>
<p class="line number15 index14 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$buffer</code> <code class="php plain">= event_buffer_new(</code><code class="php variable">$connection</code><code class="php plain">, </code><code class="php string">'ev_read'</code><code class="php plain">, NULL, </code><code class="php string">'ev_error'</code><code class="php plain">,&nbsp; </code><code class="php variable">$connection</code><code class="php plain">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code></p>
<p class="line number16 index15 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">event_buffer_base_set(</code><code class="php variable">$buffer</code><code class="php plain">, </code><code class="php variable">$base</code><code class="php plain">);&nbsp; </code></p>
<p class="line number17 index16 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">event_buffer_timeout_set(</code><code class="php variable">$buffer</code><code class="php plain">, 30, 30);&nbsp; </code></p>
<p class="line number18 index17 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">event_buffer_watermark_set(</code><code class="php variable">$buffer</code><code class="php plain">, EV_READ, 0, 0xffffff);&nbsp; </code></p>
<p class="line number19 index18 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">event_buffer_priority_set(</code><code class="php variable">$buffer</code><code class="php plain">, 10);&nbsp; </code></p>
<p class="line number20 index19 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">event_buffer_enable(</code><code class="php variable">$buffer</code><code class="php plain">, EV_READ | EV_PERSIST);&nbsp; </code></p>
<p class="line number21 index20 alt2"><code class="php plain">} </code></p>
<p class="line number22 index21 alt1"><code class="php spaces">&nbsp;</code>&nbsp;</p>
<p class="line number23 index22 alt2"><code class="php keyword">function</code> <code class="php plain">ev_error(</code><code class="php variable">$buffer</code><code class="php plain">, </code><code class="php variable">$error</code><code class="php plain">, </code><code class="php variable">$connection</code><code class="php plain">)&nbsp; </code></p>
<p class="line number24 index23 alt1"><code class="php plain">{&nbsp; </code></p>
<p class="line number25 index24 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">event_buffer_disable(</code><code class="php variable">$buffer</code><code class="php plain">, EV_READ | EV_WRITE);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code></p>
<p class="line number26 index25 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">event_buffer_free(</code><code class="php variable">$buffer</code><code class="php plain">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code></p>
<p class="line number27 index26 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">fclose(</code><code class="php variable">$connection</code><code class="php plain">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code></p>
<p class="line number28 index27 alt1"><code class="php plain">} </code></p>
<p class="line number29 index28 alt2"><code class="php spaces">&nbsp;</code>&nbsp;</p>
<p class="line number30 index29 alt1"><code class="php keyword">function</code> <code class="php plain">ev_read(</code><code class="php variable">$buffer</code><code class="php plain">, </code><code class="php variable">$connection</code><code class="php plain">)&nbsp; </code></p>
<p class="line number31 index30 alt2"><code class="php plain">{&nbsp; </code></p>
<p class="line number32 index31 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$read</code> <code class="php plain">= event_buffer_read(</code><code class="php variable">$buffer</code><code class="php plain">, 256);&nbsp; </code></p>
<p class="line number33 index32 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php comments">//do something....&nbsp; </code></p>
<p class="line number34 index33 alt1"><code class="php plain">}</code></p>
<p class="line number35 index34 alt2"><code class="php plain">?&gt;</code></p>

</div>

</td>

</tr>

</tbody>

</table>
<p>随着人数的增长,并发的提升,单个进程已经满足不了需求了,现成的就有扩展和库来解决这个事,比如:swoole,workerman等?但是,我们在使用php来开发web的时候,也没有使用webserver相关的库来做开发对不对?咱只是简单的echo而已。这些繁杂的事都交给了nginx或者是apache,是他们义无反顾的顶在前面,让我们可以专心写逻辑。写socket服务不比写web高级,都是打码,都是完成需求,通信那层都是固定的,只不过一个由nginx完成,另一个由自己完成。。可是现在不需要自己完成了,类似nginx+fpm的方案,fooking+fpm=php长连接,gateway用于承载连接,router用于转发消息。</p>
<p><strong>其代码如下所示:</strong></p>
<table class="syntaxhighlighterphp" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<p class="line number1 index0 alt2">1</p>
<p class="line number2 index1 alt1">2</p>
<p class="line number3 index2 alt2">3</p>
<p class="line number4 index3 alt1">4</p>
<p class="line number5 index4 alt2">5</p>
<p class="line number6 index5 alt1">6</p>
<p class="line number7 index6 alt2">7</p>
<p class="line number8 index7 alt1">8</p>
<p class="line number9 index8 alt2">9</p>
<p class="line number10 index9 alt1">10</p>
<p class="line number11 index10 alt2">11</p>
<p class="line number12 index11 alt1">12</p>
<p class="line number13 index12 alt2">13</p>
<p class="line number14 index13 alt1">14</p>
<p class="line number15 index14 alt2">15</p>

</td>
<td class="code">
<div class="container">
<p class="line number1 index0 alt2"><code class="php plain">&lt;?php</code></p>
<p class="line number2 index1 alt1"><code class="php variable">$sid</code> <code class="php plain">= </code><code class="php variable">$_SERVER</code><code class="php plain">[</code><code class="php string">'SESSIONID'</code><code class="php plain">];</code><code class="php comments">//这是sessionid&nbsp; </code></p>
<p class="line number3 index2 alt2"><code class="php variable">$data</code> <code class="php plain">= </code><code class="php functions">file_get_contents</code><code class="php plain">(</code><code class="php string">"php://input"</code><code class="php plain">);//这样就能拿到请求内容了&nbsp; </code></p>
<p class="line number4 index3 alt1"><code class="php comments">//想要返回消息只需要两步&nbsp; </code></p>
<p class="line number5 index4 alt2"><code class="php plain">header(</code><code class="php string">'Content-Length: 11'</code><code class="php plain">);</code><code class="php comments">//返回给客户端字节数&nbsp; </code></p>
<p class="line number6 index5 alt1"><code class="php functions">echo</code> <code class="php string">"hello world"</code><code class="php plain">;&nbsp; </code></p>
<p class="line number7 index6 alt2"><code class="php comments">//想要给别的用户发消息&nbsp; </code></p>
<p class="line number8 index7 alt1"><code class="php keyword">include</code> <code class="php string">'api.php'</code><code class="php plain">;&nbsp; </code></p>
<p class="line number9 index8 alt2"><code class="php variable">$router</code> <code class="php plain">= </code><code class="php keyword">new</code> <code class="php plain">RouterClient(</code><code class="php string">'router host'</code><code class="php plain">, </code><code class="php string">'router port'</code><code class="php plain">);&nbsp; </code></p>
<p class="line number10 index9 alt1"><code class="php variable">$router</code><code class="php plain">-&gt;sendMsg(用户sessionid, </code><code class="php string">"fuck you"</code><code class="php plain">);&nbsp; </code></p>
<p class="line number11 index10 alt2"><code class="php comments">//想要给所有人要消息&nbsp; </code></p>
<p class="line number12 index11 alt1"><code class="php variable">$router</code><code class="php plain">-&gt;sendAllMsg(</code><code class="php string">"fuck all"</code><code class="php plain">);&nbsp; </code></p>
<p class="line number13 index12 alt2"><code class="php comments">//想给指定组发消息(类似redis的pub/sub)&nbsp; </code></p>
<p class="line number14 index13 alt1"><code class="php variable">$router</code><code class="php plain">-&gt;publish(</code><code class="php string">"channel name"</code><code class="php plain">, </code><code class="php string">"fuck all"</code><code class="php plain">);</code></p>
<p class="line number15 index14 alt2"><code class="php plain">?&gt;</code></p>

</div>

</td>

</tr>

</tbody>

</table><br><br>
来源:https://www.cnblogs.com/bluealine/p/11038782.html
頁: [1]
查看完整版本: php socket如何实现长连接