因为工作需要,最近开始学习php,除了语言自身肯定还要学习类库,翻来覆去找了半天的php框架,最后选择了Phalcon,理由吗,很简单,安装容易,毕竟我不是专业写程序的,写程序只是我工作中用以提高工作效率的工具而已,所以不能说一切从简,但是不能按照计算机科学家的水平来做。因为笔者不是高手,所以文章主要是记录自己的学习之路,更适合初学者,请高手手下留情,勿喷。
Phalcon是一个php的MVC框架,是用C开发的php扩展,所以运行速度比其他php写的框架要快很多,它还自创了一个Zephir的语言,据说可以用php写php扩展,然后像C一样编译,这样运行速度会快,不过笔者没有去深入研究,先用好Phalcon就可以了。目前Phalcon的最新版本是2.0.x
笔者是在Windows下运行开发的,首先安装Apache和php,然后到
https://phalconphp.com/en/download/windows
下载对应的版本,Phalcon只要和php版本匹配即可,注意有3个参数:一个是php版本,只要x.y.z中的x和y对应即可,不必追求z的一致,因为z的升级都是打补丁,不是改功能;第二个是线程安全TS还是非线程安全NTS(Non Thread Safe);其实还应该有一个参数,就是编译器版本,Phalcon用的编译器必须和php用的一致,其实它们官方确实用的是同一个版本的编译器,所以也就不用担心了,只不过在安装Apache和php时要注意,他们俩个也应该一致。
然后在php.ini里面加上
extension=php_phalcon.dll
就可以了
如果是Unix-like系统
https://www.phalconphp.com/en/download
有对应的安装方法
Phalcon的启动方式和其他框架类似,通过对url的重定向,可以把url中的各个段识别为参数,传递给index.php,然后通过index.php这个入口文件来解释这些参数,实现MVC,这种方式也就是俗称的RESTfull API
也就是说,首先需要在http服务器中设置url重定向,Phalcon提供了一个专供Apache的.htaccess文件
AddDefaultCharset UTF-8
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
</IfModule>
如果使用其他http服务器,配置会有所不同,具体请参看各服务器的文档
在index.php这个入口文件中,Phalcon推荐使用自带的\Phalcon\Mvc\Application类作为入口,它自带了默认的很多配置,不需要过多的细节就可以顺利启动
首先需要一个加载器Loader,然后为这个载入器注册目录,注册目录里的所有后缀为php的文件都会被其识别,并采用lazy load的方式载入,延迟加载就是只有在需要的时候才生成类的实例,这样可以节省内存开销。自然这些目录里都是Controller类和Model类,也就是MVC中的C和M,V对应的是View,一般不使用类的方式。
然后需要一个依赖注入器DI,依赖注入的概念请自行Google,初学者可以理解为依赖注入器会通过加载器在需要的时候载入lazy load的类,并且处理好它们之间的关系,这一切都是全自动的。依赖注入器除了要处理加载器以外,还需要处理类之间的关系,这就需要一些额外的配置,比如['db']之类,这些设置被称为服务注册
设定好加载器和依赖注入器之后就可以用依赖注入器作为\Phalcon\Mvc\Application类的初始化参数,初始化这个\Phalcon\Mvc\Application类,然后调用
$application->handle()->getContent()
就可以输出结果了。
如果需要更安全的使用,还可以使用php的异常机制try...catch
<?php
use Phalcon\Loader;
use Phalcon\Tag;
use Phalcon\Mvc\Url;
use Phalcon\Mvc\View;
use Phalcon\Mvc\Application;
use Phalcon\DI\FactoryDefault;
use Phalcon\Db\Adapter\Pdo\Mysql as DbAdapter;
try {
// Register an autoloader
$loader = new Loader();
$loader->registerDirs(
array(
'../app/controllers/',
'../app/models/'
)
)->register();
// Create a DI
$di = new FactoryDefault();
// Set the database service
$di['db'] = function() {
return new DbAdapter(array(
"host" => "localhost",
"username" => "root",
"password" => "secret",
"dbname" => "tutorial"
));
};
// Setting up the view component
$di['view'] = function() {
$view = new View();
$view->setViewsDir('../app/views/');
return $view;
};
// Setup a base URI so that all generated URIs include the "tutorial" folder
$di['url'] = function() {
$url = new Url();
$url->setBaseUri('/tutorial/');
return $url;
};
// Setup the tag helpers
$di['tag'] = function() {
return new Tag();
};
// Handle the request
$application = new Application($di);
echo $application->handle()->getContent();
} catch (Exception $e) {
echo "Exception: ", $e->getMessage();
}
如果你想了解Application类的详细启动过程,可以参考官方文档
https://docs.phalconphp.com/en/latest/reference/applications.html#manual-bootstrapping
或者中文资料
http://avnpc.com/pages/phalcon-mvc-process
笔者如果有空,未来也会添加相关内容