0

1 日ごとに異なる画像を送信する 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

文字列と比較する必要があります。そうでない場合は、存在しない定数と比較しようとします。だからそれは

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 に答える
1

Monday は文字列である必要があります。そうでない場合、PHP はそれを定数として扱い、定数が存在しないことを発見し、警告を発して、それが文字列であると判断します。

if($today=="Monday"){

他の曜日名も同様

警告メッセージはおそらく出力を台無しにしています

于 2012-11-30T14:33:18.613 に答える
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 に答える