Skip to content

bullsoft/phalconplus

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

359 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Phalcon+

Phalcon+ ๆ˜ฏไธ€ไธช่ฝป้‡็บง็š„ๅŸบไบŽ PhalconPHP ็š„Zephir/Cๆก†ๆžถใ€‚ๆˆ‘ไปฌๆƒณไธบPhalconๅผ€ๅ‘่€…ๆž„ๅปบไธ€ไธชไธ€ๆญฅๅˆฐไฝ็š„่งฃๅ†ณๆ–นๆกˆใ€‚ๆญฃๆ˜ฏๅ› ไธบPhalconๆž้ซ˜็š„็ตๆดปๆ€ง๏ผŒ่ต‹ไบˆไบ†ๅผ€ๅ‘่€…่ฟ‡ๅคš็š„้€‰ๆ‹ฉๆƒใ€‚ๆœ‰ๆ—ถๅ€™่ทฏๅฃๅคชๅคšๅฎนๆ˜“่ฟทๅคฑ๏ผŒๆ‰€ไปฅๅฝ“ๆˆ‘ๅšๅฎŒ่ฟ™ไธ€็ณปๅˆ—้€‰ๆ‹ฉๅŽ๏ผŒๆˆ‘ๆŠŠ่ฟ™ไธช่ฟ‡็จ‹่ฎฐๅฝ•ไบ†ไธ‹ๆฅ๏ผŒๅนถ้€ๆธๆผ”ๅŒ–ๆˆไบ†็Žฐๅœจ็š„Phalcon+ใ€‚ไธบไบ†่ฎฉๆฏไธชๅผ€ๅ‘่€…ไธ้‡ๅคๅŽปๅš่ฟ™ไบ›้€‰ๆ‹ฉ๏ผŒๆˆ‘ๆฏ…็„ถๅฐ†Phalcon+ๅผ€ๆบ๏ผŒไพ›ๅคงๅฎถไบคๆตๅ’Œๅญฆไน ใ€‚

So, ๆ€ป็ป“ๆฅ่ฏด๏ผŒPhalcon+ๅนถไธๆ˜ฏไธ€ไธชๅ…จๆ–ฐ็š„ๆก†ๆžถ๏ผŒ่€Œๆ˜ฏๅฏนPhalconๆก†ๆžถ็š„ไธ€ๆฌกไผ˜็ง€ๅฎž่ทต๏ผŒๆ˜ฏๅฏนPhalconๆก†ๆžถ็š„ๅ†ๆฌกๅŠ ๅทฅๅ’Œ่กฅๅ……๏ผŒ่ƒฝ่ฎฉPhalconๅผ€ๅ‘่€…ๆ›ด็ฎ€ๅ•ๅœฐๅ…ฅ้—จๅ’Œ็ฒพ้€š๏ผŒๆœ€ๅŽ่พพๅˆฐๅคฉไบบๅˆไธ€็š„ๆœ€้ซ˜ๅขƒ็•Œใ€‚

ไพ่ต–

* PHP 7.0 or above
* cPhalcon 3.4.x๏ผŒๅœจๅฎ˜ๆ–นๅ‘ๅธƒ3.4.6ไน‹ๅ‰ไธ€ๅฎš่ฆไธ‹่ฝฝๆญคๅˆ†ๆ”ฏ๏ผŒ้€š่ฟ‡`zephir build`ๆ‰‹ๅŠจ็ผ–่ฏ‘phalcon - https://github.com/phalcon/cphalcon/tree/3.4.x
  > ๅฎ‰่ฃ…zephirไน‹ๅ‰๏ผŒ้œ€่ฆๅ…ˆๅฎ‰่ฃ…ๆ‰ฉๅฑ• https://github.com/phalcon/php-zephir-parser ๏ผŒ็„ถๅŽไฝฟ็”จ`composer`ๅฎ‰่ฃ…`zephir`
  `composer global require phalcon/zephir`

