我正在通过LIIPImagineBundle为Symfony2使用Imagine来创建存储在S3中的图像的缓存版本.
缓存的图像存储在CloudFront提供的支持S3 Web的存储桶中.但是,S3的默认LIIPImagineBundle实现对我来说太慢了(检查S3上的文件是否存在然后创建到缓存文件或解析功能的URL),所以我已经计算出了我自己的工作流程:
只要我不使用cloudfront,这工作正常.问题似乎是cloudfront正在缓存302重定向响应(即使http规范声明它们不应该).因此,如果我使用cloudfront,则客户端将在无限重定向循环中从Web服务器到云端来回发送,并且即使在生成文件之后,对文件的每个后续请求仍会重定向到Web服务器.
如果我直接使用S3而不是cloudfront,则没有问题,这个解决方案是可靠的.
根据亚马逊的文档 S3重定向规则不允许我指定自定义标头(设置缓存控制标头等),我不相信CloudFront允许我控制重定向的缓存(如果它们做得很好)隐).CloudFront的失效选项是如此有限,以至于我认为它们不会起作用(任何时候都只能使3个对象失效)...我可以在第一次重定向(来自Imagine webserver)上将参数传递回cloudfront来修复无穷无尽的重定向(例如image.jpg?1),但是对同一对象的后续请求仍然是302到网络服务器然后301返回到云端,即使它存在.我觉得应该有一个优雅的解决方案来解决这个问题,但它让我望而却步.任何帮助,将不胜感激!!
caching amazon-s3 amazon-web-services amazon-cloudfront liipimaginebundle
编辑:请参阅下面的我自己的解决方案,在撰写本文时,它正在运作但不完美.我会喜欢一些批评和反馈,如果我把一些我觉得非常可靠的东西放在一起,那么我会为面临同样挑战的其他人制作一篇howto博客文章.
几天来我一直在努力奋斗,如果我走在正确的道路上,我希望有人能告诉我.
我有一个带有FOSRestBundle webservice的系统,我正在使用FOSUserBundle和HWIOAuthBundle来验证用户.
我想为webservice设置无状态api密钥身份验证.
我已经阅读了http://symfony.com/doc/current/cookbook/security/api_key_authentication.html,这看起来很简单,我已经安装了UecodeApiKeyBundle,这似乎只是本书页面的一个实现.
我的问题是n00b ...现在怎么样?书籍页面和包都涵盖了通过API密钥对用户进行身份验证,但不涉及日志用户流,生成API密钥,允许用户注册等.我真正想要的是用于登录的简单API端点,注册,以及我的应用开发者可以使用的注销.像/ api/v1/login等等.
我想我可以处理注册....虽然登录让我感到困惑.根据一些额外的阅读,在我看来,我需要做的登录是这样的:
在api/v1/login创建一个接受POST请求的控制器.请求看起来像{_username:foo,_ password:bar}或类似{facebook_access_token:foo.或者,facebook登录可能需要不同的操作,例如/ user/login/facebook,并且只需重定向到HWIOAuthBundle路径}.
如果请求包含_username和_password参数,那么我需要将请求转发到login-check(我不确定这个.我可以自己处理这个表单吗?或者,我应该手动检查用户名和密码数据库?)
添加一个登录事件监听器,如果用户认证成功,则为用户生成一个api密钥(当然,如果我自己没有检查它,这是必要的)
在POST请求的响应中返回API密钥(这会打破post-redirect-get策略,但是我没有看到任何问题)我认为这消除了上面列出的重定向登录检查选项.
你可能会看到我很困惑.这是我的第一个Symfony2项目,关于安全的书页很简单......但似乎掩盖了一些细节,这使我不确定要采取的方法.
提前致谢!
================================================== ===========
编辑:
我已经安装了API密钥身份验证,与相关的相关菜谱文章完全相同:http://symfony.com/doc/current/cookbook/security/api_key_authentication.html
为了处理用户的登录,我创建了一个自定义控制器方法.我怀疑这是完美的,我很乐意听到一些关于如何改进它的反馈,但我相信我正走在正确的道路上,因为我的流程正在发挥作用.这是代码(请注意,还在开发的早期......我还没有看过Facebook登录,只有简单的用户名/密码登录):
class SecurityController extends FOSRestController
{
/**
* Create a security token for the user
*/
public function tokenCreateAction()
{
$request = $this->getRequest();
$username = $request->get('username',NULL);
$password = $request->get('password',NULL);
if (!isset($username) || !isset($password)){
throw new BadRequestHttpException("You must pass username and password fields");
}
$um = $this->get('fos_user.user_manager');
$user = $um->findUserByUsernameOrEmail($username);
if (!$user instanceof \Acme\UserBundle\Entity\User) …
Run Code Online (Sandbox Code Playgroud) 我对此有点不满意,我希望我遇到的问题很简单...编辑:底部的新信息
我需要连接到远程 mysql (Amazon RDS) 数据库。
遵循几个教程后,我在客户端上安装并配置了 unixodbc 和 libmyodbc,但是当我尝试通过 isql 连接时,出现错误
[08S01][unixODBC][MySQL][ODBC 5.1 Driver]Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[ISQL]ERROR: Could not SQLConnect
Run Code Online (Sandbox Code Playgroud)
关于这个错误最令人困惑的部分是我没有尝试连接到本地数据库,而是连接到远程数据库。我在客户端上没有 mysql.sock 文件...虽然这不是问题,是吗?
我感觉到配置错误,但我不确定它可能是什么。
如果我运行 odbcinst -j 那么输出是:
DRIVERS............: /etc/unixODBC/odbcinst.ini
SYSTEM DATA SOURCES: /etc/unixODBC/odbc.ini
USER DATA SOURCES..: /root/.odbc.ini
Run Code Online (Sandbox Code Playgroud)
/etc/unixODBC/odbcinst.ini 的内容是:
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib64/libmyodbc5.so
Setup = /usr/lib64/unixODBC/libodbcmyS.so
UsageCount = 5
[MySQL ODBC 515 Driver]
Description = ODBC 5.515 for MySQL
DRIVER = /usr/lib64/libmyodbc5-5.1.5.so
SETUP = /usr/lib64/unixODBC/libodbcmyS.so
UsageCount …
Run Code Online (Sandbox Code Playgroud) 我一直在四处寻找,但没有找到答案,如果我错过了什么,请告诉我资源。
我正在构建一个(主要是)RESTful web 服务,并且需要允许客户端修补资源。我意识到根据定义 PATCH 不是 RESTful,但我仍然试图尽可能接近标准。
我不确定如何处理数组属性的修补……例如,我的父对象有多个子对象。因此,如果有人使用 children 参数修补父对象,我应该替换现有的子对象还是附加到它们?
就像是
PATCH parent/:id
{
children: [
{ property: value }
]
}
Run Code Online (Sandbox Code Playgroud)
我可以只对子对象使用 POST 和 DELETE 从父对象中添加和删除它们,但是我希望能够修补父对象以更新其他非数组属性,并且只允许修补一些似乎是错误的属性而不是其他。也许这是正确的答案,我不确定。
我已经阅读了很多关于正确 PATCHing 的帖子,但他们似乎都没有谈论这个问题。如果有人有任何意见,我将不胜感激-
我一直在对我的Symfony2应用程序进行负载测试,我发现的其中一个瓶颈似乎是Memcached.
我在webserver上使用memcached来缓存doctrine元数据和查询,我正在使用amazon的elasticache memcached作为doctrine的结果缓存.
在没有任何负载的请求下,我的端到端时间是300-350ms,memcached占这些ms中的大约10个
但是,在25个并发请求的负载下,我的总响应速度减慢到大约2500毫秒,其中很大一部分似乎是memcached
39个memcached查询中有34个获取classmetadata,其中一些是.1ms而其他的是40或50ms,它似乎很随机.
我已经尝试在本地memcache配置文件中增加最大连接数和缓存大小,我还能做些什么来尝试从我的应用程序中删除这个瓶颈?
谢谢一堆 -
我有一个网站曾经能够上传大文件(大文件 > 10 或 20mb),但现在不能了。此时我已经调试了几个小时。
所有 php 值都设置得高得离谱:
post_max_size = 512M
upload_max_filesize = 512M
memory_limit = 1024M
max_execution_time = 600
max_input_time = 600
Run Code Online (Sandbox Code Playgroud)
我也在TimeOut 600
httpd.conf中进行了设置。
本质上,如果我将一个大文件添加到上传字段,它永远不会上传。我可以看到 Chrome 左下角的“正在上传(1%)...”显示文件开始上传。它会向上计数,有时甚至达到 100%,然后从 0 重新开始计数,最终失败并显示 ERR_CONNECTION_RESET 消息。
最终的故障似乎是在随机的时间后发生的,有时是 24 秒,有时是 3 分钟。
我尝试了一个 170mb 的文件,在重新启动之前它总是会达到 16%或17%。这总是需要 22 秒左右的时间。然后,它将从 0 处重新启动,并再次计数到 16 或 17%,然后再次重新启动。有时在重新启动一次后,有时在重新启动 4 或 5 次后,它最终会失败并显示 ERR_CONNECTION_RESET 消息。
我还尝试了 30mb 的文件。在重新启动之前,这个值始终会达到 100% 左右。
df -h 显示剩余的文件空间充足,我能够通过 SFTP 上传文件,确认确实有足够的硬盘空间。
文件也可以在我的开发服务器上使用完全相同的应用程序正常上传,因此我可以排除任何应用程序问题。
较小的文件也可以在生产服务器上正常上传,我尝试过 3 或 5mb 大的文件,没有任何问题。
我能够执行如下代码:
echo "start"; …
Run Code Online (Sandbox Code Playgroud) 我已经安装了FOSElasticaBundle并让它处理我的数据的横截面.
我的问题出现了,我需要使用大约14m行来构建索引.我运行了populate命令,在昨天大约6个小时之后,它出现了10.8%的错误并出现内存错误:
PHP Fatal error: Allowed memory size of 2147483648 bytes exhausted (tried to allocate 52277 bytes) in /var/www/html/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php on line 111
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我已经将我的php内存限制设置为2G,这应该是相当多的.
错误之前的最后一行看起来像
Populating index/entity, 10.8% (1315300/12186320), 36 objects/s (RAM : current=2045Mo peak=2047Mo)
Run Code Online (Sandbox Code Playgroud)
每条线路的电流和峰值都在上升,大约30mb.
我的假设是存在某种内存泄漏?当然,php的内存不应该被这个过程耗尽.我还尝试了一些额外的参数
app/console fos:elastica:populate --no-debug --no-reset --env=prod
Run Code Online (Sandbox Code Playgroud)
但是当我看着它正在运行时,当前的内存仍在不断增加.
关于这里可能发生什么以及我可以做些什么来调试它的想法?我发现这个讨论听起来像我的问题,但并没有真正提供一个好的解决方案:https://github.com/FriendsOfSymfony/FOSElasticaBundle/issues/82.我正在使用doctrine和默认提供程序.
谢谢-
我有一种实体类型,我将其称为父级,与我称为子级的实体之间存在一对多关系(许多子级属于单个父级)。
我想要做的是尽可能高效地加载父实体及其所有子实体,并使用尽可能少的查询。
默认情况下,使用学说,如果我执行诸如加载 100 个父实体之类的操作,然后循环遍历它们并对子实体执行操作,则至少需要 101 个查询,一个用于加载父实体,另一个用于获取每个子实体的所有子实体父母。如果我尝试编写一个在一次通过中加载所有对象的查询,它会变得非常慢,加载我只能假设是一个笛卡尔对象,每个孩子的所有父和子属性都包含一整行。如果我有多个子实体,这个问题会变得更具破坏性,我就是这样做的。
我能想到的唯一解决方案是独立查询所有父级和所有子级,然后将它们关联到嵌套循环中。这将它减少到只有两个查询,但似乎......不对。有人对我有任何见解吗?这基本上是我的想法:
//First, select an array of all parent objects
$parents = "SELECT p FROM parent p WHERE 1 LIMIT 100";
//Select all child elements
$children = "SELECT c FROM children c WHERE c.parent IN ($parents)";
//Loop through all elements and assign them to parents, and parents to children
foreach($children as $child){
foreach($parents as $parent){
//All children will have loaded references to their parent object
if ($child->getParent()->getId() === $parent->getId()){
//This child belongs to this …
Run Code Online (Sandbox Code Playgroud)