Light, concurrent RPC framework for PHP & C

Overview

Yar - Yet Another RPC framework for PHP

Build Status Build status Build Status

Light, concurrent RPC framework for PHP(see also: Yar C framework, Yar Java framework)

Requirement

  • PHP 7.0+ (master branch))
  • PHP 5.2+ (php5 branch)
  • Curl
  • Json
  • Msgpack (Optional)

Introduction

Yar is a RPC framework which aims to provide a simple and easy way to do communication between PHP applications

It has the ability to concurrently call multiple remote services.

Features

  • Fast, Easy, Simple
  • Concurrent RPC calls
  • Multiple data packager supported (php, json, msgpack built-in)
  • Multiple transfer protocols supported (http, https, TCP)
  • Detailed debug informations

Install

Install Yar

Yar is an PECL extension, thus you can simply install it by:

pecl install yar

Compile Yar in Linux

$/path/to/phpize
$./configure --with-php-config=/path/to/php-config/
$make && make install

Available instructions to configure are

--with-curl=DIR
--enable(disable)-msgpack
--enable(disable)-epoll (require Yar 2.1.2)

Install Yar with msgpack

first you should install msgpack-ext

pecl install msgpack

or for ubuntu user

apt-get install msgpack-php

or , you can get the github source here: https://github.com/msgpack/msgpack-php

then:

$phpize
$configure --with-php-config=/path/to/php-config/ --enable-msgpack
$make && make install

Runtime Configure

  • yar.timeout //default 5000 (ms)
  • yar.connect_timeout //default 1000 (ms)
  • yar.packager //default "php", when built with --enable-msgpack then default "msgpack", it should be one of "php", "json", "msgpack"
  • yar.debug //default Off
  • yar.expose_info // default On, whether output the API info for GET requests
  • yar.content_type // default "application/octet-stream"
  • yar.allow_persistent // default Off

NOTE yar.connect_time is a value in milliseconds, and was measured in seconds in 1.2.1 and before.

Constants

  • YAR_VERSION
  • YAR_OPT_PACKAGER
  • YAR_OPT_PERSISTENT
  • YAR_OPT_TIMEOUT
  • YAR_OPT_CONNECT_TIMEOUT
  • YAR_OPT_HEADER // Since 2.0.4
  • YAR_OPT_PROXY //Since 2.2.0

Server

It's very easy to setup a Yar HTTP RPC Server

<?php
class API {
    /**
     * the doc info will be generated automatically into service info page.
     * @params 
     * @return
     */
    public function some_method($parameter, $option = "foo") {
    }

    protected function client_can_not_see() {
    }
}

$service = new Yar_Server(new API());
$service->handle();
?>

Usual RPC calls will be issued as HTTP POST requests. If a HTTP GET request is issued to the uri, the service information (commented section above) will be printed on the page:

yar service info page

Client

It's very simple for a PHP client to call remote RPC:

Synchronous call

<?php
$client = new Yar_Client("http://host/api/");
/* the following setopt is optinal */
$client->SetOpt(YAR_OPT_CONNECT_TIMEOUT, 1000);

$client->SetOpt(YAR_OPT_HEADER, array("hd1: val", "hd2: val"));  //Custom headers, Since 2.0.4

/* call remote service */
$result = $client->some_method("parameter");
?>

Concurrent call

<?php
function callback($retval, $callinfo) {
     var_dump($retval);
}

function error_callback($type, $error, $callinfo) {
    error_log($error);
}

Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback");
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"));   // if the callback is not specificed, 
                                                                               // callback in loop will be used
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback", "error_callback", array(YAR_OPT_PACKAGER => "json"));
                                                                               //this server accept json packager
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback", "error_callback", array(YAR_OPT_TIMEOUT=>1));
                                                                               //custom timeout 
 
Yar_Concurrent_Client::loop("callback", "error_callback"); //send the requests, 
                                                           //the error_callback is optional
?>

Persistent call

After Yar 2.1.0, if YAR_OPT_PERSISTENT is set to true, then Yar is able to use HTTP keep-alive to speedup repeated calls to a same address, the link will be released at the end of the PHP request lifecycle.

<?php
$client = new Yar_Client("http://host/api/");
$client->SetOpt(YAR_OPT_PERSISTENT, 1);