็บฆๆŸ

  • ไธๆ”ฏๆŒPhalcon็š„ๅคšๆจกๅ—็ป“ๆž„๏ผŒPhalcon+ๆœ‰่‡ชๅทฑ็š„ๆจกๅ—ๆœบๅˆถ
  • ๆ‰€ๆœ‰ๆจกๅ—็›ฎๅฝ•็ป“ๆž„้ƒฝๆ˜ฏๅŒๆž„็š„
  • ๆจกๅ—ๆ˜ฏๆœ‰ๅทฅไฝœๆจกๅผ็š„๏ผŒๅฆ‚๏ผšWeb, Srv, Cli็ญ‰...๏ผŒไธๅŒๆจกๅผ็š„ๆจกๅ—่ง’่‰ฒไธไธ€ๆ ท
  • ๆ— ่ฎบๅ“ช็งๆจกๅผ๏ผŒๅ…ฅๅฃๆ–‡ไปถ้ƒฝๅฎŒๅ…จไธ€ๆ ท
  • ๅ†…็ฝฎRPCๆœๅŠก็ซฏๅ’Œๅฎขๆˆท็ซฏ
  • ๆ‰€ๆœ‰ๆจกๅ—้ƒฝไพ่ต–ๅ…จๅฑ€็š„common๏ผˆๅฎž้™…ไธŠๆ˜ฏไธ€ไธชPhalcon+Cliๆจกๅ—๏ผ‰

MaaS & MaaL

  • MaaS(Module as a Service): Phalcon+ๆจกๅ—ๅณๆœๅŠก๏ผŒSrvๆไพ›RpcๆœๅŠก๏ผŒWebๅฏๆไพ›RestfulๆœๅŠก
  • MaaL(Module as a Library): Phalcon+ๆจกๅ—ๅณ็ฑปๅบ“๏ผŒๅฏๅœจ้กน็›ฎๅ…ถไป–ๆจกๅ—้€š่ฟ‡App::import("test")ๅผ•ๅ…ฅtestๆจกๅ—

ๅฎ‰่ฃ…

โžœ git clone https://github.com/bullsoft/phalconplus.git
โžœ cd phalconplus/ext/
โžœ /usr/bin/phpize
โžœ ./configure --with-php-config=/usr/bin/php-configure
โžœ make
โžœ make install

ๆก†ๆžถๆ‰ง่กŒๆต็จ‹

graph TD
    A[PhalconPlus\Bootstrap::__construct] -->|Sys::init, initConf| A1(SuperApp::boot with Env, RunMode)
    A1 --> |Sys::iniApp, Define global constants, The first module is primary| A2(SuperApp::bootPrimaryModule)
    A2 --> |Make sure we have a valid module: Web/Cli/Srv|A3(ModuleDef)
    A3 --> |Assign SuperApp::booted -> true, Make this a defaultModule |A4(SuperApp::registerModule with ModuleDef)
    A4 --> |Make sure this module is not running in SuperApp::modules|A5(Checkout Module)
    A5 --> |AbstractModule::registerAutoloaders/registerServices/registerEvents|A6(Sys::load ComposerAutoloadPath)
    A6 --> A7(SuperApp::handle)
    A7 --> |params=func_get_args, Event: superapp:beforeExecModule|B1(SuperApp::defaultModule->exec with params)
    B1 --> |Event: superapp:afterExecModule|B2(AbstractModule::registerEngine)
    B2 --> |Event: module:beforeStartEngine|B3(AbstractModule::exec with params)
    B3 --> B31(RunMode: Cli) --> C1(Phalcon\Cli\Console::handle)  --> D1
    B3 --> B32(RunMode: Web)
    B3 --> B33(RunMode: Srv)
    B32 --> C2{Engine\Web::handler is}
    C2 --> |request:GuzzleHttp\\Psr7\\ServerRequest|C21(PsrHandler::handle) --> D1
    C2 --> |reqeust:String|C22(Phalcon\Mvc\Application::handle) --> D1
    C2 --> C23(Excepton: Invalid Handler)
    B33 --> C3{application.handler==yar?}
    C3 --> |yes|C31(YarService::handle)  --> D1
    C3 --> |no|C32(SimpleService::handle)  --> D1
    D1(Event: module:afterStartEngine) --> |Event: superapp:afterExecModule|D2(Return)
