首页 > 编程语言 >PRipple:现代化PHP原生协程引擎

PRipple:现代化PHP原生协程引擎

时间:2024-08-07 09:51:48浏览次数:14  
标签:function 协程 PRipple Request PHP response

转载自微信公众号 《开源技术小栈》

简介

PRipple是一个高性能的原生PHP协程框架,旨在处理高并发、复杂的网络通信和数据操作。项目基于PHP8.1自身的纤程特性实现协程,提供了更加简单易用的API和工具,使得开发者可以轻松地构建高性能的PHP应用。

文档地址

官方文档

特点

  • 高性能: 通过使用原生PHP协程, 大幅提高了应用的并发处理能力
  • 兼容性: 兼容现有的PHP框架和库, 支持在FPM/CLI环境下使用
  • 易于使用: 100%的PHP代码实现,无需更多的学习成本,提供了简单易用的API,
  • 协程调度: 使用 Fiber 和 Promise 机制, 实现了高效的协程调度。
  • 异步I/O: 提供异步的网络和文件I/O操作,避免阻塞。
  • 高并发处理: 支持高并发请求处理,适用于实时应用和高负载场景。
  • 易于集成: 可以与传统项目无缝集成,提供简单的安装和使用指南。

特性

  • 原生:基于PHP原生协程实现,100%的PHP代码率, 无需第三方扩展, 所有函数都如你所知的方式工作, 无需额外的学习成本
  • 生态:保持所有组件的原生性, 提供丰富的生态支持, 与绝大多数的composer包兼容, 无需担心生态问题
  • 集成:传统的PHP框架支持高度集成, 无缝支持Laravel, Symfony, ThinkPHP, Yii等主流框架, 无需改动原有代码, 支持FPM环境使用

运行机制 Runtime

介绍

在PRipple中,所有define的异步闭包都由EventLoop驱动, EventLoop将会在恰当的时候运行指定事件, 开发者无需过于关心EventLoop的处理机制, 只需做好流程的控制, 不同的闭包可能会在不同的上下文空间中被执行, 开发过程中应该注意这些上下文空间的约束

PRipple对任何一个闭包的发生运行时都会特别声明与严格把控, 所有对于插件/组件的开发者也应该关心这点,防止闭包发生进程/纤程逃逸, 运行黑洞的情况

主程运行时

框架的的使用者几乎不用关心该运行时,因为开发者的代码通常运行在事件运行时与协程运行时上下文

进程的入口点, 构建PRipple的过程即是主程运行时, 它发生在PRipple驱动机之前, 以Laravel的入口文件为例子

<?php
use Illuminate\Http\Request;
define('LARAVEL_START', microtime(true));
if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
    require $maintenance;
}
require __DIR__.'/../vendor/autoload.php';

//TODO: 主程运行时
\P\async(function(){
    //TODO: 协程运行时,包括 Laravel中间件/服务提供者/控制器 等运行过程都处于协程序空间中
    (require_once __DIR__.'/../bootstrap/app.php')
        ->handleRequest(Request::capture());
});

# 启动PRipple
\P\tick();

安装

Composer 安装

composer require cclilshy/p-ripple-drive

Webman 配置

配置config/server.php文件

<?php
return [
    //...
    'event_loop' => \Psc\Drive\Workerman\PDrive::class,
];

使用方法

手动创建

public function index(Request $request): string
{
    $handle = new \Psc\Plugins\Guzzle\PHandler([
       'pool' => 1 // 是否启用Http长连接
    ]);
    $client = new \GuzzleHttp\Client(['handle' => $handle]);

    // 发送请求(即使该请求耗时很长, 也不会堵塞当前进程的其他请求)
    $response = $client->get('http://www.baidu.com');
    return $response->getBody()->getContents();
}

全局使用(荐)

public function index(Request $request): string
{
    $client = \P\Plugin::Guzzle();

    // 发送请求(即使该请求耗时很长, 也不会堵塞当前进程的其他请求)
    $response = $client->get('http://www.baidu.com');
    return $response->getBody()->getContents();
}

效果演示

use function P\async;
use function P\await;

/**
 * @desc 方法描述
 * @param Request $request
 * @return string
 * @author Tinywan(ShaoBo Wan)
 */