$result = $client->some_method("parameter");

/* The following calls will speed up due to keep-alive */
$result = $client->some_other_method1("parameter");
$result = $client->some_other_method2("parameter");
$result = $client->some_other_method3("parameter");
?>

Custom hostname resolving

After Yar 2.1.0, if Yar runs on HTTP protocol, YAR_OPT_RESOLVE could be used to define custom hostname resolving.

<?php
$client = new Yar_Client("http://host/api/");

$client->SetOpt(YAR_OPT_RESOLVE, array("host:80:127.0.0.1"));

/* call goes to 127.0.0.1 */
$result = $client->some_method("parameter");

Use http proxy

After Yar 2.2.1, if Yar runs on HTTP protocol, YAR_OPT_PROXY could be used to define http proxy , such as fidder or charles.

<?php
$client = new Yar_Client("http://host/api/");

$client->SetOpt(YAR_OPT_PROXY,"127.0.0.1:8888"); //http proxy , Since 2.2.0

/* call goes to 127.0.0.1 */
$result = $client->some_method("parameter"); 

Protocols

Yar Header

Since Yar will support multi transfer protocols, so there is a Header struct, I call it Yar Header

#ifdef PHP_WIN32
#pragma pack(push)
#pragma pack(1)
#endif
typedef struct _yar_header {
    uint32_t       id;            // transaction id
    uint16_t       version;       // protocol version
    uint32_t       magic_num;     // default is: 0x80DFEC60
    uint32_t       reserved;
    unsigned char  provider[32];  // reqeust from who
    unsigned char  token[32];     // request token, used for authentication
    uint32_t       body_len;      // request body len
}
#ifndef PHP_WIN32
__attribute__ ((packed))
#endif
yar_header_t;
#ifdef PHP_WIN32
#pragma pack(pop)
#endif

Packager Header

Since Yar also supports multi packager protocol, so there is a char[8] at the begining of body, to identicate which packager the body is packaged by.

Request

When a Client request a remote server, it will send a struct (in PHP):

<?php
array(
   "i" => '', //transaction id
   "m" => '', //the method which being called
   "p" => array(), //parameters
)

Server

When a server response a result, it will send a struct (in PHP):