Loading

ๅˆ›ๅปบๅบ”็”จ

# ไธ‹่ฝฝ้ชจๆžถ
โžœ composer create-project bullsoft/fp-project fp-app
# ็”Ÿๆˆๆจกๅ—๏ผŒๅ‡่ฎพ็”Ÿๆˆ็š„ๆจกๅ—ๅไธบtest
โžœ cd fp-app
โžœ ./common/bin/fp-devtool module:create

็Žฐๅœจๅผ€ๅง‹ๅผ•ๅฏผๆ‚จๅˆ›ๅปบPhalcon+ๆจกๅ— ...
Step 1 ่ฏท่พ“ๅ…ฅ่ฏฅๆจกๅ—็š„ๅ็งฐ๏ผŒๅฆ‚"api"
[Enter]: test
Step 2 ...
...
...

ไธ€ไธชWebๆจกๅ—็š„็ป“ๆž„ๅฆ‚ไธ‹๏ผŒWebๆจกๅ—ไธญ้›†ๆˆไบ†ๆ‰€ๆœ‰็š„ๆจกๅผ๏ผŒๅŒ…ๆ‹ฌCli๏ผŒRpcServiceใ€‚

test
.
โ”œโ”€โ”€ app
โ”‚   โ”œโ”€โ”€ Module.php
โ”‚   โ”œโ”€โ”€ auth
โ”‚   โ”‚   โ”œโ”€โ”€ AclResources.php
โ”‚   โ”‚   โ”œโ”€โ”€ Model.php
โ”‚   โ”‚   โ”œโ”€โ”€ Resources
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Actions.php
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ Models.php
โ”‚   โ”‚   โ””โ”€โ”€ User.php
โ”‚   โ”œโ”€โ”€ config
โ”‚   โ”‚   โ””โ”€โ”€ dev.php
โ”‚   โ”œโ”€โ”€ controllers
โ”‚   โ”‚   โ”œโ”€โ”€ BaseController.php
โ”‚   โ”‚   โ”œโ”€โ”€ ErrorController.php
โ”‚   โ”‚   โ”œโ”€โ”€ IndexController.php
โ”‚   โ”‚   โ”œโ”€โ”€ UserController.php
โ”‚   โ”‚   โ””โ”€โ”€ apis
โ”‚   โ”‚       โ””โ”€โ”€ DemoController.php
โ”‚   โ”œโ”€โ”€ events
โ”‚   โ”‚   โ”œโ”€โ”€ Acl.php
โ”‚   โ”‚   โ”œโ”€โ”€ AppConsole.php
โ”‚   โ”‚   โ”œโ”€โ”€ AppHandler.php
โ”‚   โ”‚   โ”œโ”€โ”€ BackendServer.php
โ”‚   โ”‚   โ”œโ”€โ”€ Db.php
โ”‚   โ”‚   โ”œโ”€โ”€ EventProvider.php
โ”‚   โ”‚   โ”œโ”€โ”€ Model.php
โ”‚   โ”‚   โ”œโ”€โ”€ MvcDispatch.php
โ”‚   โ”‚   โ”œโ”€โ”€ Router.php
โ”‚   โ”‚   โ”œโ”€โ”€ SuperApp.php
โ”‚   โ”‚   โ””โ”€โ”€ View.php
โ”‚   โ”œโ”€โ”€ exceptions
โ”‚   โ”‚   โ”œโ”€โ”€ EnumExceptionCode.php
โ”‚   โ”‚   โ”œโ”€โ”€ Handler.php
โ”‚   โ”‚   โ”œโ”€โ”€ UnknownException.php
โ”‚   โ”‚   โ”œโ”€โ”€ UserAlreadyExistsException.php
โ”‚   โ”‚   โ””โ”€โ”€ UserNotExistsException.php
โ”‚   โ”œโ”€โ”€ plugins
โ”‚   โ”‚   โ””โ”€โ”€ Volt.php
โ”‚   โ”œโ”€โ”€ providers
โ”‚   โ”‚   โ”œโ”€โ”€ CookieServiceProvider.php
โ”‚   โ”‚   โ”œโ”€โ”€ CryptServiceProvider.php
โ”‚   โ”‚   โ”œโ”€โ”€ DatabaseServiceProvider.php
โ”‚   โ”‚   โ”œโ”€โ”€ DispatcherServiceProvider.php
โ”‚   โ”‚   โ”œโ”€โ”€ LoggerServiceProvider.php
โ”‚   โ”‚   โ”œโ”€โ”€ RedisServiceProvider.php
โ”‚   โ”‚   โ”œโ”€โ”€ RouterServiceProvider.php
โ”‚   โ”‚   โ”œโ”€โ”€ RpcServiceProvider.php
โ”‚   โ”‚   โ”œโ”€โ”€ ServiceProvider.php
โ”‚   โ”‚   โ”œโ”€โ”€ SessionServiceProvider.php
โ”‚   โ”‚   โ”œโ”€โ”€ UrlServiceProvider.php
โ”‚   โ”‚   โ””โ”€โ”€ ViewServiceProvider.php
โ”‚   โ”œโ”€โ”€ routes
โ”‚   โ”‚   โ”œโ”€โ”€ Api.php
โ”‚   โ”‚   โ””โ”€โ”€ Bare.php
โ”‚   โ””โ”€โ”€ views
โ”‚       โ”œโ”€โ”€ error
โ”‚       โ”‚   โ”œโ”€โ”€ show403.volt
โ”‚       โ”‚   โ”œโ”€โ”€ show404.volt
โ”‚       โ”‚   โ””โ”€โ”€ show500.volt
โ”‚       โ”œโ”€โ”€ index
โ”‚       โ”‚   โ””โ”€โ”€ index.volt
โ”‚       โ””โ”€โ”€ index.volt
โ”œโ”€โ”€ cli
โ”‚   โ”œโ”€โ”€ init.php
โ”‚   โ””โ”€โ”€ tasks
โ”‚       โ””โ”€โ”€ HelloTask.php
โ”œโ”€โ”€ public
โ”‚   โ”œโ”€โ”€ index.php
โ”‚   โ””โ”€โ”€ rpc.php
โ”œโ”€โ”€ src
โ”‚   โ”œโ”€โ”€ models
โ”‚   โ”‚   โ””โ”€โ”€ UserModel.php
โ”‚   โ”œโ”€โ”€ protos
โ”‚   โ”‚   โ”œโ”€โ”€ Enums
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ UserStatus.php
โ”‚   โ”‚   โ””โ”€โ”€ Schemas
โ”‚   โ”‚       โ””โ”€โ”€ RegInfo.php
โ”‚   โ””โ”€โ”€ services
โ”‚       โ”œโ”€โ”€ BaseService.php
โ”‚       โ””โ”€โ”€ DemoService.php
โ””โ”€โ”€ var
    โ””โ”€โ”€ cache

