【问题标题】:Volt directory can't be written伏特目录无法写入
【发布时间】:2013-10-17 23:40:41
【问题描述】:

我得到的错误是

Warning: Phalcon\Mvc\View\Engine\Volt\Compiler::compileFile(../app/views/index/index.phtml.php): failed to open stream: Permission denied in /Users/mattstephens/Sites/magpie/public/index.php on line 26 Phalcon Exception: Volt directory can't be written

我已经像这样在我的引导程序中声明了伏特引擎的使用

$view->registerEngines(array(
      '.phtml' => 'Phalcon\Mvc\View\Engine\Volt'
    ));

我的代码中提到的第 26 行指向如下所示的应用程序句柄函数

echo $application->handle()->getContent();

这是与权限相关的事情还是由于缺少目录?

【问题讨论】:

  • 与其他代码相比,我唯一能看到的是 /cache/volt 不在我的目录结构中。
  • 在那些chown之后你需要删除旧的app/cache/*文件(如果有的话),否则它会保持同样的错误。

标签: php phalcon volt


【解决方案1】:

除非您为 Volt 指定不同的文件夹来编译其模板,否则视图文件所在的文件夹将用于创建相关的编译文件。

您可以通过在注册服务时设置适当的选项来更改此行为:

use \Phalcon\Mvc\View as PhView;
use \Phalcon\Mvc\View\Engine\Volt as PhVolt;

...

public function initView($options = array())
{
    $config = $this->di['config'];
    $di     = $this->di;

    $this->di['volt'] = function ($view, $di) use ($config) {

        $volt = new PhVolt($view, $di);
        $volt->setOptions(
            array(
                'compiledPath'      => $config->app_volt->path,
                'compiledExtension' => $config->app_volt->extension,
                'compiledSeparator' => $config->app_volt->separator,
                'stat'              => (bool) $config->app_volt->stat,
            )
        );

        return $volt;
    };

    /**
     * Setup the view service
     */
    $this->di['view'] = function () use ($config, $di) {

        $view = new PhView();
        $view->setViewsDir($config->app_path->views);
        $view->registerEngines(array('.volt' => 'volt'));

        return $view;
    };
}

$config 将存储您需要的所有信息。通过使用compiledPath,您可以指示 Volt 在那里编译模板,然后将它们提供给前端。该文件夹需要对运行您的网络服务器 www-data 或其他服务器的用户是可写的,并且可以位于您的公用文件夹之外。

我通常使用的文件结构是:

app
    \controllers
    \models
    \views
public
    \js
    \css
    \img
var
    \volt
    \logs
    \config
    \cache

【讨论】:

    【解决方案2】:

    我刚刚创建了具有 777 个许可的“app/cache”文件夹)它有效))

    【讨论】:

      【解决方案3】:

      将“app/cache”文件夹权限更改为 777。 在我的 Mac 中,我确实喜欢这样做。

      1. 在我们 phalcon 框架的 app 文件夹中导航
      2. [chmod ugo=rwx 缓存]
      3. 通过键入 [ls -l] 确保缓存文件夹权限为 777。

      【讨论】:

        【解决方案4】:

        将 volt 文件权限(在应用程序/缓存内)更改为 777 。它工作正常

        【讨论】:

        • 将权限更改为 777 可能有点危险。难道不能给予严格必要的权利吗?
        • 您好,它仅适用于基于 Linux 的系统。但是,我在 Windows 机器上遇到了同样的错误。除了将 777 分配给缓存文件夹(这在 Windows 中显然不可能)之外,您还有其他建议吗?
        【解决方案5】:

        与这里的其他几个答案相反,不要随便将权限设置为 0777 并假装一切正常,这完全是荒谬的。您的服务器需要写入缓存目录中的 volt 文件夹。

        您可能需要先创建文件夹。 sudo mkdir cachesudo mkdir cache/volt。然后使用您的服务器运行的任何用户名 chown 该文件夹。

        注意:根据您的配置,cache 文件夹可能位于项目根目录中,而不是位于 app 中。

        例如,如果您的服务器在名为“www-data”的用户(最常见)的权限下启动,则在创建正确的文件夹结构后,以下命令将解决您的问题: sudo chown www-data:www-data -R cache

        【讨论】:

        • 刚刚做了 sudo chown www-data:www-data -R 缓存就是这样
        【解决方案6】:

        使用这些命令更改 app/cache 和 app/cache/volt 适用于我的项目结构。

        chmod -R a+w app/cache chmod -R a+w app/cache/volt

        【讨论】:

          【解决方案7】:

          只需转到 /project_name/store/app/config/config.php 并将 cacheDir 从 'cacheDir' => __DIR__ 更改。 '/../../app/cache/''cacheDir' => __DIR__ 。 '/../../cache/'.

          另外,将其写入权限更改为 777。

          【讨论】:

            【解决方案8】:

            检查config.php中的baseUri是否与安装目录相同

            如果问题仍然存在,尾 nginx 日志tail -f /var/log/nginx/*.log

            也可以尝试使用sudo setenforce 0。这对我有用。

            【讨论】:

              【解决方案9】:

              您应该使用 chown 命令更改项目目录的所有权,

              chown -R your_system_user:webserver_user yourproject/

              【讨论】:

                猜你喜欢
                • 2018-04-30
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-07-15
                • 2014-07-09
                • 2021-08-13
                • 1970-01-01
                • 2018-01-01
                相关资源
                最近更新 更多