20200531のPHPに関する記事は10件です。

【PHP(Laravel)】ControllerからViewにデータを渡す2つの方法

概要

  1. ビューメソッドを使用してデータを渡すビューを指定する。
  2. データを渡す。(方法2つ)

1.ビューメソッドを使用してビューを指定する

例)articlesコントローラーのindexファイルを指定する

return view('articles.index')

2.データを渡す。(方法2つ)

データが入った変数 $articles をビューに渡す。

1.Withメソッドでデータを渡す。

return view('articles.index')->with(['articles' => $articles]);

2.Compact関数でデータを渡す。

return view('articles.index', compact('articles'));
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPで定数define()を使う方法

定数とは

〇一度宣言すると、後から値を変更できない。(値の変更が可能なのは変数)
〇プログラム内で何度も参照される値で、プログラム実行時に変更する必要のないものに使われる。
〇大文字・小文字どちらでも使用できるが、慣習的に大文字で定義されることが多い。

定数のルール

使える文字

  • 英数字
  • アンダースコア
  • 日本語(使用できるが一般的には使用しない)

定義する際のルール

  • 先頭数字はNG
  • 大文字と小文字は区別される
  • 記号で使用可能なのはアンダースコアのみ
  • 定義済みの定数は上書きできない

定数の種類

〇PHPでは

  • define()
  • const

の2種類の定数が使用可能。

define()

define('定数の名前','格納する値');

index.php
// 定数を定義
define('MSG01','Emailの形式で入力してください');
define('MSG02','パスワードが正しくありません');

echo MSG01; //「Emailの形式で入力してください」が出力されます。
echo MSG02; //「パスワードが正しくありません」が出力されます。

// 同じ定数名で再定義
define('MSG01','文字数オーバーです');

// 定数は上書きされません
echo MSG01; // 「Emailの形式で入力してください」が出力されます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelでメモリリーク??? 実はそんなわけなかったというしょうもない話

タイトルで若干ネタバレしてますが、ほんとしょうもない話です。ただ、おそらく同様のことで悩まれている方が何人かいるようなので、記事にしてみます。最後の方にちょっとした知見もありますが、ほぼ読み物です。

ちなみにSQSキューワーカーでメモリリークが起きるという記事がQiitaにありますが、今回の記事はこの件と直接関係はありません。

参考)
https://qiita.com/sh-ogawa/items/d64cafce2a2646b7abc6

単純な処理でなぜか延々と膨れ上がるメモリ使用量

Laravel 6.xでデータベース(今回はMySQLですがこの話に関係はない)に数万行のデータをインポートしようと試みたある日のことでした。CSVファイルから1000行ずつデータを読み出して1行ずつインサートするという手抜き超簡単なプログラムです(Laravel Excelを使用)。インポートプログラムが完成して数万行あるCSVファイルを食わせてバッチを実行したところ、数千行まで処理が走った瞬間に

PHP Fatal error: Allowed memory size of xxx bytes exhausted.

「ああん? いやいや、たかが数千行でメモリ食い潰すほどのことはなかろう。てか、1000行ずつデータとってBULK INSERTすらもせずゆっくりインサートしてるのにどこでこんなにメモリなんか使ってるんだ??? ははーん・・・・、これはなんかメモリリーク的なことが起きてるのでは????」

そもそもPHPでは意図的にメモリを確保したり解放したりなんてまずしませんし、メモリリーク的なことが起きるとしても循環参照が起きるなどでかなりレアケースではありますが…。以下を参考。

【PHP7.4新機能】弱参照(WeakReference)とGCとメモリリークについて整理したよ!
https://qiita.com/miracle-FJSW/items/f35c3e90a5d14eb6eba3

なんて変に勘ぐってしまったのが事の始まりでした。

