有一个特定的页面,我希望浏览器始终加载,特别是当用户按下浏览器后退按钮才能访问它.
所以我在这个页面的标题中使用了以下'Cache-Control'指令(直接从我的代码中获取PHP).
$headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
Run Code Online (Sandbox Code Playgroud)
这适用于FF,IE和Chrome,但Safari(5.0.1)似乎忽略该指令并且无法重新加载页面(跨多个用户,因此它似乎不是特定于设置的问题).搜索没有发现任何已知的错误,所以我假设我的结果有些不对劲.
任何指针都将非常感激.
更新:刚刚在SO上找到了这个答案.
尚未尝试过,但看起来很有希望.很奇怪它是身体标签的补充,所以我持怀疑态度.
[更新:我正在使用MySQL 4.1.25]
我认为这一定很简单,但我是一个SQL菜鸟,需要一些帮助.我有一个查找表,如下所示:
key1,value1
key2,value2
key3,value3
...
keyN,valueN
然后我有另一个表在一列中有一个随机的键列表(有重复),我需要在相应的列中添加相关的值.
例如,第二个表可能是:
key3 ,?
key1 ,?
key1 ,?
key40 ,?
我需要second_table用以下值替换?s lookup_table:
key3,value3
key1,value1
key1,value1
key40,value40
这似乎是一个简单的SQL查询应该解决的问题.有什么建议?
在处理POST请求后,我正在做一个非常标准的重定向到同一页面的事情,这样如果用户重新加载页面,用户就不会得到"确认表单重新提交"(或等效)对话框.
我正在使用303响应状态代码.
这是代码:
header( "HTTP/1.1 303 See Other" );
header( "Location: " . $_SERVER['REQUEST_URI'] );
exit();
Run Code Online (Sandbox Code Playgroud)
这在Safari和FF中按预期工作.Chrome会弹出"确认表单重新提交"对话框.
在Chrome中,我可以使用网络检查器查看303重定向确实已发出,并且在我的初始POST后有一个GET.
然而,如果我在那时尝试重新加载页面,我会收到"确认表单重新提交".
如果我通过添加虚假查询参数来修改URL,则不会发生这种情况.那是...
header( "HTTP/1.1 303 See Other" );
header( "Location: " . $_SERVER['REQUEST_URI'] . '?foo' );
exit();
Run Code Online (Sandbox Code Playgroud)
......工作得很好.
Chrome是否试图过于聪明并且缩短同一页面的重新加载?或者这是一个已知的问题?我花了一些时间环顾四周,但除了一百万只需要使用PRG模式的人之外,没什么.
CSS的一个重要缺点是不能使用变量.例如,我想使用变量来控制导入的CSS的位置,为设计中重复使用的颜色创建变量会很棒.
一种方法是将CSS文件用于CSS样式表.换句话说,用...创建一个"style.php"
<?php header("Content-type: text/css"); ?>
...在文件的顶部,然后使用...链接到它
<link href="style.php" rel="stylesheet" type="text/css" />
...在任何使用这些样式的文件中.
那捕获的是什么?我认为它可能是性能 - 我在Firefox/Firebug中进行了一些快速实验,正如人们所预料的那样,CSS样式表被缓存,但PHP样式表却没有.所以我们要付出额外的GET的代价.
另一个令人讨厌的事情是,TextMate没有为.php文件中的CSS正确地突出语法.
还有其他缺点吗?您是否使用过这种方法?如果是这样,您会推荐它吗?
我使用curl来调用Web服务API.该服务可以无响应,所以我想设置超时.当我使用CURLOPT_TIMEOUT时,事情按预期工作.但是当我使用CURLOPT_TIMEOUT_MS(注意'MS'为毫秒)时,超时似乎根本没有启动.php.net告诉我后者自PHP 5.2.3版本开始可用,我使用的是5.2.6.
任何想法为什么会这样?
谢谢.
代码片段:
$c = curl_init();
curl_setopt( $c, CURLOPT_URL, $call );
curl_setopt( $c, CURLOPT_HTTPHEADER, $headers);
curl_setopt( $c, CURLOPT_HEADER, false );
curl_setopt( $c, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $c, CURLOPT_TIMEOUT_MS, 100 );
curl_setopt( $c, CURLOPT_CONNECTIONTIMEOUT_MS, 100 );
$result = curl_exec($c);
curl_close($c);
Run Code Online (Sandbox Code Playgroud) 我正在开发一个非常典型的Web应用程序.用户体验的主要组成部分是网站所有者将在其首页上安装的小部件.每次加载首页时,小部件都会与我们的服务器通信并显示一些返回的数据.
因此,此Web应用程序有两个组件:
以前我们用PHP运行所有这些.现在我们正在尝试使用Rails,这对于#1(前端UI)来说非常棒.问题是如何高效地执行#2,即小部件信息的后台服务.显然,这比前端负载要高得多,因为每次首页加载到我们客户的网站上时都会调用它.
我可以看到两种明显的方法:
A. 并行堆栈:建立一个使用除rails之外的其他东西的并行堆栈(例如我们旧的基于PHP的方法),但访问与前端相同的数据库
B. Rails Metal:使用Rails Metal/Rack绕过Rails路由机制,但是在Rails应用程序中保持api调用响应者
我的主要问题:
但是也...
和...
提前感谢任何见解.
这似乎应该有一个简单的答案,但在Google和SO上经过很长时间后我找不到它.这可能是错过正确关键字的情况.
在我的RoR应用程序中,我有几个共享特定类型的字符串属性的模型,它具有特殊的验证和其他功能.我能想到的最接近的类似示例是表示URL的字符串.
这导致了模型中的大量重复(甚至在单元测试中更多重复),但我不确定如何使其更加干燥.
我可以想到几个可能的方向......
3号似乎是最合理的,但我无法弄清楚如何扩展ActiveRecord来处理除基本数据类型之外的任何东西.有什么指针吗?
最后,如果有办法做到这一点,那么在文件夹层次结构中你会把新类放在不是模型的位置?
非常感谢.
更新:
下面使用Matt的mixin建议的一个潜在解决方案(并使用URL示例).注意,这比真正的ruby更接近伪代码,并且旨在传达原理而不是完美的语法.
首先,创建一个urlmixin:
module Url
def url_well_formed?
[...]
end
def url_live?
[...]
end
end
Run Code Online (Sandbox Code Playgroud)
在Site模型中,包括此模块:
Class Site < ActiveRecord:Base
include Url
validate :url_well_formed?
end
Run Code Online (Sandbox Code Playgroud)
当我需要检查URL上的网站是否有效时,请...
if site.url_live?
[...]
end
Run Code Online (Sandbox Code Playgroud)
这个问题没有解决的问题是如何让单元测试DRY.如果我有另一个Page使用Urlmixin的模型,它仍然需要一组重复的URL单元测试.当然,我可以将它们放在帮助器中,但这看起来很混乱.
有没有更基本的解决方案,还是这样的解决方案?
我们最近转向jQuery 1.6并遇到了attr()与prop()back-compat问题.在部署变更后的最初几个小时内一切都很好,然后开始为人们打破.我们很快发现了问题并更新了有问题的JS,这是内联的.
不,我们有一些人仍然有问题的情况.到目前为止,在每种情况下,我都可以通过告诉用户加载有问题的页面然后在浏览器中手动刷新它来让用户重新启动并运行.所以必须在某处缓存某些东西.
但基本上只有两个潜在的罪魁祸首:首先,jQuery库本身,但是它在查询字符串中加载了版本号,所以我认为浏览器会在缓存中刷新它.二,内联javascript.是否有可能在浏览器中缓存它?
我们正在使用APC,apc.stat = 1因此它应该检测到PHP文件已经更改.为了安全起见,我无论如何都要修改操作码缓存.
总而言之,我有两个问题:
任何其他想法也非常受欢迎.
更新:在检查使用Firebug没有任何意外缓存的过程中,我发现了旧的jQuery库将加载的情况.这并没有解释为什么我们在部署网站之后和更新内联代码之前遇到了麻烦,但如果它解决了问题,我会接受它.
我正在制作一个可在网页上运行的简单iOS共享扩展程序.它与Pinterest没有什么不同,因为它从页面中获取某些信息.但它与Pinterest的不同之处在于,用于执行抓取的JS有时会自定义为网页域.
所以在ExtensionPreprocessingJS run()函数中,我执行以下操作来加载和执行自定义JS:
var Action = function() {};
Action.prototype = {
run: function(arguments) {
var e = document.createElement('script');
e.setAttribute('type','application/javascript');
e.setAttribute('id','my-unique-id');
e.setAttribute('src','//mydomain.com/bookmarklet?d='+document.domain);
document.body.appendChild(e);
<some code to extract results and generate JSON>
arguments.completionFunction({ <my JSON here> });
}
};
var ExtensionPreprocessingJS = new Action
Run Code Online (Sandbox Code Playgroud)
我的bookmarklet端点提供了一些JS,它从页面中找到"pinning"的相关信息.
我的问题是,这是异步发生的,而不是在我使用运行方法结束时传回结果之前
arguments.completionFunction( <my JSON here> );
Run Code Online (Sandbox Code Playgroud)
我已经尝试在调用completionFunction()之前等待结果设置,但扩展似乎将其视为未完全调用的completionFunction().也就是说,共享扩展框架的设计似乎不适应异步JS.它假设在run()函数返回后,JS的结果可用.
我是否误解了共享扩展设计,或者我是否需要寻找不同的方法来实现这一目标?我注意到Instapaper创建了一个没有原生UI的共享扩展,我想知道这是否是他们这样做的原因.
我看到一个简单的控制器方法的一个非常奇怪的问题.要么我缺少一些基本的东西,要么我遇到了一个bug.我的赌注是前者.
我有一个Thing模型ThingController.
一个Thing有两个变量,name并且display,两个字符串.
ThingController(下面的代码)有一个方法toggle_display,即切换的内容display之间"on"和"off".
问题是,当我调用此操作时,Rails会找到正确的Thing,但是@thing.display为零.当我检查数据库时,'display'列中的值是正确的.
奇怪的是,当我取消注释下面代码中的第三行(即访问@thing.name 前访问@thing.display)然后@thing.display很好 - 它不是零,它具有我期望的值.这就好像@thing.display只是在我访问后才能正确初始化@thing.name.
知道为什么我会看到这种非常奇怪的行为吗?
def toggle_display
@thing = Thing.find(params[:id])
# @thing.name
if @thing.display
@thing.toggle_display_in_model
@thing.save
end
redirect_to things_url
end
Run Code Online (Sandbox Code Playgroud) 我有一个PHP应用程序调用Web服务API来获取一些对象,然后再渲染包含这些对象的网页.在某些情况下,这些API非常慢(秒),从用户体验的角度来看,这是不可接受的.我知道我能做的两件事......
两者都不理想,所以我在考虑使用memcache(memcached的PHP扩展)来缓存我从第三方Web服务获得的对象.加载同一页面的不同用户将多次加载对象,因此这似乎有意义.
物体相对较小(~1k).
这听起来像是一种合理的方法吗?我知道memcached最初是为缓解数据库负载而设计的,所以我想知道是否有一个我没见过的地方.
谢谢.
我是php的新手.是否有任何函数可以匹配给定字符串中的模式,并返回该字符串中模式开头的索引?例如:if $pattern = '/abcd/',$string = 'weruhfabcdwuir'那么函数应该返回6,因为6是'abcd'in的起始索引$string