PHP语言是一个短生命周期的Web编程语言,很多PHPer已经形成了fpm下编程的思维定势。实际上在Swoole出现之后,这种串行化编程的模式早已被打破。使用Swoole完全可以轻易实现更灵活的并发编程。

场景介绍
假设我们要做一个石头剪刀布的Web游戏,3个玩家同时提交竞猜后显示胜者。在传统串行化Web编程中,我们一般思路是这样:

设置 form 表单,用户提交竞猜后保存到 MySQL/Redis 存储
添加一个查看结果按钮,如果未全部完成,显示正在等待其他人提交。当3个人全部提交时,查询存储,并显示最终结果
并发编程
这个场景就可以使用Swoole实现并发编程,无需依赖 MySQL/Redis 存储,在内存中可以完成竞猜。

当有用户提交竞猜时,hold 住请求,不返回结果,用户进入等待状态。当前请求和连接保持在内存中
当3个人全部提交时,从内存中取出相关请求的内容,计算并遍历向所有请求发送响应
编码实现

 <?php
$server = new Swoole\Http\Server('127.0.0.1', 9501, SWOOLE_BASE);
$result = [];
$server->on('request', function ($req, $resp) use(&$result) {
$resp->header('Content-Type', 'text/html; charset=UTF-8');
if ($req->server['request_method'] == 'GET') {
$resp->end('
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<form method="post" action="">
<input type="radio" value="石头" name="result">石头
<input type="radio" value="剪刀" name="result">剪刀
<input type="radio" value="布" name="result">布
<button type="submit">提交</button>
</form>
');
} else {
$result[$req->get['name']] = [$req, $resp];
if (count( $result) == 3) {
$out = '';
foreach($result as $arr) {
[$_req, $_resp] = $arr;
$out .= $_req->get['name'] ." : ". $_req->post['result']."<br />\n";
}
foreach($result as $arr) {
[$_req, $_resp] = $arr;
$_resp->end($out);
}
$result = [];
}
}
});
$server->start();

执行程序

php game.php

打开3个Chrome的Tab页。并且URL中传入name分别为A、B、C代表3个用户。

在第一个、第二个提交结果时,并未返回任何结果,Chrome正在转圈等待服务器返回结果。第三个表单提交时3个Tab页同时返回结果。

并发难题
并发编程比串行编程更强大,也更复杂。并发编程会遇到之前串行编程所没有的新问题,如:

数据同步问题
上下文管理问题
时序问题
这需要开发者具备更严谨的工程思维能力,也需要开发者具备更深厚的编程功底。

思维转变
Swoole其实颠覆了以往PHP的编程模式,使得程序员的视野不再局限于一次请求的处理,不再局限于对于数据库CURD操作、接口调用。配合使用Swoole4提供的协程编程能力,就可以在内存空间内实现各种复杂的交互。

新的编程模式,可以让PHPer轻松地去实现网络游戏、服务器系统、智能家居、物联网等项目。

PHP+Swoole并发编程的魅力的更多相关文章

  1. 《C#并发编程经典实例》笔记

    1.前言 2.开宗明义 3.开发原则和要点 (1)并发编程概述 (2)异步编程基础 (3)并行开发的基础 (4)测试技巧 (5)集合 (6)函数式OOP (7)同步 1.前言 最近趁着项目的一段平稳期 ...

  2. Java 面试知识点解析(二)——高并发编程篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  3. Python3 与 C# 并发编程之~ 线程篇

      2.线程篇¶ 在线预览:https://github.lesschina.com/python/base/concurrency/3.并发编程-线程篇.html 示例代码:https://gith ...

  4. Python并发编程系列之协程

    1 引言 协程是近几年并发编程的一个热门话题,与Python多进程.多线程相比,协程在很多方面优势明显.本文从协程的定义和意义出发,结合asyncio模块详细讲述协程的使用. 2 协程的意义 2.1 ...

  5. 《Go并发编程实战》第2版 紧跟Go的1.8版本号

    文章作者:郝林(<Go并发编程实战 (第2版)>作者) 最终来了! 经过出版社的各位编辑.校对.排版伙伴与我的N轮PK和共同努力,<Go并发编程实战>第2版的全部内容最终全然确 ...

  6. Go中的并发编程和goroutine

    并发编程对于任何语言来说都不是一件简单的事情.Go在设计之初主打高并发,为使用者提供了goroutine,使用的方式虽然简单,但是用好却不是那么容易,我们一起来学习Go中的并发编程. 1. 并行和并发 ...

  7. 如何评价《Java 并发编程艺术》这本书?

    对于书评这件事情,我其实是不想写的,因为每个人都有自己的一个衡量标准,每个人眼中都有自己的哈姆雷特,是好是坏每个人都褒贬不一.如果对于书中的知识你都掌握了,你只是想把它作为一种知识串联的记忆体的话,那 ...

  8. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  9. 伪共享(false sharing),并发编程无声的性能杀手

    在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能异步处理框架 Disruptor ...

随机推荐

  1. 重大升级!SEER见证人,您的节点需要在10月28日前更新

    SEER的区块链底层目前还处于不断完善中.一些新的完善更新会为区块链的基础设施--节点软件添加新的功能.理事会将会就是否接受新的节点版本进行共识投票,如果提案投票通过,将要求所有见证人在指定时间前将节 ...

  2. libevent环境搭建

    环境 VS2017.ubuntu16.04  官网网址:http://www.linuxfromscratch.org/blfs/view/svn/basicnet/libevent.html 下载 ...

  3. 使用JRebel插件实现SpringBoot应用代码热加载

    前言 在实际的开发过程中,我们经常修改代码之后,手动的重启项目,查看修改效果.那么有没有一种方式能够快速的.自动的帮我们将修改代码自动更新,避免手动重启,从而提高开发效率呢?是有的,在我之前的文章里面 ...

  4. PassWord控件

    <StackPanel Margin="> <Label>Text:</Label> <TextBox /> <Label>Pas ...

  5. JdbcTemplate实现增删改查操作

    JdbcTemplate介绍 为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架,Spring Boot Spring Data-JP ...

  6. IDEA配置maven+错误记录

    使用maven并不是那么顺利所以把自己遇到的问题也记录一下 下载maven 从官网下载maven官网 配置环境变量 新建一个变量名:MAVEN_HOME 值:maven目录 path:%MAVEN_H ...

  7. 委托事件(jQuery)

    <div class="content"> <ul> <li>1</li> <li>2</li> <l ...

  8. 游图邦YOTUBANG是如何搭建生态系统的?

    现在的我们最关心的一个问题就是任何一个行业,如果没有办法很好的落地,就算描绘的非常美好,那也只是空中楼阁.昙花一现而已,它无法实现长久的一个发展.互联网时代呢,就是一个流量为王的一个时代,谁拥有庞大的 ...

  9. Java ArrayList底层实现原理源码详细分析Jdk8

    简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用 ...

  10. SpringCloud之Zuul过滤器实现登录鉴权实战(十一)

    自定义zuul过滤器实现登录鉴权实战 1.新建filter包 2.新建类继承ZuulFilter,重写方法 3.在类顶部加注解@Comment让spring扫描 /** * @author WGR * ...