プロセスのメモリ使用量を監視してみると、確かに徐々にメモリ使用量が膨れ上がり、1分間くらいで数十MBずつくらい物理メモリ(RES)が盛り盛りと増えていくのです。これは何事か!?
image.png
4000行くらい入れただけで436MBも使っちゃってる・・・

さらっと調べてみてもどうも同様のケースは見つけられない

データを読み込んで、そのデータをDBにインサートするだけという普通のことをしているだけなので、さすがに調べたら見つかるだろうと思ったのですが、どうにも見つかりません。でてくるのは「クエリログがメモリを食い潰しているのでそれを切れ!(\DB::connection()->disableQueryLog();)」的な記事がちらほら出てくるのですが、どうもLaravel5.5時代の話のようです。
参考
Memory leak on database insert function
https://github.com/laravel/framework/issues/30012

今はデフォルト設定でそのようなことは起きない模様。

ただ、DBのインサートをする行だけコメントアウトしてプログラムを実行すると、たしかにメモリ使用量は増えないので、Eloquentあたりになにかバグでもあってそれを踏んでいるのだろうか?なんてこの時点では思ってしまいました。

Laravel Telescope の存在に気づく

こまったなぁ、と思いつつ解決できないこと数か月・・・(一時的にphp.iniの設定をいじり、メモリがっつり増やせばデータは全件入るのでめちゃくちゃ困ってるわけではなかった)。

ある日、ぼんやりとプロジェクトファイル全体を眺めていたら、Laravel Telescopeを入れていることにふと気づきました。今までまったく使ってないのになんでこんなもん入れてるんだ? なんて思いつつ、すごく嫌な予感がしました。Laravel Telescopeをご存じでない方に、説明ページの冒頭を引用させていただきます。

Laravel TelescopeはLaravelフレームワークのエレガントなデバッグアシスタントです。Telescopeはアプリケーションへ送信されたリクエスト、例外、ログエンティティ、データクエリ、キュージョブ、メール、通知、キャッシュ操作、スケジュールされたタスク、さまざまなダンプなどを提示します。TelescopeはLaravelローカル開発環境における、素晴らしいコンパニオンです。
image.png

あー、これは危険な香りがプンプンする!!!ということで、これを無効にする設定(.envにTELESCOPE_ENABLED=false)をいれてphp artisan config:cacheしたあとにスクリプトを実行すると・・・ はいビンゴでした。

君か・・・ 数か月も見つけられなかったよ・・・

Laravel Telescope の一部機能を無効にする方法は色々ある模様

上の例では機能全体を無効にしましたが、一部機能だけ無効にすることもできます。詳しくはLaravel Telescopeのドキュメントを見ていただくといいと思いますが、今回の場合だと、Queryワッチャーをオフにすればメモリの使用量は大幅に減ります。ただ、Queryワッチャー以外でもメモリは使用しているので、ちょろちょろとメモリ使用量が増えてはいきます。

コード内の一部のみLaravel Telescopeを無効にしたい場合は

use Laravel\Telescope\Telescope;

//〜略〜

Telescope::stopRecording();
//Laravel Telescopeでメモリ食いの処理
Telescope::startRecording();

という感じで書けばメモリ問題も上手く捌けるようです。

参考)
Query builder memory leak on large insert
https://github.com/laravel/framework/issues/27539

この記事はLaravel Telescopeの件で気づいた後に見つけたけど、やっぱりメモリリークって勘違いするよなぁw

結論

Laravel Telescopeはメモリ食うから気をつけろ。

そして、入れたことを忘れるな(普通は忘れないよねw)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS 上の ALB の HealthChecker に 200 を返す方法

AWS 上の ALB のターゲットの Moodle で HealthChecker に認識させることはできないのは、config.php が読み込んでいる lib/setuplib.php でリダイレクトしているからで、ターゲットでは 303 になりうまくいきません。
config.php の最上部で、以下のように記述すれば、200 を返す事ができます。
コツは、lib/setuplib.php を読み込む前に処理を入れることです。

