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(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)
# ไธ่ฝฝ้ชจๆถ
โ 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
้ ็ฝฎๆไปถ
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;
}
}ๆฌข่ฟไปปไฝๅ้ฆ๏ผไนๅธๆๅพๅฐๅคงๅฎถ็ๆๅฉๆฏๆใ
็ฅไธๅ้กบๅฉๆฒกๅ ซไบๅฅ :)