่ฟ่กŒ

ไฝฟ็”จPhalcon+DevTool

โžœ ./common/bin/fp-devtool server:start test

ๆญฃๅœจไธบๆ‚จๅฏๅŠจๆœๅŠกๅ™จ...
{
    "command": "{ (php -S 0.0.0.0:8181 -t public/ .htrouter.php) <&3 3<&- 3>/dev/null & } 3<&0;pid=$!; echo $pid > /path/to/test/var/run/server.pid",
    "pid": 8249,
    "running": true,
    "signaled": false,
    "stopped": false,
    "exitcode": -1,
    "termsig": 0,
    "stopsig": 0
}
... ๅฏๅŠจๆˆๅŠŸ๏ผŒ่ฏทไฝฟ็”จ http://127.0.0.1:8181 ่ฎฟ้—ฎ

ไฝฟ็”จPPM

โžœ cd test
โžœ ../vendor/bin/ppm start --bridge="PhalconPlus\\Bridge" --bootstrap="PhalconPlus\\Bootstrap" --static-directory=public/ --port=8181 --workers=2

ๅฝ“็„ถไนŸๅฏไปฅๅˆ›ๅปบ้…็ฝฎๆ–‡ไปถ๏ผŒไปฅไพฟๆฏๆฌกๅฏๅŠจๆ›ดๆ–นไพฟ