$http_user_agent = $_SERVER['HTTP_USER_AGENT'];
if (strstr($http_user_agent, "ELB-HealthChecker")) {
    echo "ok";
    die;
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

phpのcURL、SplFileObjectでsslエラーが出たときに試したいこと

あぁ、休日の一覧データが欲しい。
欲しい、
欲しい、

別のサーバ(内閣府)からcsvで取得してみる。
せっかくなのでcurlとSplFileObjectの2方法で試す。

$url = 'https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv';

# curl
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);

# SplFileObject
$file = new NoRewindIterator(new SplFileObject($url));

curlは$dataに設定されない。(errnoは35)
SplFileObjectはエラーが発生。

PHP Fatal error:  Uncaught RuntimeException: SplFileObject::__construct(): SSL operation failed with code 1. OpenSSL Error messages:
error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small

curl_errno([35] => 'CURLE_SSL_CONNECT_ERROR')
調べて見つけたページ
ふーん。。。

接続先の鍵が短いのか?(たぶんopensslのバージョンが古いかなにか。)
なら短い鍵でも大丈夫なようにすれば良さそう。
オプションを調べる。

curl_setoptにCURLOPT_SSL_CIPHER_LISTを発見。
stream_context_createsslオプションにciphersを発見。

sslオプションを設定してみる。

$url = 'https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv';

# curl
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');
$data = curl_exec($ch);
curl_close($ch);

#SplFileObject
$ctx = stream_context_create([
  'ssl' => array(
    'ciphers' => 'TLSv1'
  )
]);
$file = new NoRewindIterator(new SplFileObject($url, 'r', false, $ctx));

できた!

内閣府のsslキーって短いんだ。。。大丈夫なのか?
終わり:v:

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelでメール送信する

前提条件

eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っています

Gmailのアプリパスワード取得

今回はLaravelからGmailを使ってメールを送信しようと思います
そのためにGmailのアプリパスワードを取得します

(1) googleアカウントにアクセス
(2) セキュリティをクリックし2段階認証プロセスをONにする
a.png

(3) セキュリティをクリックしアプリパスワードをクリックする
b.png

(4) パスワードの取得
アプリを選択→メール
デバイスを選択→その他(名前入力) 適当な名前を入力する
生成をクリック

表示されたパスワードをメモしておく

SMTPサーバの情報を設定

/sample/.envを編集

‥‥
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=XXXXX@gmail.com
MAIL_PASSWORD=XXXXXXXXXX
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=XXXXX@gmail.com
MAIL_FROM_NAME="sample sender"
‥‥

MAIL_USERNAME、MAIL_FROM_ADDRESSは送信元のGmailアドレス
MAIL_FROM_NAMEは送信者名
MAIL_PASSWORDは先ほど取得したアプリパスワード(半角スペースはいらない)

ここで設定した値は/sample/config/mail.phpで使われます

Mailableクラス作成

(1)コマンドラインで
cd sample
php artisan make:mail SampleMail
xdebugの設定をしているとeclipseが実行していいですかというプロンプトを出すのでOKを押します
eclipseプロジェクトを右クリック→リフレッシュ
/sample/app/Mail/SampleMail.phpが現れます

(2) SampleMail.php修正

SampleMail.php
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class SampleMail extends Mailable
{
    use Queueable, SerializesModels;

    public $sample;
    private $imgName;
    private $imgMineType;
    private $imgData;

    public function __construct($sample, $imgName, $imgMineType, $imgData)
    {
        $this->sample = $sample;
        $this->imgName = $imgName;
        $this->imgMineType = $imgMineType;
        $this->imgData = $imgData;
    }

    public function build()
    {

        return $this->view('sample.mailContentHtml')
                     ->text('sample.mailContentText')
                     ->subject('sample mail')
                     ->attachData(
                         $this->imgData,
                         $this->imgName,
                         [
                         'mime' => $this->imgMineType,
                         ]);
    }
}

