php artisan migrateしよう

public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('login_id');
            $table->string('role');
            $table->string('name');
            $table->string('password');
            $table->string('mail');
            $table->string('updated_person');
            $table->timestamps();
        });
    }

[vagrant@localhost laravel]$ php artisan migrate
Migration table created successfully.
Migrating: 2018_09_19_234806_create_articles_table
Migrated: 2018_09_19_234806_create_articles_table

.env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel57
DB_USERNAME=root
DB_PASSWORD=

table.php

{
        Schema::create('articles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('login_id');
            $table->string('role');
            $table->string('name');
            $table->string('password');
            $table->string('mail');
            $table->string('test_mail');
            $table->string('updated_person');
            $table->timestamps();
        });
    }

mysql> show columns from articles
-> ;
+—————-+——————+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+—————-+——————+——+—–+———+—————-+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| login_id | varchar(255) | NO | | NULL | |
| role | varchar(255) | NO | | NULL | |
| name | varchar(255) | NO | | NULL | |
| password | varchar(255) | NO | | NULL | |
| mail | varchar(255) | NO | | NULL | |
| test_mail | varchar(255) | NO | | NULL | |
| updated_person | varchar(255) | NO | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
+—————-+——————+——+—–+———+—————-+
10 rows in set (0.00 sec)

increments(”)だとint(10) primary key auto_increment, string(”)だとvarchar(255)になりますね。

access時間をinsert

mysql> use redirect
Database changed
mysql> select * from url
-> ;
+—-+——+—————————+
| no | id | url |
+—-+——+—————————+
| 1 | 001 | https://www.facebook.com/ |
| 2 | 002 | https://www.amazon.com/ |
| 3 | 003 | https://www.apple.com |
| 4 | 004 | https://www.google.com |
+—-+——+—————————+
4 rows in set (0.00 sec)

mysql> create table accesstime (
-> no int unsigned auto_increment primary key,
-> id varchar(11),
-> time datetime
-> );
Query OK, 0 rows affected (0.21 sec)

$date = new DateTime();
$datetime = $date->format('Y-m-d H:i:s');
echo $datetime;

if(isset($_GET["id"])){
	$id = $_GET["id"];
} else {
	$id = "001";
}
try {
$pdo = new PDO('mysql:host=localhost;dbname=redirect;charset=utf8','root','',
array(PDO::ATTR_EMULATE_PREPARES => false));
} catch (PDOException $e) {
 exit('データベース接続失敗。'.$e->getMessage());
}
$stmt = $pdo->query("SELECT * FROM url where id = $id");
$row = $stmt -> fetch(PDO::FETCH_ASSOC);
$url = "location: " .$row["url"]. "";


$stmt1 = $pdo -> prepare("INSERT INTO accesstime (id, time) VALUES (:id, :time)");
$stmt1->bindParam(':id', $id, PDO::PARAM_STR);
$stmt1->bindParam(':time', $datetime, PDO::PARAM_STR);

$stmt1->execute();

header($url);

idとaccess時間がtable accesstimeに入ってますね♪
mysql> select * from accesstime;
+—-+——+———————+
| no | id | time |
+—-+——+———————+
| 1 | 001 | 2018-09-19 01:03:54 |
+—-+——+———————+
1 row in set (0.00 sec)

さあ、laravelをやりましょう。

idとurlを格納

mysql