public function index(Request $request): string
{
    for ($i = 0; $i < 100; $i++) {
        async(function () use ($i) {
            $response = await(\P\Plugin::Guzzle()->getAsync('https://www.qq.com/'));
            $time = microtime(true);
            $responseStatusCode = $response->getStatusCode();
            var_dump("[{$time}] request {$i} status: {$responseStatusCode}");
        });
    }
    return '开源技术小栈!';
}

标签:function,协程,PRipple,Request,PHP,response
From: https://www.cnblogs.com/cclilshy/p/18346435

相关文章

  • PayPal支付对接php
    #安装composer包"paypal/rest-api-sdk-php":"^1.14","paypal/paypal-checkout-sdk":"^1.0"usePayPal\Api\Amount;usePayPal\Api\Details;usePayPal\Api\Item;usePayPal\Api\ItemList;usePayPal\Api\Payer......
  • 小白学php,emlog6.0代码审计,fortify代码审计
    一、初识报错注入报错注入是一种通过引发SQL错误并利用错误消息回显数据库信息的技术。通过使用MySQL中的特定函数(如UPDATEXML),可以将数据库查询结果嵌入到错误消息中,从而获取数据库中的数据。二、执行原理代码逻辑分析:用户输入参数(如用户ID)。后台执行SQL查询(查询用户信息......
  • ThinkPHP8事件两种使用方式
    目录通过监听方式通过事件订阅智能订阅手动订阅监听方式生成事件监听类,在项目根目录下执行以下命令://生成一个UserLoginSuccess监听类phpthinkmake:listenerUserLoginSuccess执行之后,会在app->listener目录下生成UserLoginSuccess.php,代码如下:/**用户登录成......
  • 织梦用的是php还是thinkphp
    织梦内容管理系统(DedeCms)以简单、实用、开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是在易用性方面,都有了长足的发展和进步,DedeCms免费版的主要目标用户锁定在个人站长,功能更专注于个人网站或中小型门......
  • php: 在php中切换到指定的用户执行
    一,真实用户id和有效用户id的区别:1,  真实用户ID(RUID) 是启动进程的用户的ID2,有效用户ID(EUID) 是当前执行进程的用户ID即:进程启动时的用户id是真实用户ID(RUID),   但实际执行时为了控制权限会切换为:有效用户ID二,代码:切换用户和组的有效id<?php......
  • 计算机毕业设计必看必学!! 86393 基于微服务架构的餐饮系统的设计与实现,原创定制程序,
    摘   要近年来,我国经济和社会发展迅速,人们物质生活水平日渐提高,餐饮行业更是发展迅速,人们对于餐饮行业的认识和要求也越来越高。传统形式的餐饮行业都是以人为本,管理起来需要很多人力、物力、财力,既不方便管理者的管理,也不方便顾客实时了解餐厅动态,给传统餐......
  • PHP 无限级分类
    1)无限级分类处理<?php//准备分类原始数据$cate_arr=[['id'=>1,'name'=>'电脑','pid'=>0],['id'=>2,'name'=>'手机','pid'=>0],['id'=>3,'nam......
  • RSA非对称加密,前端JS加密,后端PHP解密
    RSA公钥/私钥在线生成:http://web.chacuo.net/netrsakeypair通过以上网址生成公钥/私钥对,私钥格式这里选择【PKCS#1】,如:公钥:-----BEGINPUBLICKEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDN3El4yr2maFvDo5PKIzkkiitJZEOTLNINH0RD0PL5Lob+YzbRJO6DX27SRuHcdlK7mFtkQvooW......
  • js、php实现前后端数据的base64编码和解码
    客户要求密码必须加密后再传送。javascript代码的加密函数:<scriptlanguage='javascript'>functionutf16to8(str){varout,i,len,c;out="";len=str.length;for(i=0;i<len;i++){c=str.charCodeAt(i);if(......
  • PHP中的魔术常量(如__FILE__,__LINE__)及其用途
    在PHP中,魔术常量是一组预定义的常量,它们会根据它们使用的上下文环境而改变其值。这些常量以两个下划线字符开始和结束。魔术常量提供了有关代码执行环境的有用信息,例如当前文件的路径、当前行号等。以下是几个常用的PHP魔术常量及其用途:__FILE__:用途:__FILE__ 魔术常量返......