โžœ cd test
โžœ touch ppm.json
โžœ ../vendor/bin/ppm start -c ppm.json

ppm.jsonๅ†…ๅฎนๅฆ‚ไธ‹๏ผš

{
    "bridge": "PhalconPlus\\Bridge",
    "host": "127.0.0.1",
    "port": 8181,
    "workers": 2,
    "app-env": "dev",
    "debug": 1,
    "logging": 1,
    "static-directory": "public/",
    "bootstrap": "PhalconPlus\\Bootstrap",
    "max-requests": 1000,
    "concurrent-requests": 20,
    "php-cgi": "/usr/local/opt/php@7.2/bin/php"
}

ไฝฟ็”จRoadRunner

โžœ composer require spiral/roadrunner
โžœ cd test
โžœ touch .rr.json
โžœ touch psr-worker.php

.rr.jsonๅ†…ๅฎนๅฆ‚ไธ‹๏ผš

{
  "http": {
    "address": "0.0.0.0:8181",
    "workers": {
      "command": "/usr/local/opt/php@7.2/bin/php psr-worker.php",
      "relay": "unix://rr.sock",
      "pool": {
        "numWorkers": 2
      }
    }
  },
  "static" : {
  	"enable" : true,
  	"dir": "public",
  	"forbid": [".php", ".htaccess"]
  }
}

psr-worker.phpๅ†…ๅฎนๅฆ‚ไธ‹๏ผš

<?php

use Spiral\Goridge;
use Spiral\RoadRunner;
use PhalconPlus\Http\PsrResponseFactory;

ini_set('display_errors', 'stderr');

$app = (new PhalconPlus\Bootstrap(__DIR__))->app();

$worker = new RoadRunner\Worker(
    new Goridge\SocketRelay(__DIR__."/rr.sock", null, Goridge\SocketRelay::SOCK_UNIX)
);

$psr7 = new RoadRunner\PSR7Client($worker);

while ($req = $psr7->acceptRequest()) {

    try {
        $resp = $app->handle($req);
    } catch (\Throwable $e) {
        Test\Exceptions\Handler::catch($e);
        $resp = $app->response();
    }

    $psr7->respond(PsrResponseFactory::create($resp));
    $app->terminate();
    unset($req, $resp);
}

็„ถๅŽๅœจๆจกๅ—็›ฎๅฝ•ไธ‹ๆ‰ง่กŒ

โžœ rr serve -d -v

ไฝฟ็”จNginx

้…็ฝฎๆ–‡ไปถ

server {
      listen 8181;
      server_name localhost;
      access_log  /var/log/nginx/test.access.log;

      index index.php index.html index.htm;

      set $root_path '/home/work/wwwroot/fp-app/test/public';

      root $root_path;

      try_files $uri $uri/ @rewrite;

      location @rewrite {
          rewrite ^/(.*)$ /index.php last;
      }

      location ~ \.php {
          fastcgi_pass unix:/run/php/php7.2-fpm.sock;
          include fastcgi_params;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      }

      location ~* ^/(css|img|js|flv|swf|download)/(.+)$ {
          root $root_path;
      }

      location ~ /\.ht {
          deny all;
      }

}

ๅ้ฆˆ&ๆ”ฏๆŒ

ๆฌข่ฟŽไปปไฝ•ๅ้ฆˆ๏ผŒไนŸๅธŒๆœ›ๅพ—ๅˆฐๅคงๅฎถ็š„ๆๅŠฉๆ”ฏๆŒใ€‚

็ฅไธ€ๅˆ‡้กบๅˆฉๆฒกๅ…ซไบŒๅ“ฅ :)