変数宣言$sample$imgName$imgMineType$imgDataを追記
public変数はメール本文のview内で使用できるようになります
コンストラクタを変数受け取れるように修正
buildメソッド実装
viewはメール本文HTML用。後でmailContentHtml.blade.phpを作成します
textはメール本文HTML用。後でmailContentText.blade.phpを作成します
subjectはメールタイトル
attachDataは添付ファイル

Controllerにメソッド追加

(1) /sample/app/Http/Controllers/SampleController.phpに下記を追記
use App\Mail\SampleMail;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Storage;

(2) /sample/app/Http/Controllers/SampleController.phpにmailメソッドを追記

    public function mail()
    {
        $stream = Storage::readStream('sample.png');
        $imgData = stream_get_contents($stream);
        fclose($stream);

        Mail::to("XXXXXXXXXXXXXXXX@gmail.com")
            ->cc("XXXXXXXXXXXXXXX@gmail.com")
            ->bcc("XXXXXXXXXXXXXXXXX@gmail.com")
            ->send(new SampleMail('sample text', 'sample.png', 'image/png', $imgData));

        return view('sample.mail');
    }

Storageクラスは/sample/storage/app配下のファイルを扱えるクラス。どのフォルダを扱えるようにするかは、/sample/config/filesystems.phpで設定されている
Storage::readStream('sample.png')で/sample/storage/app/sample.pngのリソースを取得している
toは送信先
ccはカーボンコピー
bccはブラインドカーボンコピー
sendで先ほど作成したMailableクラスを指定

(3) サンプル用の添付ファイル
適当な画像作成ソフトでsample.pngを作成し、/sample/storage/app/sample.pngに保存

(4) /sample/routes/web.phpに下記を追記
Route::get('sample/mail', 'SampleController@mail');

viewの作成

(1) /sample/resources/views/sample/mail.blade.phpファイル作成

mail.blade.php
<html>
    <head>
        <title>sample</title>
    </head>
    <body>
        メール送信しました
    </body>
</html>

(2) /sample/resources/views/sample/mailContentHtml.blade.phpファイル作成

mailContentHtml.blade.php
<html>
    <body>
        <div style="font-weight: bold; color: red;">{{ $sample }}</div>
    </body>
</html>

(3) /sample/resources/views/sample/mailContentText.blade.phpファイル作成

mailContentText.blade.php
{{ $sample }}

Mailableクラスのpublic変数sampleを出力しています。
Mailableクラスのpublic変数はメール本文のviewで使うことができます

動作確認

http://localhost/laravelSample/sample/mail

メール送信しました

メールが送信され受信できました

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【WSL2】インストールしたての時に開発環境構築時にハマったこと

WSL2をインストール時にすんなりとうまくいったらなにも問題ないのですが、
エラーが出力して原因を探ったり、一見うまくいったように見えても実は間違っていたりと、
使いこなすのがなかなか大変です。
ハマったことを色々書いていこうと思います。

Ubuntu 18.04.4 LTSを使用しています。

phpをインストールしてみるとエラーが出力されて、インストールできない

Err:6 http://security.ubuntu.com/ubuntu bionic-updates/main amd64 apache2-bin amd64 2.4.29-1ubuntu4.6
  404  Not Found [IP: XX.XXX.XX.XXX 80]
Err:7 http://security.ubuntu.com/ubuntu bionic-updates/main amd64 apache2-utils amd64 2.4.29-1ubuntu4.6
  404  Not Found [IP: XX.XXX.XX.XXX 80]
Err:8 http://security.ubuntu.com/ubuntu bionic-updates/main amd64 apache2-data all 2.4.29-1ubuntu4.6
  404  Not Found [IP: XX.XXX.XX.XXX 80]

パッケージの更新とアップグレードをしていなかった

sudo apt update && sudo apt upgrade

この後に、もう一度phpをインストールする

