0

我有一个每天发送不同图像的 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 ] );

?>
4

4 回答 4

1

Monday 应该是一个字符串,否则 PHP 会将其视为一个常量,发现该常量不存在,发出警告,然后确定您的意思是它是一个字符串。

if($today=="Monday"){

同样适用于所有其他工作日名称

警告消息可能会弄乱输出

于 2012-11-30T14:33:18.613 回答
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 ] );
于 2012-11-30T14:39:43.823 回答
1

扩展上述标记答案的简短评论 - 请将您的代码重构为:

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;

将您的 sunday/domingo 文件重命名为0.jpg- 利用date('w').

于 2012-11-30T14:39:56.020 回答
0

我认为你应该从生成 HTML 的 PHP 文件中解决这个问题,而不是检索图像的文件。如果您想在周日加载图像,在周一加载另一个图像,.. 您可以在调用页面上使用类似的内容。

echo('<img src="'.date('w').'.jpeg" />');

(或使用任何其他方法来查找此页面中显示的正确文件名,例如 date('l')+array)

这样,您就可以让浏览器/服务器处理真实文件的缓存并显示当天正确的文件。

或者

<!other HTML here...>
<img src="<? echo('.date('w').'.jpeg');?>" />
<!other HTML here...>

如果文件是“主要是 HTML”。

如果您不想在星期二看到星期一的图像,那么缓存是一个坏主意,当然,除非那是您想要的。

(如果你真的想缓存它们,那么 $expires 应该是=到下一个午夜的秒数)

于 2012-11-30T15:27:03.383 回答