2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-11-16

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

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

…という条件でコードを書いてみます。目標は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向けの記事を真面目に書くのは大変。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?