参考:
https://docs.microsoft.com/ja-jp/windows/wsl/user-support

この調子でnodeもインストールしたが、vue.jsの開発環境をうまく構築できない

エラーなどなにも出力されずに、インストールもうまくいったように見えました。

ところが、apt-getに登録されているnodeのバージョンが古いままになっているので、これだと失敗します。作りたい開発環境にあわせてnodeをインストールする。

参考:
https://docs.microsoft.com/ja-jp/windows/nodejs/setup-on-wsl2

Ubutu日本語化/英語切り替える

https://www.atmarkit.co.jp/ait/articles/1806/28/news043.html

まとめ

開発環境を作ろうとして調べると、いろんな情報が手に入ります。
そもそもWSL2やUbuntuを理解していないとハマってしまいがちでした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

さくらVPSでLAMP + Wordpress環境を構築する方法まとめ

さくらVPSでLAMP + Wordpress環境を構築する方法まとめ

学習用にさくらVPSでLAMP環境を構築したので、手順をまとめます.

目次

動作環境

OS : macOS Mojave 10.14.6
VPS OS : centOS

手順

さくらVPSの申し込み

  1. さくらのwebサイト>VPS>2週間無料でお試し にアクセス
    サーバをカートに入れ申し込み.

  2. メールに記載されているIDとパスワードでログインし,VPSコントロールパネルにログイン

  3. 各種設定>OSインストール
    *OSをインストールする際にVPSにログインするためのパスワードを入力するので忘れずにメモします.
    image.png

これでさくらVPSの申し込みからOSのインストールまでが完了です.

ssh接続

つぎにローカルPCからインターネット上のVPSに接続するためのSSH接続の設定手順をまとめます.

1. Terminal起動とroot権限でログイン

手元のMACでTerminalを起動します.

そして以下のsshコマンドで接続します.
パスワードはOSをインストールした際に入力したものです.

$ ssh root@VPSのIPアドレス

2. ソフトウエアのupdate

$ yum update

3. 一般ユーザの作成

$ adduser jun1 #user追加
$ passwd jun1 #password設定

sudoが使えるように設定

$ visudo
wheel ALL=(ALL) ALL #コメントアウトを外す

jun1ユーザをwheelグループに追加

$ usermod -aG wheel jun1
$ groups jun1
jun1 : jun1 wheel

jun1でログインできるか確認

$ ssh jun1@VPSのIPアドレス
$ パスワード入力 

4. ssh鍵認証の設定

ローカルのPCのターミナルを起動して実行

MAC$ ssh-keygen -t rsa -v
MAC$ ls ~/.ssh
config      id_rsa      id_rsa.pub  known_hosts

sshでVPSに接続

VPS$ mkdir .ssh
VPS$ chmod 700 .ssh

ローカルPCからVPSへ公開鍵を転送

ローカルPC
MAC$ scp ~/.ssh/id_rsa.pub jun1@VPSのIPアドレス:~/.ssh/authorized_keys
MAC$ VPSのパスワード入力

鍵を利用してサーバにログイン

ローカルPC
MAC$ ssh -i ~/.ssh/id_rsa jun1@VPSのIPアドレス

ssh接続のセキュリティ設定

1.ポート番号の設定

VPS
$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.ort #設定ファイルのバックアップ
$ sudo vim /etc/ssh/sshd_config

Portを検索し、#を消して, 22 -> 56789(任意の番号で可)

2.パスワード認証の無効化

PasswordAuthenticationを検索し、
noに変更

3.rootログインの無効化

PermitRootLoginで検索し,noに変更

4.設定ファイルの確認

VPS
$ sudo sshd -t #設定ファイルに構文ミスがないか確認.何も出なければOK
$ sudo systemctl restart sshd #sshdの再起動

5.ファイアウォールの設定

VPS
$ sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-56789.xml

$ sudo vim /etc/firewalld/services/ssh-56789.xml

