通过HTTP触发Symfony缓存、资产和样式刷新


Trigger Symfony cache, assets, styles refresh over HTTP

我正在Symfony 2 WebApp上工作。WebApp已经上线两年了,现在我想更新一下设计。这项工作应该外包给第三方设计师。

设计师应该能够工作的WebApp的一个实时版本(=实际运行在我的服务器上,而不仅仅是普通的文件),使设计的变化变得可见,当刷新浏览器。因此,设计师需要能够直接在服务器上更改/添加文件,并在需要时刷新缓存,资产和样式(使用SASS + Compass)。

同时,设计器不应该具有对WebApp代码和服务器本身的一般访问权限。

只允许访问设计文件已经解决了:我已经将所有必要的文件/文件夹从Symfony安装移动到设计人员可以通过FTP访问的单独文件夹中。在Symfony安装中,文件/文件夹已被符号链接取代(参见我的问题)。

这个效果很好。唯一的问题是,目前缓存/资产/样式刷新目前只能通过SSH直接访问触发:

$ php app/console cache:clear --env=prod --no-debug
$ php app/console assetic:dump --env=prod --no-debug
$ compass compile --output-style compressed --force

是否有可能通过HTTP(S)公开这些命令?当然,设计师将致力于一个专门的Symfony安装。因此,更改将不会对实时版本产生任何影响。

问题是,app/console...在WebApp的域根之外。当然,我可以设置另一个域名指向app/console...,但这样,该目录下的所有其他文件和文件夹也可以访问。

另外,我不确定,如果compass compile...可以从HTTP运行。如何做到这一点?

我知道,在使用开发前端控制器(.../app_dev.php/...)时,刷新缓存和资产并不是绝对必要的,但如果不能刷新/重新编译Compass和SASS文件,样式更改将不可见。

So:这可以通过HTTP完成吗?也许使用PHP调用的代理脚本?

要通过HTTP(S)公开这些命令,您可以为设计器添加一个调用控制器中的操作的路由来运行PHP命令,如文档中所述:

// src/AppBundle/Controller/CommandController.php
namespace AppBundle'Controller;
use Symfony'Bundle'FrameworkBundle'Console'Application;
use Symfony'Bundle'FrameworkBundle'Controller'Controller;
use Symfony'Component'Console'Input'ArrayInput;
use Symfony'Component'Console'Output'NullOutput;
use Symfony'Component'HttpFoundation'Response;
class CommandController extends Controller
{
    public function refreshAction()
    {
        $kernel = $this->get('kernel');
        $application = new Application($kernel);
        $application->setAutoExit(false);
        $input = new ArrayInput(
            array(
                'command' => 'cache:clear',
                '--env' => 'prod',
            ),
            array(
                'command' => 'assetic:dump',
                '--env' => 'prod',
            ),
        );
        // You don't need the output
        $output = new NullOutput();
        $application->run($input, $output);
        $content = "Refreshed";
        return new Response($content);
    }
}

对于compass命令,可以使用giorgio comment中提到的assetic:watch

我认为最好隐藏尽可能多的东西,以便第三方更容易使用您的项目。因此我建议在后台自动处理

因此:

  • SASS -我会运行Gulp/Grunt watch任务服务器端,将在每次保存时重新编译SASS文件。这应该是流畅的。(我是少用户,但我想这在SASS工作几乎相同)

  • cache:clear -我建议你简单地关闭第三方将工作的实例上的缓存。有几种方法可以做到。您可以将app_dev.php设置为入口点,而不是将app.php设置为入口点,但是您应该关闭profiler。如果不想更改dev,可以创建单独的环境。你也可以改变prod的配置。

  • assetic:dump -我个人不喜欢Assetic,也不使用它,所以在这种情况下我可能是错的。无论如何,正如我在这里读到的,在dev环境中,没有必要转储资产,因为它们是动态交付的,所以缓存问题的解决方案也应该在这里工作。

我使用SVN, repo在我们的服务器上,网站是一个结帐文件夹,设计师也有一个结帐文件夹。

创建svn update .cache:clear的cron

这样,你可以只授予他对视图和控制器的访问权。你对他隐藏了参数、服务和实体。

这肯定不是在生产中,而是在集成服务器