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\DbPhalcon\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版本,查看如下圖:

image-20220616113222266

  • 打開php版本的擴展文件夾,如D:\AppServ\php7\ext,將下載的psrphalcon文件放入文件夾

    image-20220616112757591

  • 文件夾D:\AppServ\php7打開php.ini文件加入擴展

    image-20220616112906353

  • 驗證是否安裝成功

    image-20220616112940152

示例代碼

結(jié)構(gòu)圖如下:

image-20220616155331659

主要文件介紹

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é)果:

image-20220616160046997

image-20220616160114647

注意事項

1、提示:could not find driver

? 解決方案如下:檢查是否啟用pdo_pgsql插件

image-20220616154408385