サイトを運営していると、「ランダムで画像を表示したい」という事がよくあると思います。それを実現するコードはたくさん転がっていると思いますので…
- 標準関数だけを使う
- 超短時間で作る
- とにかく手間をかけない
- 変わった方法
…という条件でコードを書いてみます。目標は10分以内。ネタ&お遊び重視。
ファイル構成
random_image.php
download_csv.php
img ┬ aaa.gif
├ bbb.png
└ ccc.jpg
pv ┬ YYYY-MM-DD.txt
├ 2017-11-15.txt
└ 2017-11-16.txt
random_image.php
- 表示回数を記録する。
- 「img」ディレクトリ内から画像ファイルをランダムに1つ選び出力する。
random_image.php
<?php
//-- 表示回数を記録(ファイルロックとか面倒なので追記で'1'を書き込む)
if ($fp = fopen('./pv/' . date('Y-m-d') . '.txt', 'a')) {
fwrite($fp, '1');
fclose($fp);
}
//-- 出力する画像のパス
$imgAry = glob('./img/{*.jpg,*.gif,*.png}', GLOB_BRACE) or outputImageGif();
//-- 色々書くのが面倒なので画像ファイルへリダイレクトして終わり
header('Location: ' . $imgAry[array_rand($imgAry)], true, 302);
exit;
//-- 1×1の透過GIFを出力する関数(スニペットからコピペ)
function outputImageGif()
{
header('Content-Type: image/gif');
echo base64_decode('R0lGODlhAQABAGAAACH5BAEKAP8ALAAAAAABAAEAAAgEAP8FBAA7');
exit;
}
download_csv.php
- 表示回数を集計してcsvでダウンロードする。あとはエクセルでも使えばいい。
download_csv.php
<?php
//-- fputcsv() とか SplFileObject とか面倒
$csv = '';
//-- 表示回数記録ファイル全部拾ってきて
if ($pathAry = glob('./pv/*.txt')) {
foreach ($pathAry as $path) {
//-- ファイル名をそのままCSVの各値として使う
$csv .= str_replace('-', ',', basename($path, '.txt')) . ','
. filesize($path) . "\n";
}
}
//-- 出力して終わり(スニペットからコピペ)
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=pv.csv');
header('Content-Length: '. strlen($csv));
echo $csv;
exit;
使い方
example.html
<img src="./random_image.php">
<a href="./download_csv.php">csv</a>
Q&A
- Q.ディレクトリのパスとかハードコーディングしちゃダメでしょ。
- A.そうですね。
- A.そうですね。
- Q.
if ($fp = fopen())
やif ($path = glob())
という書き方が気持ち悪い。- A.そうですね。
- A.そうですね。
- Q.表示回数記録ファイルって1日に1ファイルできるのでは?
- A.そうですね。
- A.そうですね。
- Q.表示回数記録ファイルって1日に100,000回表示されたら、ファイルサイズが100,000byteになるのでは?
- A.そうですね。
- A.そうですね。
- Q.「pv」ディレクトリ内に想定外のファイル名のファイルがあるとマズイのでは?
- A.そうですね。
- A.そうですね。
- Q.10分で書けた?
- A.これを「書いた」と呼べるのなら。なお、コードにコメントを付けてQiitaの記事にするのにかけた時間は、コードを書く時間の10倍以上。
- A.これを「書いた」と呼べるのなら。なお、コードにコメントを付けてQiitaの記事にするのにかけた時間は、コードを書く時間の10倍以上。
- Q.Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」だよ?
- A.いつもお世話になってます。
- A.いつもお世話になってます。
- Q.これだからPHPerは…
- A.言語やそれを使う人へダメ出しをしたら君の価値が上がるの?もっと他にやるべき事があるんじゃないかな。(ミサワ風)
- A.言語やそれを使う人へダメ出しをしたら君の価値が上がるの?もっと他にやるべき事があるんじゃないかな。(ミサワ風)
- Q.反省してる?
- A.お固い事ばかり言ってないで、たまにはリラックスしたら?(ミサワ風)
結論
Qiita向けの記事を真面目に書くのは大変。