<?php
array(
   "i" => '',
   "s" => '', //status
   "r" => '', //return value 
   "o" => '', //output 
   "e" => '', //error or exception
)
Issues
  • Uncaught Yar_Client_Transport_Exception: server responsed non-200 code '400'

    Uncaught Yar_Client_Transport_Exception: server responsed non-200 code '400'

    我调用老版本的php5.6的正常 新安装了php7.3版本之后,一直报这个错误 不知道什么问题

    opened by si812cn 14
  • windows 平台 报错 Yar_Client_Transport_Exception' with message 'curl exec failed 'Timeout was reached'

    windows 平台 报错 Yar_Client_Transport_Exception' with message 'curl exec failed 'Timeout was reached'

    BUG现象同:https://github.com/laruence/yar/issues/15 环境: windows7 php5.6.10/5.6.11 (nts x86) nginx 1.9.2 cURL Information 7.42.1 msgpack 0.5.6 yar 1.2.3/1.2.4

    错误为: Yar_Client_Transport_Exception’ with message ‘curl exec failed ‘Timeout was reached’

    配置了php.ini中yar.debug=1,可以看到: Warning: [Debug Yar_Client 18:39:21.422666]: 575645727: call api ‘api’ at (r)’http://zftest/yar/service/TestServiceProvider.php‘ with ’1′ parameters in E:\workspace\test_project\unit_test\src\main\yar\client\TestConsumer.php on line 31

    Warning: [Debug Yar_Client 18:39:21.422666]: 575645727: pack request by ‘PHP’, result len ’80′, content: ‘a:3:{s:1:”i”;i:575645727;s:1:”m”‘ in E:\workspace\test_project\unit_test\src\main\yar\client\TestConsumer.php on line 31

    跟了一下nginx的access日志: POST /yar/service/TestServiceProvider.php HTTP/1.1 499 0 4.992 第一部分,post请求, 第二部分:请求地址与协议, 第三部分:返回的http状态码 第四部分:消息体长度 第五部分:请求时长

    opened by agclqq 14
  • Yar_Concurrent_Client::Loop timeout on Mac with Libcurl 7.24.0

    Yar_Concurrent_Client::Loop timeout on Mac with Libcurl 7.24.0

    用Yar_Concurrent_Client::call 调用,loop调用后一直超时。即使只call 了一次。 用Yar_Client 同步调用就没问题,同样的协议。

    我用的php 5.4.17, osx10.9

    invalid 
    opened by crazyant 14
  • yar windows 不支持yar_concurrent_client::loop();

    yar windows 不支持yar_concurrent_client::loop();

    鸟哥你好,我在windows下用了yar.dll,是在pecl下载的。 PHP5.4,curl7.29 但是也是一直报这个错误。

    [23-Jul-2014 09:50:32 Asia/Shanghai] PHP Warning: [Debug Yar_Client 9:50:32.271401]: 440193860: call api 'add' at (r)'http://test.me/server.php' with '2' parameters in D:\httproot\test\client.php on line 13

    [23-Jul-2014 09:50:32 Asia/Shanghai] PHP Warning: [Debug Yar_Client 9:50:32.274330]: 440193860: pack request by 'PHP', result len '82', content: 'a:3:{s:1:"i";i:440193860;s:1:"m"' in D:\httproot\test\client.php on line 13

    [23-Jul-2014 09:50:32 Asia/Shanghai] PHP Warning: [Debug Yar_Client 9:50:32.277817]: -1015573128: call api 'mul' at (r)'http://test.me/server.php' with '2' parameters in D:\httproot\test\client.php on line 13

    [23-Jul-2014 09:50:32 Asia/Shanghai] PHP Warning: [Debug Yar_Client 9:50:32.280518]: -1015573128: pack request by 'PHP', result len '84', content: 'a:3:{s:1:"i";i:-1015573128;s:1:"' in D:\httproot\test\client.php on line 13

    [23-Jul-2014 09:50:32 Asia/Shanghai] PHP Warning: Yar_Concurrent_Client::loop(): can not get fd from curl instance in D:\httproot\test\client.php on line 13

    但是用$client->add();这种一个个来的就没问题了,但百度下这个问题,貌似没有结果 官网也没看到有关windows下的介绍。所以麻烦鸟哥了,谢谢。

    opened by regittiger 12
  • yar socket调用会core

    yar socket调用会core

    Hello 鸟哥:

    yar用socket方式调用一个tcp服务偶尔时会出现core,coredump信息如下: #0 _zend_mm_free_int () at /tmp/php-5.6.10/Zend/zend_alloc.c:2104 #1 0x00007f8a4ae411a6 in php_yar_client_handle (ht=, return_value=0x33d0218, return_value_ptr=, this_ptr=,

    return_value_used=<value optimized out>) at /home/wxx/yar-yar-1.2.5/yar_client.c:271
    

    #2 zim_yar_client___call (ht=, return_value=0x33d0218, return_value_ptr=, this_ptr=, return_value_used=)

    at /home/wxx/yar-yar-1.2.5/yar_client.c:546
    

    #3 0x00000000007e7e46 in zend_call_function () #4 0x000000000080e025 in zend_call_method () #5 0x000000000081d12c in zend_std_call_user_call () at /tmp/php-5.6.10/Zend/zend_object_handlers.c:931 #6 0x000000000089c29e in zend_do_fcall_common_helper_SPEC () at /tmp/php-5.6.10/Zend/zend_vm_execute.h:558 #7 0x000000000082c8e8 in execute_ex () at /tmp/php-5.6.10/Zend/zend_vm_execute.h:363 #8 0x00000000007f88d0 in zend_execute_scripts () #9 0x0000000000796fa2 in php_execute_script () #10 0x00000000008a72d1 in main () at /tmp/php-5.6.10/sapi/fpm/fpm/fpm_main.c:1964

    opened by zhanglei 11
  • 请求服务端curl报错 Failure when receiving data from the peer

    请求服务端curl报错 Failure when receiving data from the peer

    curl exec failed 'Failure when receiving data from the peer'

    不知道有人遇到过没有,是什么原因造成的以及解决方案。

    opened by daxiong123 9
  • php7.0环境下调用yar报错server responsed non-200 code '403'

    php7.0环境下调用yar报错server responsed non-200 code '403'

    系统:centos 7, php:版本:7.0 yar:版本2.0.0 错误详情: Type: Yar_Client_Transport_Exception Message: server responsed non-200 code '403'

    opened by vancett 8
  • yar 并行调用 不支持设置 timeout

    yar 并行调用 不支持设置 timeout

    Yar_Concurrent_Client::call("http://rpcapi******", "getrelkey", array('生产毛坯', 'com'), 'callback', 'error_callback', array(YAR_OPT_TIMEOUT=>1)); Yar_Concurrent_Client::loop(); //send

    getrelkey 函数中sleep 4s

    发现设置的YAR_OPT_TIMEOUT 1s没起作用

    $client = new Yar_Client("http://rpcapi**************"); $client->SetOpt(YAR_OPT_TIMEOUT, 1); $result = $client->getrelkey(array('生产毛坯', 'com')); var_dump($result);

    这样设置的1s能看到效果

    另外php.ini里面设置1000也能看到效果

    系统max os PHP Version 5.3.28 curl cURL support enabled

    cURL Information 7.33.0

    yar yar support enabled Version 1.2.4-dev

    Directive Local Value Master Value yar.allow_persistent 0 0 yar.connect_timeout 1000 1000 yar.content_type application/octet-stream application/octet-stream yar.debug 0 0 yar.expose_info On On yar.packager php php yar.timeout 5000 5000 yar.transport curl curl

    盼回复

    opened by jianhuihi 7
  • yar在php7下有内存泄漏

    yar在php7下有内存泄漏

    鸟哥,yar在php-7.0.10下好像有内存泄漏,用的是master最新代码

    image

    image

    opened by zhanglei 7
  • php7.1 环境下的 同时使用YAF  和YAR 结果报错了  内存耗尽

    php7.1 环境下的 同时使用YAF 和YAR 结果报错了 内存耗尽

    class IndexController extends Yaf_Controller_Abstract {

    /** 
    * 构造函数
    * 
    * @param  $type 整型 类型(1: 类型a 2:类型b 3:类型c 4:类型d 5:类型e)
    * 	
    * @return $rows 数组 返回对应的数据包
    */
    Public function indexAction(){	
    	$server = new Yar_Server($this);
    	$server->handle();
    }
    

    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1936288885 bytes) in /www/wwwroot/

    按说明书的方法写没问题 , 我这样用是 YAF的问题 还是YAR的问题 ?

    代码不变切换成5.6的就是OK的 , 没有任何的报错的

    question 
    opened by archoncap 7
  • http2.0协议支持

    http2.0协议支持

    hi 鸟哥 我看到历史提交记录中yar有http2.0的支持 https://github.com/laruence/yar/commit/14daf8e97a1e9cbd5533715a9236f3039cca2eaa 然后在这个提交记录又 注释了 https://github.com/laruence/yar/commit/a2cd6440f784a583b2ebbb24166a3495d73d7262 我想请教一下, Yar是否有支持http2.0的计划? 注释的原因是? 是否yar http2.0的支持,除了设置libcurl这个参数还需要其他工作?还是出于其他目的考量注释的?

    以上,祝好

    opened by fangfengxiang 0
  • yar扩展无法在基于swoole环境的框架中使用

    yar扩展无法在基于swoole环境的框架中使用

    本次测试基于 swoole 环境运行的 hyperf 框架。 以下相同的代码,在 Laravel 框架中测试一切OK

    1. 示例代码,创建一个Users类
    class Users
    {
    
        function   Register(){
            var_dump("用户注册");
            echo '用户注册';
        }
    
        function   Login(){
            var_dump("用户登录");
            echo '用户登录';
        }
    
    }
    
    

    2.yar扩展创建Server

        function TestYar(){
            $users=new \Yar_Server(new Users());
            $users->handle();
        }
    
    

    3.客户端调用代码

    <?php
    $micro_client_user=new Yar_Client('http://139.196.101.31:9501/testYar');
    $res=$micro_client_user->Register();
    echo  $res ;
    
    
    $res=$micro_client_user->Login();
    echo  $res ;
    
    

    报错代码

    string(208) "
    2020-03-15 17:27:23, OcurredError,Type: WAINING, errorFile: /home/wwwroot/www.hyperf.com/stock/app/Controller/IndexController.php, Line: 46, errorMessage: Yar_Server::handle(): headers already has been sent
    "
    string(16) "errorTrace:↓"
    string(1759) "
    1	{"function":"error_handle","args":[2,"Yar_Server::handle(): headers already has been sent","/home/wwwroot/www.hyperf.com/stock/app/Controller/IndexController.php",46,{"users":{}}]}
    
    2	{"file":"/home/wwwroot/www.hyperf.com/stock/app/Controller/IndexController.php","line":46,"function":"handle","class":"Yar_Server","object":{},"type":"->","args":[]}
    
    
    question 
    opened by qifengzhang007 5
  • Yar rpc接口处理返回较多数据时抛异常Yar_Client_Packager_Exception: unpack error at offset 0 of -8 bytes

    Yar rpc接口处理返回较多数据时抛异常Yar_Client_Packager_Exception: unpack error at offset 0 of -8 bytes

    运行环境描述:

    Ubuntu 16.04.3 LTS,PHP7.2, client yar version 2.0.4 server Yar version 2.0.4 image


    问题场景描述:

    提供数据的rpc接口一次性从数据库中取出10000行数据,每行数据大小平均1800字节,

    进行处理再json_encode后return,抛出Yar异常错误 Yar_Client_Packager_Exception: unpack error at offset 0 of -8 bytes

    经自测验证,若减少数据行到5000行数据,则正常返回,

    或最终优化陈旧代码的select *仅返回需要的字段值,则也可正常返回。

    opened by BensonWuu 1
  • 并行调用服务超时,并没有回调 error_callback

    并行调用服务超时,并没有回调 error_callback

    并行调用 Yar_Concurrent_Client::call , 服务超时, 并没有回调 error_callback, 而且并行调用的 YAR_OPT_TIMEOUT 设置没有效果

    opened by caohao-php 1
  • 配置出错

    配置出错

    configure: error: Please reinstall the libcurl distribution - easy.h should be in /include/curl/

    opened by infatu8 2
  • delete the redundant code

    delete the redundant code

    If the magic_num not equal YAR_PROTOCOL_MAGIC_NUM. the return null, and don't need the code "header->magic_num = htonl(header->magic_num);", I think.

    opened by netbird 0
  • 'Yar_Client_Transport_Exception server responsed non-200 code 405

    'Yar_Client_Transport_Exception server responsed non-200 code 405

    'Yar_Client_Transport_Exception server responsed non-200 code "405" client yar version 1.2.5 server yar version 2.0.4

    opened by king52311 1
  • Javascript Yar client?

    Javascript Yar client?

    Hi Mr Laruence,

    I was used Yar for connecting two laravel servers, but now i want to use Yar client on javascript for requesting to Yar server on Laravel, so how to do it? Do you have any plan for yar client on javascript? Thanks you.

    Best regards,

    opened by bahung1221 0
  • 关于Yar的数据包的问题

    关于Yar的数据包的问题

    我打算研究弄一个其他语言的服务端用于远程调用,但是在开发的时候发现,拦截到的Yar数据包的包头里有一大截是空的。 但是header之后的packager_name和body又能正确获取 tim 20180426225904

    opened by Y2Nk4 5
  • curl exec failed 'Couldn't connect to server'

    curl exec failed 'Couldn't connect to server'

    curl exec failed 'Couldn't connect to server' 鸟哥 Yar Client 调用server的方法就出现这个错误提示,求指导

    opened by cnjackven 7
