レンタルサーバーでPHPプログラムを動かす

目次

このブログはさくらインターネットの「さくらのレンタルサーバ ライト」を使っています。 一番安いプランですが「PHP (CGIモード)」に対応しているので使ってみることにしました。

今回はPHPの設定を確認し、PCにDockerで開発環境を作成し、簡単なプログラムをアップしてみます。

レンタルサーバー用PHP CGIを作る

契約したライトプランではデータベースのMySQLは使えませんが、PHPのCGIは使うことができるのでなにかやってみようと思います。

ローカルPCは以下のような環境になっています。

  • OS は Ubuntu 20.04.2 LTS
  • ファイル転送ソフトは LFTP | Version 4.8.4
  • Docker Engine Version: 20.10.7

レンタルサーバーの確認

PHPの設定を、“phpinfo"関数で確認してます。

“phpinfo.php"ファイルをレンタルサーバーにアップロードして内容を確認してみます。

# 作業ディレクトリとして"php-cgi"を作成し、カレントディレクトリにします
~$ mkdir php-cgi
~$ cd php-cgi
# "phpinfo.php"ファイルを作成します
~/php-cgi$ echo "<?php phpinfo();" > phpinfo.php
# 作成された"phpinfo.php"ファイルの内容を確認します
~/php-cgi$ cat phpinfo.php
<?php phpinfo();
# "lftp"コマンドを使用してレンタルサーバーに"phpinfo.php"ファイルをアップロードします
# 名前は契約した内容にそれぞれ置き換えます
~/php-cgi$ lftp -u ユーザー名 ftp://サーバー名.sakura.ne.jp
パスワード:  ◀ FTPのパスワードを入力します
# レンタルサーバーのカレントディレクトリを確認し、
lftp ユーザー名@サーバー名.sakura.ne.jp:~> pwd
ftp://ユーザー名@サーバー名.sakura.ne.jp
# 転送先をカレントディレクトリに変更します
lftp ユーザー名@サーバー名.sakura.ne.jp:~> cd www
cd 成功、cwd=/home/ユーザー名/www
# 転送元(ローカルPC)のカレントディレクトリを確認します
lftp ユーザー名@サーバー名.sakura.ne.jp:~/www> lpwd
/home/izumi/php-cgi
# レンタルサーバーにファイルをコピーします
lftp ユーザー名@サーバー名.sakura.ne.jp:~/www> put phpinfo.php
17 bytes transferred
# 成功したので切断します
lftp ユーザー名@サーバー名.sakura.ne.jp:~/www> close
lftp ユーザー名@サーバー名.sakura.ne.jp:~/www> exit

レンタルサーバーに配置したファイルをWebブラウザで表示してみます。

“https://サーバー名.sakura.ne.jp/phpinfo.php”

PHPのバージョンが 7.4.21 と確認できました。

phpinfoをブラウザで表示

phpinfoをブラウザで表示

確認が終わったら、情報を不必要に公開しないように"phpinfo.php"ファイルを削除します。

