Phalcon 框架 Phalcon 是開源、全功能棧、使用 C 擴展編寫、針對高性能優(yōu)化的 PHP 框架。 開發(fā)者不需要學(xué)習(xí)和使用 C 語言的功能, 因為所有的功能都以 PHP 類的方式呈現(xiàn)出來,可以直接使用。 Phalcon 也是松耦合的,可以根據(jù)項目的需要任意使用其他對象。
Phalcon 是一套實現(xiàn)MVC架構(gòu)的高性能PHP應(yīng)用程序框架。初始版本發(fā)布于2012年11月,開放源代碼并基于BSD授權(quán)條款。與其他大部分的PHP框架不同,Phalcon是以擴展的方式以C語言所編寫,因此Phalcon的執(zhí)行速度高過其他PHP框架,并且消耗更少的資源,根據(jù)官方的測試,Phalcon是世界上速度最快的PHP框架, 沒有之一。
具體的介紹參見技術(shù)文檔
下面著重介紹數(shù)據(jù)庫連接部分
數(shù)據(jù)庫抽象層(Database Abstraction Layer)
Phalcon\Db
是Phalcon\Mvc\Model
底層組件,由它驅(qū)動框架中的模型層。它完全由C語言編寫,是一個獨立的數(shù)據(jù)庫高級抽象層。
與傳統(tǒng)模型相比,該組件允許更底層的數(shù)據(jù)庫操作。
數(shù)據(jù)庫適配器(Database Adapters)
該組件使用適配器來封裝特定的數(shù)據(jù)庫操作。Phalcon使用PDO連接數(shù)據(jù)庫,支持下列數(shù)據(jù)庫引擎:
類
說明
Phalcon\Db\Adapter\Pdo\Mysql
世界上最流行的關(guān)系型數(shù)據(jù)庫系統(tǒng)(RDBMS),作為服務(wù)器運行,支持多用戶、多數(shù)據(jù)庫訪問
Phalcon\Db\Adapter\Pdo\Postgresql
Postgresql是一個強大的開源關(guān)系數(shù)據(jù)庫系統(tǒng),超過15年的發(fā)展和通過驗證的架構(gòu),為其贏得了正確、可靠、數(shù)據(jù)完整的良好聲譽
Phalcon\Db\Adapter\Pdo\Sqlite
SQLite是一個實現(xiàn)自包含、無服務(wù)、零配置的事務(wù)型數(shù)據(jù)庫
數(shù)據(jù)庫語言(Database Dialects)
phalcon語言封裝了每個數(shù)據(jù)庫的具體操作,為適配器提供通用方法和SQL生成器。
類
說明
Phalcon\Db\Dialect\Mysql
MySQL特定語言
Phalcon\Db\Dialect\Postgresql
Postgresql特定語言
Phalcon\Db\Dialect\Sqlite
SQLite特定語言
工廠類(Factory)
使用適配器選項加載PDO:
<?php use Phalcon\Db\Adapter\Pdo\Factory; $options = [ 'host' => 'localhost', 'dbname' => 'blog', 'port' => 3306, 'username' => 'sigma', 'password' => 'secret', 'adapter' => 'postgresql', ]; $db = Factory::load($options);
連接數(shù)據(jù)庫(Connection to Databases)
建立數(shù)據(jù)庫連接,必須實例化適配器類,它只接收一個包含連接參數(shù)的數(shù)組。下面例子展示了如何傳遞必選參數(shù)和可選參數(shù)來建立數(shù)據(jù)庫連接:
<?php // 必選參數(shù) $config = [ 'host' => 'localhost', 'username' => 'postgres', 'password' => 'secret1', 'dbname' => 'template', ]; // 可選參數(shù) $config['schema'] = 'public'; // 建立連接 $connection = new \Phalcon\Db\Adapter\Pdo\Postgresql($config);
使用工廠類連接數(shù)據(jù)庫(Connecting using Factory)
使用一個簡單的ini文件來配置 / 連接數(shù)據(jù)庫。
[database] host = TEST_DB_MYSQL_HOST username = TEST_DB_MYSQL_USER password = TEST_DB_MYSQL_PASSWD dbname = TEST_DB_MYSQL_NAME port = TEST_DB_MYSQL_PORT charset = TEST_DB_MYSQL_CHARSET adapter = mysql
<?php use Phalcon\Config\Adapter\Ini; use Phalcon\Db\Adapter\Pdo\Factory; use Phalcon\Di; $di = new Di(); $config = new Ini('config.ini'); $di->set('config', $config); $di->set( 'db', function () { return Factory::load($this->config->database); } );
配置擴展
? 注意:phalcond和PHP的版本要對應(yīng);安裝phalcon拓展必須先安裝psr拓展;如果是windows下安裝phalcon一定要注意nts和非nts版本,查看如下圖:
示例代碼 結(jié)構(gòu)圖如下:
主要文件介紹
config.php
配置對象,位于app/config
return new \Phalcon\Config([ 'database' => [ 'adapter' => 'Postgresql', 'host' => 'localhost', 'username' => 'test', 'password' => 'test', 'dbname' => 'test', 'charset' => 'utf8' ], 'application' => [ 'appDir' => APP_PATH . '/', 'controllersDir' => APP_PATH . '/controllers/', 'modelsDir' => APP_PATH . '/models/', 'migrationsDir' => APP_PATH . '/migrations/', 'viewsDir' => APP_PATH . '/views/', 'pluginsDir' => APP_PATH . '/plugins/', 'libraryDir' => APP_PATH . '/library/', 'cacheDir' => BASE_PATH . '/cache/', //'baseUri' => '/', 'baseUri' => preg_replace('/public([\/\\\\])index.php$/', '', $_SERVER["PHP_SELF"]) ] ]);
services.php
配置對象,位于app/config
/** * Database connection is created based in the parameters defined in the configuration file */ $di->setShared('db', function () { $config = $this->getConfig(); $class = 'Phalcon\Db\Adapter\Pdo\\' . $config->database->adapter; $params = [ 'host' => $config->database->host, 'username' => $config->database->username, 'password' => $config->database->password, 'dbname' => $config->database->dbname, 'charset' => $config->database->charset ]; if ($config->database->adapter == 'Postgresql') { unset($params['charset']); } return new $class($params); });
User.php
model類對象 ,位于app/models
<?php use Phalcon\Mvc\Model; class User extends Model{ public $id; public $name; public $age; }
IndexController.php
controller控制器對象,位于app/controllers
<?php declare(strict_types=1); class IndexController extends ControllerBase { public function indexAction() { } public function testAction(){ $res=User::find("id = 1"); return json_encode($res,JSON_UNESCAPED_UNICODE); } }
執(zhí)行結(jié)果:
注意事項 1、提示:could not find driver
? 解決方案如下:檢查是否啟用pdo_pgsql插件