Owner
Xinchen Hui
PHP Stylite
Xinchen Hui
DoraRPC is an RPC For the PHP MicroService by The Swoole

Dora RPC 简介(Introduction) Dora RPC 是一款基础于Swoole定长包头通讯协议的最精简的RPC, 用于复杂项目前后端分离,分离后项目都通过API工作可更好的跟踪、升级、维护及管理。 问题提交: Issue For complex projects separation

Chang Long Xu 471 Dec 14, 2021
CleverStyle Framework is simple, scalable, fast and secure full-stack PHP framework

CleverStyle Framework is simple, scalable, fast and secure full-stack PHP framework. It is free, Open Source and is distributed under Free Public Lice

Nazar Mokrynskyi 149 Aug 12, 2021
I made my own simple php framework inspired from laravel framework.

Simple MVC About Since 2019, I started learning the php programming language and have worked on many projects using the php framework. Laravel is one

null 13 Nov 17, 2021
PHPR or PHP Array Framework is a framework highly dependent to an array structure.

this is new repository for php-framework Introduction PHPR or PHP Array Framework is a framework highly dependent to an array structure. PHPR Framewor

Agung Zon Blade 1 Dec 26, 2021
I made my own simple php framework inspired from laravel framework.

Simple MVC About Since 2019, I started learning the php programming language and have worked on many projects using the php framework. Laravel is one

