【问题标题】:how can I let phalcon framework co-exists under existing legacy php project?如何让 phalcon 框架在现有的遗留 php 项目下共存?
【发布时间】:2016-02-21 02:23:32
【问题描述】:

我在 nginx 网络服务器上运行一个基于 php 的网站(购物中心)。 最近听说 phalcon 是一个非常快速可靠的框架,可以帮助开发者加快开发进程。

所以我想在我的网站上实现它,作为特定服务的子模块开始,因为从头开始很难。

我想在 /var/www 下创建一个子文件夹(比如说“phalcontest”)。

我在谷歌上搜索了这个主题,但我在网上找到的所有(也许?)内容都是将 nginx 服务器设置为 phalcon 项目的专用站点(我的意思是,将“项目”文件夹设置为 web 根目录),让 phalcon 项目与旧的非 phalcon 页面共存毫无意义。

我尝试了类似这样的 nginx 配置,希望没问题:

 server {
     listen       80;
     root /var/www/;
     index index.html index.htm index.php;

     server_name localhost;

     access_log  /var/log/nginx/access.log main buffer=16k;
     error_log  /var/log/nginx/error.log;


 location @rewrite {
     rewrite ^(.*)$ phalcontest/index.php?_url=$1;
 }

 location / { 
         try_files $uri $uri/ /index.php?q=$uri&$args;
 }

 location ~ \.php$ {
  try_files      $uri = 404;
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_index  index.php;
  fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
  include        fastcgi_params;

  fastcgi_split_path_info  ^(.+\.php)(/.+)$;
  fastcgi_param PATH_INFO       $fastcgi_path_info;
  fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
 }


location /phalcontest {
     try_files $uri $uri/ @rewrite;
}

 location ~* ^/(css|img|js|flv|swf|download)/(.+)$ {
     root /var/www/;
 }

 }

使“phalcontest”文件夹成为 webroot 下启用 phalcon 的子文件夹。

之后我用 phalcon devtools 创建了 phalcontest,

访问http://localhost/phalcontest/public,显示:

恭喜! 你现在和 Phalcon 一起飞行。伟大的事情即将发生! 该页面位于views/index/index.phtml

但是当我访问http://localhost/phalcontest时,它显示:

Mod-Rewrite 未启用

请在您的网络服务器上启用重写模块以继续

这意味着我做错了什么,我只能通过公共文件夹访问,而不是文件夹本身。

请帮助我如何让 phalcon 与现有的基于 php 的站点一起使用!

【问题讨论】:

    标签: php nginx phalcon


    【解决方案1】:

    Phalcon 应该工作的方式是将所有针对您的 Web 根 / 的流量重写到 /public/ 目录。这样做的重点是它使您能够从 Web 视图中隐藏 /app/ 目录,因为用户的请求将首先被重写为 /public/app/ 从而遇到 404 被重写为 /public/index.php 它将在其中查找控制器“应用程序”。如果要从子目录运行 Phalcon,则需要将所有 / 更改为 /phalcontest/

    我看到你正在使用root /var/www/;
    所以在你的情况下,你需要一个像这样的目录结构:

    /www/phalcontest/public/index.php
    /www/phalcontest/public/css/bootstrap.css
    /www/phalcontest/public/js/jquery.js
    /www/phalcontest/app/config/config.php
    /www/phalcontest/app/controllers/IndexController.php
    /www/phalcontest/app/models/
    /www/phalcontest/app/views/index.phtml
    /www/phalcontest/app/views/index/index.phtml
    

    确保将所有针对phalcontest(/.*)? 的请求重写为phalcontest/public/$1,然后如果请求的文件或目录不存在,则从那里将它们重写为index.php

    如果有帮助的话,这是一个将 .htaccess 转换为 nginx 的工具: http://winginx.com/en/htaccess

    老实说,您不需要如此完美地遵循他们的目录结构。您只需要重写逻辑即可将所有流量重写到您的 index.php 文件。关于 Phalcon 建议的 /public/ 目录的部分,如果您只需将 /app/ 目录移动到 Web 根目录下,则不需要 /public/ 目录,然后从您的 index.php 文件中正确引用其位置。

    Phalcon 在这里为您提供了很多关于如何设置 nginx 重写的信息: https://docs.phalconphp.com/en/latest/reference/nginx.html

    但是由于您是在本地主机上工作,我建议您使用主机文件在本地主机上创建一个子域。然后你可以从/ web root 工作并从http://phalcontest.localhost/ 访问你的项目。然后你会在你的 nginx 配置中使用server_name phalcontest.localhost; 而不是server_name localhost; 并将它的根指向root /var/www/phalcontest; 对于你的主机文件,你需要添加一行:phalcontest.localhost 127.0.0.1。这将使您免于 DNS 查找,因此子域与您的 localhost 相关联。请参阅nginx subdomain configurationHow to test nginx subdomains on localhost

    【讨论】:

    • 考虑到这个问题相当广泛,并且有许多不同的方法可以实现目标,这个答案涵盖了许多重要方面。干得好,请投我一票。
    • 哇...一个愚蠢问题的好答案!谢谢,这对我理解框架的结构很有帮助!
    猜你喜欢
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    相关资源
    最近更新 更多