Phalcon 的那些坑

文章来源: https://i6448038.github.io/2017/06/07/Phalcon的那些坑/?utm_source=tuicool&utm_medium=referral, 本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

我用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 找不到,只需要安装相应扩展就好。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

为你推荐:

查看所有标签

码农书籍
UNIX环境高级编程:第2版

UNIX环境高级编程:第2版

W.Richard Stevens、Stephen A.Rago / 尤晋元、张亚英、戚正伟 / 人民邮电出版社 / 2006年 / 99.00元

本书是被誉为UNIX编程“圣经”的AdvancedProgrammingintheUNIXEnvironment一书的更新版。在本书第1版出版后的十几年中,UNIX行业已经有了巨大的变化,特别是影响UNIX编程接口的有关标准变化很大。本书在保持了前一版风格的基础上,根据最新的标准对内容进行了修订和增补,反映了最新的技术发展。书中除了介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在此基础上介绍了多个应用示例,包括如何创建数据库函数库以及如何与网络打印机通信等。此外,还在附录中给出了函数原型和部分习题的答案。本书内容权威,概念清晰,阐述精辟,对于所有层次UNIX程序员都是一本不可或缺的参考书。

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

随机密码生成器
随机密码生成器

多种字符组合密码