Rizky Alamsyah 13 Nov 17, 2021
Framework X is a simple and fast micro framework based on PHP

Framework X is a simple and fast micro framework based on PHP. I've created a simple CRUD application to understand how it works. I used twig and I created a custom middleware to handle PUT, DELETE methods.

Mahmut Bayri 2 Jan 19, 2022
Framework X – the simple and fast micro framework for building reactive web applications that run anywhere.

Framework X Framework X – the simple and fast micro framework for building reactive web applications that run anywhere. Quickstart Documentation Tests

Christian Lück 350 Jan 12, 2022
FuelPHP v1.x is a simple, flexible, community driven PHP 5.3+ framework, based on the best ideas of other frameworks, with a fresh start! FuelPHP is fully PHP 7 compatible.

FuelPHP Version: 1.8.2 Website Release Documentation Release API browser Development branch Documentation Development branch API browser Support Forum

Fuel 1.5k Jan 6, 2022
An asynchronous event driven PHP socket framework. Supports HTTP, Websocket, SSL and other custom protocols. PHP>=5.3.

Workerman What is it Workerman is an asynchronous event-driven PHP framework with high performance to build fast and scalable network applications. Wo

walkor 9.7k Jan 18, 2022
Fast php framework written in c, built in php extension

Yaf - Yet Another Framework PHP framework written in c and built as a PHP extension. Requirement PHP 7.0+ (master branch)) PHP 5.2+ (php5 branch) Inst

