410.coffee

まじめにふざける。

PHPでURL短縮サービスを自作してみた|サンプルコードあり

私ある日URL短縮してえなと思って作り方調べたんですけど、

Googleなんちゃらとかめんどくさそうなので自作することにします。

仕組みを考える

URL短縮の仕組みってどうなってんですかね

分からんので自分で考えます。

短縮したURLって、

https://○○○.com/△△△

みたいな感じで△△△のところが変わって出てきますよね

ディレクトリじゃね?

△△△の後にindex.htmlが隠れているのでは?!

フォームからURLを受けとる

とりあえずフォームを作って内容を受け取れるようにします。

  <?php
    $url = $_POST[url];
   ?>
  <body>
    <form action="index.php" method="post">
    <input type="text" name="url">
    <input type="submit" name="sub" value="送信">
    </form>
  </body>

url変数にそのまま入力されたやつをぶち込むという形です。

しかしこのままだとurl以外も処理しちゃうので早めに手を打ちます。

URLかどうか判断するには

filter_var関数

を使います。

  if(filter_var($url, FILTER_VALIDATE_URL)){

  }

これでURLだった場合のみ処理されるようにできました!

これで私のサーバー容量事情解決ですね。

ディレクトリを作りたい

次にディレクトリを作っていきます。

ディレクトリを作るには、

mkdir関数を使います。

  $path = "url/";
  mkdir($path, 0777, true);

はい、無事我がサーバーにurlというディレクトリができていました。

しかしねえ…

ディレクトリ名が被らないようにするためにはどうしましょう

連番を振る

これしかないわけで…

ということでcount.txtを作って、
1を追記しまくってそのファイルの容量で連番を振る形になりました。

適当にSubmitから呼び出し食らったらファイルに追記するコードを書きます。

  if (isset($_POST['sub'])) {
    $file_handle = fopen( "./count.txt", "a");
    fwrite( $file_handle, '1');
    fclose($file_handle);
  }

んで適当にファイルの容量を読み取るコードを書きます。

  $count = filesize("./count.txt");

それを作成するディレクトリ名に振れば―?

  mkdir($count, 0777, true);

完成ですね。

これで1,2,3,4,5,…みたいな感じでディレクトリが作成されると思います。

ディレクトリの中に新しくファイルを作る

次にさっき作ったディレクトリの中に新しくindex.htmlを作ってもらいます。

新しくファイルが作りたいなら、

fopen関数

を使います。知らんけど

とりあえずさっき作ったディレクトリにindex.htmlという名のファイルを作ってもらいます。

  fopen('./'.$count.'/index.html', "a");

あってるかわかりませんけどできてるんでできてるんだと思います。

htmlのなかに書きたい

このままだともぬけの殻のhtml君なので、命を授けたい。

そのためには

fwrite関数

がきっと役に立ちます。

さっきのをちょっと改良して、

  $file_handle = fopen('./'.$count.'/index.html', "a");
  fwrite( $file_handle, $template);
  fclose($file_handle);

こんなんになりました。

あとは$templateに書きたいものを書くだけです。

たしか、htmlから別のサイトに転移するためには

<META HTTP-EQUIV='refresh' CONTENT='秒; URL='>

的なのつかったと思うので、それを書いていきます。

  $template = '<META HTTP-EQUIV="refresh" CONTENT="0; URL='.$url.'">';

うーん、いい出来ですね。

0秒で$urlに飛ぶって感じです。

もうこれでほとんど完成なのですが、

最後にひと手間

完成したURLを表示

これやっとかないとダメですね

  print('https://○○○.com/'.$count.'/');

はい。これで完全に完成ですね。

最後に

思い付きで始めましたがうまくいってよかったです。

ただ、もっといいやり方があるかもしれませんが…

お役に立てたらうれしいです。

それでは!

サンプルコード

ご自由にお使いください~

<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <?php
    $url = $_POST[url];

    $template = '<META HTTP-EQUIV="refresh" CONTENT="0; URL='.$url.'">';

    if (isset($_POST['sub'])) {
      if(filter_var($url, FILTER_VALIDATE_URL)){
        $file_handle = fopen( "./count.txt", "a");
        fwrite( $file_handle, '1');
        fclose($file_handle);

        $count = filesize("./count.txt");

        mkdir($count, 0777, true);

        $file_handle = fopen('./'.$count.'/index.html', "a");
        fwrite( $file_handle, $template);
        fclose($file_handle);

        print('https://○○○.com/'.$count.'/');
      }
    }
   ?>
  <body>
    <form action="index.php" method="post">
    <input type="text" name="url">
    <input type="submit" name="sub" value="送信">
    </form>
  </body>
</html>