port番号を22 -> 56789に変更

VPS
$ sudo firewall-cmd --reload
>success
$ sudo firewall-cmd --permanent --add-service=ssh-56789
>success
$ sudo firewall-cmd --reload
>success
$ sudo firewall-cmd --list-all
>ssh-56789

6.SSH動作確認

上記で開いていたターミナルを閉じずに別タブを開く

MAC
$ ssh -p 56789 -i ~/.ssh/id_rsa jun1@VPSのIPアドレス

7. sshをファイアウォールから削除

VPS
$ sudo firewall-cmd --permanent --remove-service=ssh
$ sudo firewall-cmd --reload

最後に念の為、ssh接続できるか確認

MAC
$ ssh -p 56789 -i ~/.ssh/id_rsa jun1@VPSのIPアドレス

apacheのインストール

VPS
$ sudo yum install httpd 

Apacheを起動

VPS
$ sudo systemctl start httpd
$ systemctl status httpd
#Activeと表示されているか確認

Firewallの設定

VPS
$ sudo firewall-cmd --add-service=http --zone=public --permanent
$ sudo firewall-cmd --add-service=https --zone=public --permanent
$ sudo systemctl restart firewalld

さくらVPSのパケットフィルタの設定

さくらVPSのコントロールパネル>設定>パケットフィルタ>WEBを許可

ブラウザからApacheの動作確認

ブラウザにVPSのIPアドレスを入力し,以下のテストページが表示されればOK

image.png

Apacheの自動起動の設定

VPS
$sudo systemctl enable httpd

権限の設定

ドキュメントルートの所有権をapacheに変更します.

VPS
$sudo groupadd web #グループの作成
$sudo usermod -aG web jun1 #グループにユーザの追加
VPS
$sudo chown apache:web /va/www/html/
$sudo chmod -R 775 /var/www/html/

htmlファイルを作成しApacheの動作確認

VPS
$ vim /var/www/html/index.html
#適当に編集して保存

ブラウザから開いて確認

ドメインの設定

ドメイン取得サイトから購入

今回はバリュードメインに会員登録し、購入します。

DNS設定

バリュードメインにログインし、DNSを設定
詳細は各ドメインサイトから確認します.

バリュードメインの設定画面
a VPSのIPアドレス

ブラウザにドメインを入力し、表示されるか確認
*DNSの反映には1日かかることもあります.

リポジトリの設定

2つのリポジトリをインストールします.

epelリポジトリ(Linuxのリポジトリ)
remiリポジトリ(PHPのリポジトリ)

epelリポジトリ

VPS
$sudo yum repolist
#epelリポジトリがない場合は以下実行
$sudo yum install epel

remiリポジトリ

ブラウザからremiリポジトリのURLをコピー

image.png

VPS
$sudo yum localinstall remiのurl

phpのインストール

インストールできるバージョンを確認

VPS
$ yum list available | grep php-

php71-common.x86_64を確認

VPS
$ sudo yum --enablerepo=remi-php71 install php php-devel php-mysql php-gd php-mbstring

Apaceh再起動

VPS
$ sudo systemctl restart httpd

PHPの設定

VPS
$ sudo cp /etc/php.ini /etc/php.ini.org #設定ファイルのバックアップ
$ sudo vim /etc/php.ini

ファイルのアップロード上限を変更

php.ini
post_max_size = 128M #8M -> 128M
upload_max_filesize = 128M #2M -> 128M

Apaceh再起動

VPS
$ sudo systemctl restart httpd

PHPの動作確認

/var/www/html/index.php
<?php 
echo 'Hello World';

ブラウザにドメイン名を入力し,index.phpを確認する

mysqlのインストール

MariaDBの削除

VPS
$ sudo yum remove mariadb-libs
$ sudo rm -rf /var/lib/mysql

MySQLインストール

MySQL 5.7をインストールする