Xinchen Hui 4.5k Jan 12, 2022
💫 Vega is a CLI mode HTTP web framework written in PHP support Swoole, WorkerMan / Vega 是一个用 PHP 编写的 CLI 模式 HTTP 网络框架,支持 Swoole、WorkerMan

Mix Vega 中文 | English Vega is a CLI mode HTTP web framework written in PHP support Swoole, WorkerMan Vega 是一个用 PHP 编写的 CLI 模式 HTTP 网络框架,支持 Swoole、Work

Mix PHP 40 Jan 10, 2022
A PHP framework for web artisans.

About Laravel Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experie

The Laravel Framework 68k Jan 18, 2022
The Symfony PHP framework

Symfony is a PHP framework for web and console applications and a set of reusable PHP components. Symfony is used by thousands of web applications (in

Symfony 26.3k Jan 14, 2022
Open Source PHP Framework (originally from EllisLab)

What is CodeIgniter CodeIgniter is an Application Development Framework - a toolkit - for people who build web sites using PHP. Its goal is to enable

B.C. Institute of Technology 18.2k Jan 18, 2022
Yii 2: The Fast, Secure and Professional PHP Framework

Yii 2 is a modern framework designed to be a solid foundation for your PHP application. It is fast, secure and efficient and works right out of the bo

Yii Software 13.9k Jan 12, 2022
CakePHP: The Rapid Development Framework for PHP - Official Repository

CakePHP is a rapid development framework for PHP which uses commonly known design patterns like Associative Data Mapping, Front Controller, and MVC. O

CakePHP 8.5k Jan 10, 2022
Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs.

Slim Framework Slim is a PHP micro-framework that helps you quickly write simple yet powerful web applications and APIs. Installation It's recommended

Slim Framework 11.2k Jan 18, 2022
High performance, full-stack PHP framework delivered as a C extension.

Phalcon Framework Phalcon is an open source web framework delivered as a C extension for the PHP language providing high performance and lower resourc

The Phalcon PHP Framework 10.5k Jan 19, 2022
🚀 PHP Microservice Full Coroutine Framework

PHP microservice coroutine framework 中文说明 Introduction Swoft is a PHP microservices coroutine framework based on the Swoole extension. Like Go, Swoft

Swoft Cloud 5.4k Jan 18, 2022