PHP
ネタ

【ネタ】超手抜きで作る:カウンタ付きランダム画像表示

【ネタ】超手抜きで作る:カウンタ付きランダム画像表示

サイトを運営していると、「ランダムで画像を表示したい」という事がよくあると思います。それを実現するコードはたくさん転がっていると思いますので…

  • 標準関数だけを使う
  • 超短時間で作る
  • とにかく手間をかけない
  • 変わった方法

…という条件でコードを書いてみます。目標は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.そうですね。

  • Q.if ($fp = fopen())if ($path = glob()) という書き方が気持ち悪い。
    • A.そうですね。

  • Q.表示回数記録ファイルって1日に1ファイルできるのでは?
    • A.そうですね。

  • Q.表示回数記録ファイルって1日に100,000回表示されたら、ファイルサイズが100,000byteになるのでは?
    • A.そうですね。

  • Q.「pv」ディレクトリ内に想定外のファイル名のファイルがあるとマズイのでは?
    • A.そうですね。

  • Q.10分で書けた?
    • A.これを「書いた」と呼べるのなら、コードにコメントを付けてQiitaの記事にするのにかけた時間は、コードを書く時間の10倍以上。

  • Q.Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」だよ?
    • A.いつもお世話になってます。

  • Q.これだからPHPerは…
    • A.言語やそれを使う人へダメ出しをしたら君の価値が上がるの?もっと他にやるべき事があるんじゃないかな。(ミサワ風)

  • Q.反省してる?
    • A.お固い事ばかり言ってないで、たまにはリラックスしたら?(ミサワ風)

結論

Qiita向けの記事を真面目に書くのは大変。