PhalCon + est un framework Zephir / C léger basé sur Phalconphp. Nous voulons créer une solution en une étape pour les développeurs PhalCon. C'est précisément à cause de la flexibilité extrêmement élevée de Phalcon qui donne aux développeurs trop de choix. Parfois, il y a trop d'intersections et il est facile de se perdre, donc après avoir fait cette série de choix, j'ai enregistré le processus et évolué progressivement en Phalcon + actuel. Afin d'empêcher chaque développeur de faire ces choix à plusieurs reprises, je suis résolument open source Phalcon + pour que tout le monde puisse communiquer et apprendre.
Donc, pour résumer, Phalcon + n'est pas un tout nouveau cadre, mais une excellente pratique du cadre Phalcon. Il s'agit d'un retraitement et d'un complément au cadre Phalcon. Il peut permettre aux développeurs de Phalcon de commencer et de le maîtriser plus facilement, et enfin d'atteindre le plus haut niveau d'unité entre l'homme et la nature.
* 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`
Srv fournit des services RPC Web peut fournir des services RESTFulApp::import("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
graphique TD
A [phalconplus bootstrap :: __ construction] -> | sys :: init, initConf | A1 (SuperApp :: Boot avec Env, RunMode)
A1 -> | SYS :: INIAPP, Définir les constantes mondiales, le premier module est principal | A2 (SuperApp :: BootPrimaryModule)
A2 -> | Assurez-vous que nous avons un module valide: Web / CLI / SRV | A3 (moduleDef)
A3 -> | Attribuez SuperApp :: démarré -> true, faites-en un defaultModule | a4 (superapp :: registremodule avec moduleDef)
A4 -> | Assurez-vous que ce module n'est pas en cours d'exécution dans SuperApp :: Modules | A5 (module de paiement)
A5 -> | AbstractModule :: RegisterAutoloaders / Registerservices / RegisterEvents | A6 (SYS :: Load ComposerAutoloAdpath)
A6 -> A7 (SuperApp :: Handle)
A7 -> | params = func_get_args, événement: SuperApp: avantexecmodule | b1 (superapp :: defaultModule-> exec avec params)
B1 -> | Événement: SuperApp: AfterExecModule | B2 (AbstractModule :: RegisterEngine)
B2 -> | Événement: Module: Beforestartengine | B3 (AbstractModule :: Exec avec paramètres)
B3 -> B31 (RunMode: CLI) -> C1 (phalcon cli console :: handle) -> d1
B3 -> B32 (RunMode: Web)
B3 -> B33 (RunMode: SRV)
B32 -> c2 {moteur web :: handler est}
C2 -> | Demande: Guzzlehttp \ psr7 \ serverRequest | C21 (psrhandler :: manche) -> d1
C2 -> | reqeust: chaîne | c22 (phalcon mvc application :: manche) -> d1
C2 -> C23 (Saufon: gestionnaire non valide)
B33 -> c3 {application.handler == yar?}
C3 -> | Oui | C31 (Yarservice :: Handle) -> D1
C3 -> | Non | C32 (Simpleservice :: Handle) -> D1
D1 (événement: module: AfterStartengine) -> | Événement: SuperApp: AfterExecModule | D2 (retour)
# 下载骨架
➜ 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 ...
...
...
La structure d'un module Web est la suivante: tous les modes sont intégrés dans le module Web, y compris CLI et 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
➜ ./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 访问 ➜ cd test
➜ ../vendor/bin/ppm start --bridge="PhalconPlus\Bridge" --bootstrap="PhalconPlus\Bootstrap" --static-directory=public/ --port=8181 --workers=2
Bien sûr, vous pouvez également créer des fichiers de configuration pour faciliter le démarrage à chaque fois
➜ cd test
➜ touch ppm.json
➜ ../vendor/bin/ppm start -c ppm.json
Le contenu de ppm.json est le suivant:
{
"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/[email protected]/bin/php "
} ➜ composer require spiral/roadrunner
➜ cd test
➜ touch .rr.json
➜ touch psr-worker.php
Le contenu de .rr.json est le suivant:
{
"http" : {
"address" : " 0.0.0.0:8181 " ,
"workers" : {
"command" : " /usr/local/opt/[email protected]/bin/php psr-worker.php " ,
"relay" : " unix://rr.sock " ,
"pool" : {
"numWorkers" : 2
}
}
},
"static" : {
"enable" : true ,
"dir" : " public " ,
"forbid" : [ " .php " , " .htaccess " ]
}
}Le contenu de psr-worker.php est le suivant:
<?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 );
}Puis exécutez dans le répertoire du module
➜ rr serve -d -v
Fichier de configuration
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 ;
}
}Tous les commentaires sont les bienvenus et j'espère recevoir des dons et un soutien de tous.
Je vous souhaite tout le meilleur, pas de frère 82 :)