Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon s3 将Symfony2资产转储到Amazon S3_Amazon S3_Symfony_Assets - Fatal编程技术网

Amazon s3 将Symfony2资产转储到Amazon S3

Amazon s3 将Symfony2资产转储到Amazon S3,amazon-s3,symfony,assets,Amazon S3,Symfony,Assets,在Symfony 2中部署了capifony之后,我想将我的资产转储到生产中的s3存储桶中。我已经找到了一些解决方案,但没有真正找到最好的使用方法 使用Zend_Service_Amazon_S3转储资产是可能的,但我认为仅为此导入Zend框架有点过分。- 我还找到了:,在那里我可以告诉AsseticBundle bucket名称,但我没有找到在哪里为我的aws帐户提供密钥和机密 你能指出一个更好的解决方案,或者给我一些关于上述问题的详细信息吗 我还发现了这个:, 我可以告诉AsseticBun

在Symfony 2中部署了capifony之后,我想将我的资产转储到生产中的s3存储桶中。我已经找到了一些解决方案,但没有真正找到最好的使用方法

使用Zend_Service_Amazon_S3转储资产是可能的,但我认为仅为此导入Zend框架有点过分。-

我还找到了:,在那里我可以告诉AsseticBundle bucket名称,但我没有找到在哪里为我的aws帐户提供密钥和机密

你能指出一个更好的解决方案,或者给我一些关于上述问题的详细信息吗

我还发现了这个:, 我可以告诉AsseticBundle桶名,但我没有找到 在哪里为我的aws帐户提供密钥和机密

这应该行得通-在指定S3 bucket URL时只需使用以下表单:

# config_prod.yml
assetic:
    write_to: s3://{key}:{secret}@{bucket}/

实际上,你并不需要,甚至不应该,把你的钥匙放在应用程序代码中。在AmazonS3中,您可以指定发件人的访问权限,在本例中,您是生产服务器地址

请查看提供的帖子链接:


这将允许您自由地从该服务器写入您的bucket。还记得拒绝来自其他ip的访问。

所以我所做的和它正在工作

composer.json中添加并安装它

"aws/aws-sdk-php": "2.6.16",
创建服务:

<?php

namespace My\AcmeBundle\Amazon;

use Aws\Common\Aws;

class StreamWrapperS3 {

    protected $s3;

    public function __construct($key, $secret, $region) {

        $aws = array(
            'key'    => $key,
            'secret' => $secret,
            'region' => $region
        );

        $this->s3 = Aws::factory($aws)->get('s3');

    }

    public function registerStreamWrapper() {
        $this->s3->registerStreamWrapper();
    }

}
将参数添加到
parameters.yml

覆盖
AppKernel.php上的
boot()
方法:

public function boot() {
    parent::boot();
    $s3client = $this->container->get('my_amazon_s3');;
    $s3client->registerStreamWrapper();
}
config_prod.yml
添加:

framework:
    templating:
        assets_base_url: https://sa-east-1.amazonaws.com/your-bucket-name
assetic:
    write_to: 's3://your-bucket-name'
最后,使用资产添加筛选器以正确重写路径:

{% stylesheets filter='cssrewrite'
    'bundles/...' %}
    <link rel="stylesheet" href="{{ asset_url }}" /> {# asset just to be sure that url will be right #}
{% endstylesheets %}
一个非常重要的细节花费了我将近2天的时间,你需要更新AmazonS3的CORS来访问一些文件,比如在twitter引导css中添加字体。我的CORS权限如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>DELETE</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

*
得到
放
邮递
删除
3000
*

我还应该在配置产品中添加什么?当我运行:
php应用程序/console assetic:dump s3://my cucket--env=prod
时,它返回
php警告:is_dir():找不到包装器“s3”-您在配置php时忘记启用它了吗?
@casiano我遇到了同样的问题。你解决了吗?如果我们重写了url规则,并且css包含图像到相对url,那么效果不好,因为图像没有上传到S3。请不要为assetic执行
资产(资产url)
,否则我们将获得两次资产版本
资产。css?版本008?版本008
php app/console cache:clear --env=prod
php app/console assets:install --env=prod
php app/console assetic:dump --env=prod
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>DELETE</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>