内容简介:Phalcon 的那些坑
我用Phalcon-dev-tools创建了一个空的项目,然后比着文档一步一步往下做。刚开始还行,修改IndexController中的indexAction方法啥的都没有问题,可是,一旦自己写一个Controller或者在原有的Controller上添加其他 Action
方法,还是返回根路径 /
下的内容。
这tm是咋回事儿?
反复寻找答案,看文档的每一个细节,是否漏了某些代码?
环境没问题吧?这都跑起来了,肯定是代码问题吧?
问题原因以及解决
还真就是环境问题,不是 php 版本、Phalcon版本bug,是nginx配置问题!
坑!
Phalcon默认的URI信息是从 $_GET['_url']
获得,也可以设置为 $_SERER['REQUEST_URI']
获取。
使用这两种不同方法获取,还得要不同的nginx配置!!(详情请看Phalcon文档 Phalcon nginx配置 )
这特么也得配置!
使用 $_GET['_url']
(默认):
location / {
try_files $uri $uri/ /index.php?_url=$uri&$args;
}
使用 $_SERVER['REQUEST_URI']
,nginx配置:
location / {
try_files $uri $uri/ /index.php;
}
想要正常使用 $_SERVER['REQUEST_URI']
的方式,nginx配置完了还不要紧,还得在php代码里修改:
use Phalcon\Mvc\Router; $router->setUriSource(Router::URI_SOURCE_SERVER_REQUEST_URI);
Phalcon3.1版本无法结合 mongodb 的问题
问题现象
我在php5.6、Phalcon2.0的环境下按照如下方式把 mongodb
服务注入到Phalcon中是没问题的:
$di->set(
"mongo",
function (){
$mongo = new MongoClient();
return $mongo->selectDB("store");
},
true
);
但是在php7.1、Phalcon3.1的环境下,却报错了。说找不到mongo类…
问题原因以及解决
左思右想,谷歌百度,刷新调试。原来,MongoClient这个类用到了php5.6的 mongo
这个扩展,PHP官方文档提示 mongo
扩展将由 mongodb
所替代,而 mongo
这个扩展在php7中已经不支持。php7中只支持 mongodb
这个扩展。
但是Phalcon3.1封装的类库MongoClient却引用了 mongo
这个库,所以报了错…
Phalcon研发组发现了这个问题,所以提供了一个php类库: "phalcon/incubator"
只需要在composer包中加入此类库,用类库的类替代原来的类就可以了:
-
在composer中加入(Phalcon2.x版本对应2.x版本,Phalcon3.x版本对应3.x版本)
"phalcon/incubator": "^3.1"
-
代码中引入
use Phalcon\Db\Adapter\MongoDB\Client,然后代码中这样注入:$di->setShared("mongo", function(){ $mongoConfig = $this->getConfig()->mongo; return (new Client("mongodb://{$mongoConfig->host}:{$mongoConfig->port}/?replicaSet={$mongoConfig->replicaSet}")) ->selectDatabase($mongoConfig->database); }); -
如果想使用Phalcon中的
ODM,原来是引用use Phalcon\Mvc\Collection;并继承。现在是引用以下:use Phalcon\Mvc\MongoCollection;
并继承它。
Phalcon无法使用 redis
或者 memcached
作为Phalcon的缓存服务
问题现象
使用Phalcon封装好的缓存类,只需要如下操作就可以了。
use Phalcon\Cache\Frontend\Data as FrontData;
use Phalcon\Cache\Backend\Redis as BackendData;
$di->setShared('redis', function(){
$config = $this->getConfig();
$redisConfig = $config->sess_redis;
$frontend = new FrontData(['lifetime' => $config->cache->lifetime]);
$cache = new BackendRedis($frontend,
[
"host" => $redisConfig->host,
"port" => $redisConfig->port,
"persistent" => $redisConfig->pconnect
]
);
return $cache;
});
但是有时候报错,找不到 redis 类…
问题原因以及解决
这是因为Phalcon扩展在封装缓存类的时候,引用了PHP的 redis
扩展,而 redis
扩展并不是php的标准扩展包,so…
只需要安装好 redis
扩展就好。
同理,假如报 memcache
找不到,只需要安装相应扩展就好。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Perl语言入门 第六版(中文版)
Randal L.Schwartz、brian d foy、Tom Phoenix / 盛春 / 东南大学出版社 / 2012-3 / 62.00元
《Perl语言入门(第6版)(中文版)》根据作者施瓦茨、福瓦、菲尼克斯从1991年开始的教学经验积累汇聚而成,多年来十分畅销。此次第六版涵盖了最新的Perl5.14版本的变化。《Perl语言入门(第6版)(中文版)》每章都包含若干习题,帮助你巩固消化刚学到的知识。也许其他书籍只是想着灌输Perl编程的条条框框,但《Perl语言入门(第6版)(中文版)》不同,我们希望把你培养成一名真正的Perl程序......一起来看看 《Perl语言入门 第六版(中文版)》 这本书的介绍吧!