VPS
$ sudo yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 
$ sudo yum install mysql-community-server

MySQLの設定

VPS
$ sudo systemctl start mysqld
$ sudo cat /var/log/mysqld.log | grep 'temporary password' #初期接続パスワードを確認
VPS
$ mysql_secure_installation
#以下、指示どおり設定していく

VPS
$ mysql -u root -p
#ログインできるか確認

文字コードをUTFに変更

VPS
$ sudo vim /etc/my.conf
my.conf
character-set-server=utf8
VPS
$ sudo systemctl restart mysqld

自動起動の設定

VPS
$ sudo systemctl enable mysqld

sslの設定

certbotを利用するためバーチャルホストを設定

VPS
$ sudo vim /etc/httpd/conf.d/ドメイン名.conf
ドメイン名.conf
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName ドメイン名
</VirtualHost>

certbotをインストール

certbotのwebサイトからソフトウエアとOSを選択

VPS
$ sudo vim install certbot-apache

証明書を取得

VPS
$ sudo certbot --apache

動作確認

ブラウザにドメイン名を入力し、httpsになっているか確認

wordpressのインストール

DBの準備

VPS
$ mysql -u root -p 
mysql> create database myblog;
mysql> create user 'myblog_user'@'localhost' identified with mysql_native_password by '任意のpassword'
mysql> grant all privileges on myblog.* to 'myblog_user'@'localhost';
mysql> flush privileges;

wordpressのダウンロード

VPS
$ wget https://ja.wordpress.org/latest-ja.tar.gz

$ sudo tart -zxvf latest-ja.tar.gz
-C /var/www/
#圧縮ファイルを展開

$sudo chown -R apache:web wordpress/

$sudo vim /etc/httpd/conf/httpd.conf
httpd.conf
DocumentRoot "/var/www/wordpress"

<Directory "/var/www/wordpress">
ドメイン名.conf
DocumentRoot /var/www/wordpress
ドメイン名-le-ssl.conf
DocumentRoot /var/www/wordpress

wordpressの確認

ドメインにアクセスして以下のページが表示されるか確認
image.png

終わりに

今回はさくらVPSにLAMP環境を構築する学習の内容をまとめました。

Linuxコマンドの勉強になりました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPと Vue.jsで簡易掲示板を作ろう〜その2( SCSS編)〜

初めに

前回にの
PHPと Vue.jsで簡易掲示板を作ろう〜その1(PHP編)〜
の続きです。
3つのパートに分けて
1.PHPでとりあえず動く掲示板を作る
2.SCSSで簡単なデザインを作る←今回はここ
3.Vue.jsで少しリッチな動きをつける

目次

・このパートでの完成イメージ
・HTML部分の変更の記述
・SCSSの記述
・まとめ

このパートでの完成イメージ

スクリーンショット 2020-05-31 6.45.08.png

・ボタンホバー時

スクリーンショット 2020-05-31 6.43.24.png

・テキスト入力欄フォーカス時

スクリーンショット 2020-05-31 6.45.36.png

・投稿されたメッセージのホバー時

スクリーンショット 2020-05-31 6.47.19.png

今回はSCSSでこれらのスタイルをつけていきます。

HTML部分の変更の記述

前回のHTML部分にclassと一つだけdivをつけていきます

<div class="container">
        <h1 class="title">簡易掲示板へようこそ(XSS対策済み)</h1>

        <!-- 投稿ボタン -->
        <form method="post" class="text-form"><!-- 中の投稿ボタンが押されたらPOSTのリクエストを送る --> <!-- NEW class追加 -->
            <input class="text" type="text" name="text"> <!-- NEW class追加 -->
            <input class="submit" type="submit" value="投稿する"> <!-- NEW class追加 -->
        </form>

        <div class="frame"> <!-- NEW 追加 -->
            <table class="contents"> <!-- NEW class追加 -->
                <?php foreach((array)$all_data as $post_data) : ?>
                <tr>
                    <form method="post">
                        <td class="text"> <!-- $post_data[2]は$post_text(テキストデータ) --> <!-- NEW class追加 -->
                            <?php echo h($post_data[2]); ?>
                        </td>
                        <td class="date"> <!-- $post_data[1]は$date(日付) --> <!-- NEW class追加 -->
                            <?php echo $post_data[1]; ?>
                        </td>
                    </form>
                </tr>
                <?php endforeach; ?>
            </table>
        </div>
    </div>

