Phalcon 框架

Phalcon 是开源、全功能栈、使用 C 扩展编写、针对高性能优化的 PHP 框架。 开发者不需要学习和使用 C 语言的功能, 因为所有的功能都以 PHP 类的方式呈现出来,可以直接使用。 Phalcon 也是松耦合的,可以根据项目的需要任意使用其他对象。

Phalcon是一套实现MVC架构的高性能PHP应用程序框架。初始版本发布于2012年11月,开放源代码并基于BSD授权条款。与其他大部分的PHP框架不同,Phalcon是以扩展的方式以C语言所编写,因此Phalcon的执行速度高过其他PHP框架,并且消耗更少的资源,根据官方的测试,Phalcon是世界上速度最快的PHP框架, 没有之一。

具体的介绍参见技术文档

下面着重介绍数据库连接部分

数据库抽象层(Database Abstraction Layer)

Phalcon\DbPhalcon\Mvc\Model底层组件,由它驱动框架中的模型层。它完全由C语言编写,是一个独立的数据库高级抽象层。

与传统模型相比,该组件允许更底层的数据库操作。

数据库适配器(Database Adapters)

该组件使用适配器来封装特定的数据库操作。Phalcon使用PDO连接数据库,支持下列数据库引擎:

说明
Phalcon\Db\Adapter\Pdo\Mysql 世界上最流行的关系型数据库系统(RDBMS),作为服务器运行,支持多用户、多数据库访问
Phalcon\Db\Adapter\Pdo\Postgresql Postgresql是一个强大的开源关系数据库系统,超过15年的发展和通过验证的架构,为其赢得了正确、可靠、数据完整的良好声誉
Phalcon\Db\Adapter\Pdo\Sqlite SQLite是一个实现自包含、无服务、零配置的事务型数据库

数据库语言(Database Dialects)

phalcon语言封装了每个数据库的具体操作,为适配器提供通用方法和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);

连接数据库(Connection to Databases)

建立数据库连接,必须实例化适配器类,它只接收一个包含连接参数的数组。下面例子展示了如何传递必选参数和可选参数来建立数据库连接:

<?php

// 必选参数
$config = [
'host' => 'localhost',
'username' => 'postgres',
'password' => 'secret1',
'dbname' => 'template',
];

// 可选参数
$config['schema'] = 'public';

// 建立连接
$connection = new \Phalcon\Db\Adapter\Pdo\Postgresql($config);

使用工厂类连接数据库(Connecting using Factory)

使用一个简单的ini文件来配置 / 连接数据库。

[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的版本要对应;安装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

示例代码

结构图如下:

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);
}
}

执行结果:

image-20220616160046997

image-20220616160114647

注意事项

1、提示:could not find driver

​ 解决方案如下:检查是否启用pdo_pgsql插件

image-20220616154408385