php-cgi$ lftp -u ユーザー名 ftp://ユーザー名.sakura.ne.jp
パスワード: 
lftp ユーザー名@サーバー名.sakura.ne.jp:~> pwd
ftp://ユーザー名@サーバー名.sakura.ne.jp
lftp ユーザー名@サーバー名.sakura.ne.jp:~> cd www
cd 成功、cwd=/home/ユーザー名/www
# ファイルを削除します
lftp ユーザー名@サーバー名.sakura.ne.jp:~/www> rm phpinfo.php
rm 成功、`phpinfo.php' を削除しました
# 一覧を表示して削除されたことを確認します
lftp ユーザー名@サーバー名.sakura.ne.jp:~/www> ls
drwxr-xr-x   9 ユーザー名 users         512 Aug  5 21:01 .   
drwx---r-x  11 ユーザー名 users         512 May 21 20:27 ..
-rw-rw-r--   1 ユーザー名 users        8803 Jul 27 15:28 404.html
drwxrwxr-x   5 ユーザー名 users         512 Jul 27 15:28 categories
drwxrwxr-x   2 ユーザー名 users         512 Jul 27 15:28 css
-rw-rw-r--   1 ユーザー名 users        1350 May 12 15:41 favicon.ico
drwxr-xr-x   2 ユーザー名 users         512 May 12 15:41 img
-rw-rw-r--   1 ユーザー名 users       23517 Jul 27 15:28 index.html
drwxr-xr-x   2 ユーザー名 users         512 May 12 15:41 js
drwxrwxr-x   5 ユーザー名 users         512 Jul 27 15:28 page
drwxrwxr-x  30 ユーザー名 users        1024 Jul 27 15:28 posts
drwxrwxr-x  24 ユーザー名 users         512 Jul 27 15:28 tags
lftp ユーザー名@サーバー名.sakura.ne.jp:~/www> close
lftp ユーザー名@サーバー名.sakura.ne.jp:~/www> exit

PHPのDockereコンテナを作る

レンタルサーバーのPHPが Version 7.4.21 と確認できたので、同じバージョンのDockeコンテナを作成します。

とりあえず簡単なカレンダーを表示するPHPプログラムを作成したので、Dockerイメージに割り当て、動かしてみます。

php-cgi
 │ phpinfo.php
 └ cheap-calendar
     │ calendar.php
     └ css
         │ style.css
         └

calendar.php

<?php
// タイムゾーンを日本に設定
date_default_timezone_set('Asia/Tokyo');

// 今日の日付を取得する
$today = new DateTime('now');
$today_str = $today->format('Y-m-j');

// 表示する年月を設定する
// 表示したい年月を指定する場合には、URLに含まれるGETパラーメーターとして
// 'ym=2021-08' のようにする
if (isset($_GET['ym'])) {
    $ym = $_GET['ym'];
} else {
    // 指定がない場合今月とする
    $ym = $today->format('Y-m');
}

// 作成するカレンダーのタイムスタンプを作成
// 入力パラメーターが不正の場合strtotimeが失敗するので今月のカレンダーとする
$calendar_date = strtotime($ym.'-01');
if ($calendar_date === false) {
    $ym = $today->format('Y-m');
    $calendar_date = strtotime($ym.'-01');
}

// カレンダーのタイトルを作成
$calendar_title = date('Y年n月', $calendar_date);

// 前月・翌月を表示するためのパラーメーターを作成 yyyy-mm
$prev = date('Y-m', mktime(0, 0, 0, date('m', $calendar_date) - 1, 1, date('Y', $calendar_date)));
$next = date('Y-m', mktime(0, 0, 0, date('m', $calendar_date) + 1, 1, date('Y', $calendar_date)));

// 1日の曜日を取得 0:日曜日 ... 6:土曜日
$day_week = date('w', mktime(0, 0, 0, date('m', $calendar_date), 1, date('Y', $calendar_date)));
// 月曜始まりとするので 0:月曜日 ... 6:日曜日 に変換する
$day_week = ($day_week + 6) % 7;

// 月末日を求める
$eom = date('t', $calendar_date);

// 週ごとのHTML文字列を格納する
$weeks = array();

// 1週目のHTMLを作成
$week = '<tr>';
// 1日までの空セルを追加する
$week .= str_repeat('<td></td>', $day_week);

for ($day = 1; $day <= $eom; $day++) {

    if ($today_str == ($ym.'-'.$day)) {
        // 今日を強調表示する
        $week .= '<td class="today">'.$day.'</td>';
    } elseif ($day_week == 5) {
        // 土曜日
        $week .= '<td class="saturday">'.$day.'</td>';
    } elseif ($day_week == 6) {
        // 日曜日
        $week .= '<td class="sunday">'.$day.'</td>';
    } else {
        $week .= '<td>'.$day.'</td>';
    }

    // 最終日なら週末までの空セルを追加する
    if ($day == $eom) {
        $week .= str_repeat('<td></td>', 6 - $day_week);
        $day_week = 6;
    }

    // 週末ならタグを閉じる
    if ($day_week == 6) {
        $week .= '</tr>';
        $weeks[] = $week;
        $week = '<tr>';
        // 曜日を週初めにリセット
        $day_week = 0;
    } else {
        $day_week++;
    }
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>PHPで作ったカレンダー</title>
    <meta name="description" content="Cheap calendar made with PHP">
    <link href="css/style.css" rel="stylesheet">
</head>
<body>
<div class="calendar">
    <h1><a href="?ym=<?php echo $prev; ?>">&lt;=</a> <?php echo $calendar_title; ?> <a href="?ym=<?php echo $next; ?>">=&gt;</a></h1>
    <table>
        <tr>
            <th>月</th>
            <th>火</th>
            <th>水</th>
            <th>木</th>
            <th>金</th>
            <th class="saturday">土</th>
            <th class="sunday">日</th>
        </tr>
        <?php
            foreach ($weeks as $week) {
                echo $week;
            }
        ?>
    </table>
</div>
</body>
</html>

style.css

@charset "UTF-8";
.calendar {
    width: 80%;
    margin: 10%;
    text-align: center;
}
/* カレンダーの枠線 */
table {
    font-size: x-large;
    width: 100%;
    border-collapse: collapse;
}
table, th, td {
    border: 1px #000 solid;
}
th, td {
    line-height: 2.5em;
    text-align: center;
}
/* 土曜日 */
.saturday {
    color: #00bfff;
}
/* 日曜日 */
.sunday {
    color: #ff4500;
}
/* 今日 */
.today {
    background: #fffacd;
}

現在のカレントディレクトリ(php-cgi)をDockerコンテナに割り当て、起動します。 ポートは8080に割り当てています。

# Dockerイメージをダウンロードしてコンテナをバックグラウンドで実行
~/php-cgi$ docker run -dit --name rental-php -p 8080:80 -v "$PWD":/var/www/html/ php:7.4.21-apache
# コンテナが実行されていることを確認します
~/php-cgi$ docker ps
CONTAINER ID   IMAGE               COMMAND                  CREATED          STATUS         PORTS                                   NAMES
ed18be84574d   php:7.4.21-apache   "docker-php-entrypoi…"   20 seconds ago   Up 5 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   rental-php

Webブラウザからhttp://localhost:8080/phpinfo.phpのページを開けば、PHPの設定を確認することが出来ます。

コンテナのphpinfoをブラウザで表示

コンテナのphpinfoをブラウザで表示

レンタルサーバーと同じ"PHP Version 7.4.21"なことが確認できます。他の設定は異なっていますが複雑なことはしないので問題が出てこない限りこのまま進めます。

作成したカレンダーも表示されることを確認します。

http://localhost:8080/cheap-calendar/calendar.phpをブラウザで表示します。

作成したプログラムをブラウザで表示

作成したプログラムをブラウザで表示

Dockerコンテナを停止するにはdocker stop コンテナ名、再開するにはdocker stop コンテナ名コマンドを実行します。

# 停止
~/php-cgi$ docker stop rental-php
rental-php
# 再開
~/php-cgi$ docker start rental-php
rental-php

レンタルサーバーにアップする

作成したPHPプログラムをレンタルサーバーにアップロードして、動作させてみます。

$ lftp -u ユーザー名 ftp://サーバー名.sakura.ne.jp
パスワード:  ◀ FTPのパスワードを入力します
lftp ユーザー名@サーバー名.sakura.ne.jp:~> pwd                                   
ftp://ユーザー名@サーバー名.sakura.ne.jp
lftp ユーザー名@サーバー名.sakura.ne.jp:~> cd www
cd 成功、cwd=/home/ユーザー名/www
# レンタルサーバーにPHPプログラムを配置するディレクトリ"cgi"を作成します
lftp ユーザー名@サーバー名.sakura.ne.jp:~/www> mkdir cgi
mkdir 成功、`cgi' を作成しました              
lftp ユーザー名@サーバー名.sakura.ne.jp:~/www> lpwd
/home/izumi/php-cgi
# ローカルPCの"cheap-calendar"ディレクトリをレンタルサーバーの"cgi"ディレクトリ以下と
# ミラーリングすることでまるごとアップロードします
lftp ユーザー名@サーバー名.sakura.ne.jp:~/www> mirror -R cheap-calendar cgi/
合計: 1 個のディレクトリ、2 個のファイル、0 個のシンボリックリンク      
新規: 2 個のファイル、0 個のシンボリックリンク
3840 bytes transferred
# レンタルサーバーの"cgi"ディレクトリに移動します
lftp ユーザー名@サーバー名.sakura.ne.jp:~/www> cd cgi
cd 成功、cwd=/home/ユーザー名/www/cgi
# lsコマンドで"cheap-calendar"ディレクトリが作られたことを確認します
lftp ユーザー名@サーバー名.sakura.ne.jp:~/www/cgi> ls
drwx---r-x   3 ユーザー名 users         512 Aug 20 21:23 .   
drwxr-xr-x  10 ユーザー名 users         512 Aug 20 21:22 ..
drwx---r-x   3 ユーザー名 users         512 Aug 20 21:23 cheap-calendar
lftp ユーザー名@サーバー名.sakura.ne.jp:~/www> close
lftp ユーザー名@サーバー名.sakura.ne.jp:~/www> exit

ブラウザでレンタルサーバーにアップロードしたPHPプログラムを表示してみます。

https://hn-carter.sakura.ne.jp/cgi/cheap-calendar/calendar.php

レンタルサーバーでPHPを実行

レンタルサーバーでPHPを実行

Dockerコンテナで動かしたときと同様にレンタルサーバーでも動かすことが出来ました。