mysql> insert into url(id, url) values
-> (‘001’, ‘https://www.facebook.com/’),
-> (‘002’, ‘https://www.amazon.com/’),
-> (‘003’, ‘https://www.apple.com’),
-> (‘004’, ‘https://www.google.com’);
Query OK, 4 rows affected (0.15 sec)
Records: 4 Duplicates: 0 Warnings: 0

mysql> select * from url;
+—-+——+—————————+
| no | id | url |
+—-+——+—————————+
| 1 | 1 | https://www.facebook.com/ |
| 2 | 2 | https://www.amazon.com/ |
| 3 | 3 | https://www.apple.com |
| 4 | 4 | https://www.google.com |
+—-+——+—————————+
4 rows in set (0.00 sec)

あら、idが001ではなく、1になってますね。
drop tableしてvarchar(11)に変更します。

create table url (
no int unsigned auto_increment primary key,
id varchar(11),
url varchar(255)
);

パラメーターのURLをfetchする。

if(isset($_GET["id"])){
	$id = $_GET["id"];
} else {
	$id = "001";
}
try {
$pdo = new PDO('mysql:host=localhost;dbname=redirect;charset=utf8','root','',
array(PDO::ATTR_EMULATE_PREPARES => false));
} catch (PDOException $e) {
 exit('データベース接続失敗。'.$e->getMessage());
}
$stmt = $pdo->query("SELECT * FROM url where id = $id");
$row = $stmt -> fetch(PDO::FETCH_ASSOC);
echo $row["url"];

リダイレクト処理。awsでキャッシュさせれば、少し早くなるか。

if(isset($_GET["id"])){
	$id = $_GET["id"];
} else {
	$id = "001";
}
try {
$pdo = new PDO('mysql:host=localhost;dbname=redirect;charset=utf8','root','',
array(PDO::ATTR_EMULATE_PREPARES => false));
} catch (PDOException $e) {
 exit('データベース接続失敗。'.$e->getMessage());
}
$stmt = $pdo->query("SELECT * FROM url where id = $id");
$row = $stmt -> fetch(PDO::FETCH_ASSOC);
$url = "location: " .$row["url"]. "";
header($url);

Amazon ElastiCache:Amazon ElastiCache は、クラウドでのインメモリデータストアまたはキャッシュのデプロイ、運用、およびスケールを容易にするウェブサービスです。このサービスは、低速のディスクベースのデータベースに完全に依存せずに、高速のマネージド型インメモリデータストアから情報を取得できるようにすることで、ウェブアプリケーションのパフォーマンスを向上させます。
これか?
>メモリはディスク (磁気または SSD) よりも桁違いに高速であるため、インメモリキャッシュからのデータ読み取りは非常に高速 (ミリ秒以下) です。このきわめて高速なデータアクセスにより、アプリケーションの全体的なパフォーマンスが向上します。

パラメーターの値を取得する

$_GET[“id”] で取得できます。

-サンプル

if(isset($_GET["id"])){
	$id = $_GET["id"];
}

echo $id;

次に、mysqlにidと紐づくURLを格納します。

まず、create tableします。
mysql> create database redirect;
Query OK, 1 row affected (0.11 sec)

続いてtableを作ります。
create table url (
no int unsigned auto_increment primary key,
id int,
url varchar(255)
);

次に、insert tableしていきます。

phpのリダイレクト処理

	header('Location: https://www.cyberagent.co.jp/');
	exit();

ヘッダーで飛ばします。飛ばし先はスクランブルスクウェア サイバーエージェント!
まー30階でも40階でも特に何とも思わないですが、響きがいいですね。

<head>
<script>
setTimeout("link()", 0);
function link(){
	location.href="https://mixi.co.jp/";
}
</script>
</head>

jsによるリダイレクト。location.hrefで飛ばす。

<head>
<meta http-equiv="refresh" content="1;url=https://mixi.co.jp/">
</head>

.htaccessによるリダイレクト

RewriteEngine on
RewriteRule ^test.html$ https://mixi.co.jp/ [L,R=301]

GC(ガーベッジコレクション)

循環参照を持つゴミの回収
gc_disable()

Garbage Collectionとは
⇒動的に確保したメモリ領域のうち、不要になった領域を自動的に解放する機能

あ、C言語でやりましたね。

メモリ不足の例

$a1 = range(1, 200000); echo '1';
$a2 = range(1, 200000); echo '2';
$a3 = range(1, 200000); echo '3';
$a4 = range(1, 200000); echo '4';
$a5 = range(1, 200000); echo '5';

[vagrant@localhost test]$ php index.php
1234PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in /home/vagrant/test/index.php on line 7

なるほど。。
memory_limit = 128M

$a1 = range(1, 200000); echo '1';
$a1 = range(1, 200000); echo '2';
$a1 = range(1, 200000); echo '3';
$a1 = range(1, 200000); echo '4';
$a1 = range(1, 200000); echo '5';

[vagrant@localhost test]$ php index.php
12345[vagrant@localhost test]$

これならいける。
⇒phpにgarbage collectionがあるから。

循環参照
 参照関係に循環があると、たまっていきメモリ不足になる
 php5.2まで辿れなくなるよう自分でunsetしなければいけなかった
到達できるオブジェクトのみ残す

MySQLにHTMLタグを保存する

とりあえずdatabaseから作ります。

mysql> create database if not exists send_mail;
Query OK, 1 row affected (0.30 sec)

続いて、table

mysql> create table send_mail.html(
    ->  'id' int AUTO_INCREMENT,
    ->  'html' MEDIUMTEXT,
    -> );
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''id' int AUTO_INCREMENT,
 'html' MEDIUMTEXT,
)' at line 2

あれ、シングルクオテーションは必要ないか。。

sql文を編集します。

create table send_mail.html(
 id int AUTO_INCREMENT NOT NULL PRIMARY KEY,
 html MEDIUMTEXT
);

OK! insertしていきましょう♪

mysql> INSERT INTO send_mail.html (html)
    ->   VALUES ('タイトルが入ります');
Query OK, 1 row affected (0.46 sec)

mysql> select * from html;
+----+--------------------------------------------+
| id | html                                       |
+----+--------------------------------------------+
|  1 | タイトルが入ります          |
+----+--------------------------------------------+
1 row in set (0.12 sec)

うお!きたきたきたきた!

titleタグ以外のタグを入れてみます。

mysql> INSERT INTO send_mail.html (html)
    ->   VALUES ('');
Query OK, 1 row affected (0.53 sec)

mysql> select * from html;
+----+-----------------------------------------------+
| id | html                                          |
+----+-----------------------------------------------+
|  1 | タイトルが入ります             |
|  2 |  |
+----+-----------------------------------------------+
2 rows in set (0.09 sec)

おうおう。OKだ。

pdoでmysqlからfetchする。

<?php

try {
$pdo = new PDO('mysql:host=localhost;dbname=send_mail;charset=utf8','root','',
	array(PDO::ATTR_EMULATE_PREPARES => false));
} catch (PDOException $e) {
 exit('データベース接続失敗。'.$e->getMessage());
}
$stmt = $pdo->query("SELECT * FROM html where id = 2");
while($row = $stmt -> fetch(PDO::FETCH_ASSOC)){
	$img = $row["html"];
	echo $img;
}

おいおいおい!!!!
それでは、ひっぱてきたhtmlタグをmb_send_mailで送信したいと思います。

<?php

try {
$pdo = new PDO('mysql:host=localhost;dbname=send_mail;charset=utf8','root','',
	array(PDO::ATTR_EMULATE_PREPARES => false));
} catch (PDOException $e) {
 exit('データベース接続失敗。'.$e->getMessage());
}
$stmt = $pdo->query("SELECT * FROM html where id = 2");
while($row = $stmt -> fetch(PDO::FETCH_ASSOC)){
	$img = $row["html"];
}

mb_language('Japanese');
mb_internal_encoding("UTF-8");
$header_info="From: admin@example.com"."\nContent-Type: text/html;charset=ISO-2022-JP\nX-Mailer: PHP/".phpversion();

$insert = "差し込み文章";

$body = <<< EOM
<!DOCTYPE>
<html lang="ja">
<head>
</head>
<body>
Look!<br>
<strong style="color:red;">apple</strong><br>
{$img}<br>
{$insert}が入ります。
</body>
</html>
EOM;
print $body;
mb_send_mail("hogehoge@hoge.com",'test',$body,$header_info);
?>

おおおおおおお、簡単だが、おおよその仕組みはわかった。

次は実際に届いてるHTMLメールのソースコードを見てみよう。

ヒアドキュメントに差し込む

$insert = "差し込み文章";

$body = <<< EOM
<!DOCTYPE>
<html lang="ja">
<head>
</head>
<body>
Look!<br>
<strong style="color:red;">apple</strong><br>
<img src="http://hpscript.com/app/apple.jpg">
{$insert}が入ります。
</body>
</html>
EOM;

レンダリングがおかしなことになってる。

続いてmysqlですね。