SCSSの記述

style.scss
.container {
    border: 1px solid black;
    text-align: center;

    // 入力欄と投稿ボタン
    & .text-form {

        // text入力欄
        & .text {
            width: 70%; 
            padding: 11px 15px;
            font-size: 16px;
            border-radius: 3px;
            border: 2px solid #ddd; 
            box-sizing: border-box;

            // フォーカス時
            &:focus {
                border: 2px solid #ff9900; 
                z-index: 10; //前面に表示
                outline: 0; // 元からある線を消す
            }
        }

        // 投稿ボタン
        & .submit {
            border-radius : 5%;
            font-size: 16px;
            text-align: center;
            cursor: pointer;
            padding: 9px 15px;
            background    : #000066;
            color         : #ffffff;
            transition    : .3s;
            box-sizing: border-box;

            // ホバー時
            &:hover {
                border: 2px solid #000066;
                color: #000066;
                background: #ffffff;

              }
        }
    }



    // 枠線
    & .frame {
        margin-top: 15px;
        border: 13px solid #993300;

        // メッセージと日付
        & .contents {
            width: 100%;
            background: #009900;

                // メッセージ
                & .text {
                    font-size: normal;
                    border: 1px solid white;
                    border-radius: 5px;

                    // ホバー時
                    &:hover {
                        background: white;
                    }

                }

                // 日付
                & .date {
                    font-size: normal;
                    float: right;
                }

        }
    }
}

まとめ

今回のパートではSCSSで少しだけ見た目をつけました!なんの計画もなしにスタイルを作成するとデザインが壊滅することが分かりました?
次回はVue.jsでリッチな動きをつけます。
この記事を見てくださったあなたの成長を応援します!!
ーーーー
次のパート:coming soon

この記事もいかがですか?

初心者に捧げる〜PHPを使って九九の表を作ろう〜
Vue.jsで作る!自動保存するToDoリスト~その1~
初心者に捧げるハンバーガーメニューの作り方

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPで閲覧中のデバイスの画面サイズを返す。

下記サイトサンプルを修正、実行後リダイレクトしデバイスのwidthとheightを取得。
https://stackoverflow.com/questions/23239157/get-browser-width-using-php

get_screensize.php
<?php
session_start();
if(isset($_POST['width'])){
   $_SESSION['screen_size'] = array();
   $_SESSION['screen_size']['width'] = intval($_POST['width']);
   $_SESSION['screen_size']['height'] = intval($_POST['height']);
}


if(!isset($_SESSION['screen_size'])){
?>
<html>
<head>
<script>
function getSize(){
document.getElementById('inp_width').value=screen.width;
document.getElementById('inp_height').value=screen.height;
document.getElementById('form_size').submit();
}
</script>
</head>
<body onload='getSize()'>
<form method='post' id='form_size'>
<input type='hidden' name='width' id='inp_width'/>
<input type='hidden' name='height' id='inp_height'/>
</form>
</body>
</html>


<?php
}else{
//var_dump($_SESSION['screen_size']);
header('Location: http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/screensize_out.php');
}

?>

screensize_out.php
<?php
session_start();
echo "閲覧中のディスプレイサイズは下記の通りです!!<BR>";
   echo "width: ".$_SESSION['screen_size']['width']."<BR>";
   echo "hight: ".$_SESSION['screen_size']['height'];


?>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む