摘要:主函数查询数据不手动释放的连接不会归还连接池,会在析构时丢弃执行结果为,说明是并行执行的。主函数查询数据即便抛出了异常,仍然能执行到,没有导致内的一直处于阻塞状态。主函数一次性定时持续定时停止定时
协程
Mix PHP V2 基于 Swoole 4 的 PHP Stream Hook 协程技术开发,协程使用方式与 Golang 几乎一致,包括框架封装的协程池、连接池、命令行处理都大量参考了 Golang 的系统库风格。
除了缺少 select case 外,Mix PHP 与 Golang 的协程几乎一致,框架还提供了连接池、协程池、命令行处理这些开箱即用的封装。xgo + Channel
xgo 类似 Golang 的 go 关键字,可启动一个新的协程,Channel 等于 Golang 的 chan 类,负责在不同协程中传递数据。
*/ class CoroutineCommand { /** * 主函数 */ public function main() { xgo(function () { $time = time(); $chan = new Channel(); for ($i = 0; $i < 2; $i++) { xgo([$this, "foo"], $chan); } for ($i = 0; $i < 2; $i++) { $result = $chan->pop(); } println("Total time: " . (time() - $time)); }); Event::wait(); } /** * 查询数据 * @param Channel $chan */ public function foo(Channel $chan) { $db = app()->dbPool->getConnection(); $result = $db->createCommand("select sleep(5)")->queryAll(); $db->release(); // 不手动释放的连接不会归还连接池,会在析构时丢弃 $chan->push($result); } }
执行结果为 5s,说明是并行执行的。
WaitGroup + xdeferWaitGroup 与 Golang 的完全一致,xdefer 方法也等同于 Golang 的 defer 关键字。
当并行执行且不需要返回结果时,可以使用 WaitGroup + xdefer,xdefer 即使在方法抛出异常时,仍然会执行,这样能避免一直处于阻塞状态。
*/ class WaitGroupCommand { /** * 主函数 */ public function main() { xgo(function () { $wg = WaitGroup::new(); for ($i = 0; $i < 2; $i++) { $wg->add(1); xgo([$this, "foo"], $wg); } $wg->wait(); println("All done!"); }); Event::wait(); } /** * 查询数据 * @param WaitGroup $wg */ public function foo(WaitGroup $wg) { xdefer(function () use ($wg) { $wg->done(); }); println("work"); throw new RuntimeException("ERROR"); } }
即便抛出了 RuntimeException 异常,仍然能执行到 println("All done!");,没有导致 wg 内的 chan 一直处于阻塞状态。
定时器异步编程中,定时器的使用非常频繁。
Timer::new() 可获得一个实例
after 方法可设置一次性定时
tick 方法可设置持续定时
停止当前定时期,只需只需对象的 $timer->clear(); 方法。
*/ class TimerCommand { /** * 主函数 */ public function main() { // 一次性定时 Timer::new()->after(1000, function () { println(time()); }); // 持续定时 $timer = new Timer(); $timer->tick(1000, function () { println(time()); }); // 停止定时 Timer::new()->after(10000, function () use ($timer) { $timer->clear(); }); Event::wait(); } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/31192.html
摘要:前些时间我们发布了实例协程池异步邮件发送守护程序范例,这一次我们提供一个使用大厂通过协程化来并行执行短信发送任务,本文是一个代码简单性能极强的范例。 前些时间我们发布了 Mix PHP V2 实例:协程池异步邮件发送守护程序 范例,这一次我们提供一个使用大厂 SDK 通过 Swoole Hook 协程化来并行执行短信发送任务,本文是一个代码简单、IO 性能极强的范例。 请先升级到 m...
摘要:消费者开发使用本例时,请确保你使用的编译时开启了本例我们采用的守护程序协程池来完成一个超高性能的邮件发送程序。 去年 Mix PHP V1 发布时,我写了一个多进程的邮件发送实例: 使用 mixphp 打造多进程异步邮件发送,今年 Mix PHP V2 发布,全面的协程支持让我们可以使用一个进程就可达到之前多个进程都无法达到的更高 IO 性能,所以今天重写一个协程池版本的邮件发送实例。...
摘要:是一个非常流行的的客户端,现在各大厂的也都开始基于开发,因为只支持的协程,而默认是使用扩展的,所以开发了,能在不修改源码的情况下让协程化。 Guzzle 是一个非常流行的 PHP 的 HTTP 客户端,现在各大厂的 SDK 也都开始基于 Guzzle 开发,因为 Swoole 只支持 PHP Stream 的协程 Hook ,而 Guzzle 默认是使用 cURL 扩展的,所以 Mix...
摘要:事件驱动的异步编程模式异步协议的服务器端客户端支持支持隧道加密支持并发百万长连接支持毫秒定时器支持异步同步协程支持亲和性设置守护进程版本目前上稳定版本是,最新消息,要迈入,彻底协程化。 Swoole:面向生产环境的 PHP 异步网络通信引擎 官网原话:使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。Swoole ...
摘要:之前的版本用的管理全段资源,版本开始使用的来管理。不过,并不是强制要求在开发期间使用它。发布问题标题标题编辑器容器内容发布问题实例化编辑器设置如果没有预加载,否则不会出现 Laravel5.4 之前的版本用 gulp 的 laravel-elixir管理全段资源,Laravel5.4 版本开始使用webpack 的 Laravel Mix 来管理。 一、简介 Laravel Mix 提...
阅读 2905·2021-11-15 18:02
阅读 3799·2021-10-14 09:43
阅读 3732·2021-09-08 10:41
阅读 2519·2019-08-30 15:53
阅读 1802·2019-08-30 14:14
阅读 1943·2019-08-29 16:12
阅读 3137·2019-08-29 14:03
阅读 1279·2019-08-29 13:46