我有一个PHP脚本,每天发送不同的图像。我希望在白天缓存图像,但我的脚本没有按预期工作,因为在每个请求中都返回200 OK。
代码是:
<?php
$uno = '1.jpg';
$dos = '2.jpg';
$tres = '3.jpg';
$cuatro = '4.jpg';
$cinco = '5.jpg';
$seis = '6.jpg';
$siete = '7.jpg';
$today=date(l);
header('Content-Disposition: inline');
header('Content-Type: image/jpg');
header("Content-Transfer-Encoding: Binary");
$expire=60*60*24*1; // seconds, minutes, hours, days
header('Pragma: public');
header('Cache-Control: maxage='.$expire);
header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$expire) . ' GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
// Find what today is? using date function
if($today==Monday){
readfile($uno);
exit;
}
elseif($today==Tuesday){
readfile($dos);
exit;
}
elseif($today==Wednesday){
readfile($tres);
exit;
}
elseif($today==Thursday){
readfile($cuatro);
exit;
}
elseif($today==Friday){
readfile($cinco);
exit;
}
elseif($today==Saturday){
readfile($seis);
exit;
}
elseif($today==Sunday){
readfile($siete);
exit;
}
?>
这有什么问题?
更新
我只是尝试重构代码WebnetMobile.com说,但似乎缓存问题仍然存在,因为它仍然会返回200 OK。
新代码是:
<?php
$today=date("l");
header('Content-Disposition: inline');
header('Content-Type: image/jpg');
header("Content-Transfer-Encoding: Binary");
$expire=60*60*24*1;// seconds, minutes, hours, days
header('Pragma: public');
header('Cache-Control: maxage='.$expire);
header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$expire) . ' GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
// Find what today is? using date function
$map = array( 'Monday' => '1.jpg',
'Tuesday' => '2.jpg',
'Wednesday' => '3.jpg',
'Thursday' => '4.jpg',
'Friday' => '5.jpg',
'Saturday' => '6.jpg',
'Sunday' => '7.jpg'
);
readfile( $map[ $today ] );
?>
答案 0 :(得分:1)
星期一应该是一个字符串,否则PHP会将它视为常量,发现常量不存在,发出警告,然后决定你认为它是一个字符串。
if($today=="Monday"){
同样适用于所有其他工作日名称
警告信息可能会搞乱输出
答案 1 :(得分:1)
您需要与字符串进行比较,否则您会尝试与不存在常量进行比较。所以它应该是
if( $today == 'Monday' ) {
// do someting...
}
但更好的是,您应该使用if/elseif
switch/case
串。
switch( $today ) {
case 'Monday':
// do someting...
break;
}
而且最好的是,如果你需要做的只是选择正确的图像,你可以采用这种更聪明的方式:
$map = array( 'Monday' => '1.jpg',
'Tuesday' => '2.jpg',
...
);
readfile( $map[ $today ] );
答案 2 :(得分:1)
简短评论扩展上面的Mark答案 - 请将您的代码重构为:
header('Content-Disposition: inline');
header('Content-Type: image/jpg');
header("Content-Transfer-Encoding: Binary");
$expire=60*60*24*1; // seconds, minutes, hours, days
header('Pragma: public');
header('Cache-Control: maxage='.$expire);
header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$expire) . ' GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
readfile( date('w') . '.jpeg' );
exit;
将您的星期日/多明戈文件重命名为0.jpg
后的 - 利用date('w')
。
答案 3 :(得分:0)
我认为你应该从生成HTML的PHP文件中解决这个问题,而不是检索图像的文件。如果你想在星期日加载一张图片,在星期一加载另一张图片,你可以在调用页面上使用这样的东西。
echo('<img src="'.date('w').'.jpeg" />');
(或使用任何其他方法查找此页面中显示的正确文件名,如日期('l')+数组)
通过这种方式,您可以让浏览器/服务器处理实际文件的缓存并显示当天正确的文件。
或者
<!other HTML here...>
<img src="<? echo('.date('w').'.jpeg');?>" />
<!other HTML here...>
如果文件是“主要是HTML”。
如果您不希望在星期二看到星期一图像,那么缓存是一个坏主意,当然,除非这是您想要的。
(如果你真的想要缓存它们,那么$ expires应该是=到下一个午夜的秒数)