PHP arrayメソッド

  • array_change_key_case — 配列のすべてのキーの大文字小文字を変更する
  • array_chunk — 配列を分割する
  • array_column — 入力配列から単一のカラムの値を返す
  • array_combine — 一方の配列をキーとして、もう一方の配列を値として、ひとつの配列を生成する
  • array_count_values — 配列の値の数を数える
  • array_diff_assoc — 追加された添字の確認を含めて配列の差を計算する
  • array_diff_key — キーを基準にして配列の差を計算する
  • array_diff_uassoc — ユーザーが指定したコールバック関数を利用し、 追加された添字の確認を含めて配列の差を計算する
  • array_diff_ukey — キーを基準にし、コールバック関数を用いて配列の差を計算する
  • array_diff — 配列の差を計算する
  • array_fill_keys — キーを指定して、配列を値で埋める
  • array_fill — 配列を指定した値で埋める
  • array_filter — コールバック関数を使用して、配列の要素をフィルタリングする
  • array_flip — 配列のキーと値を反転する
  • array_intersect_assoc — 追加された添字の確認も含めて配列の共通項を確認する
  • array_intersect_key — キーを基準にして配列の共通項を計算する
  • array_intersect_uassoc — 追加された添字の確認も含め、コールバック関数を用いて 配列の共通項を確認する
  • array_intersect_ukey — キーを基準にし、コールバック関数を用いて 配列の共通項を計算する
  • array_intersect — 配列の共通項を計算する
  • array_key_exists — 指定したキーまたは添字が配列にあるかどうかを調べる
  • array_keys — 配列のキーすべて、あるいはその一部を返す
  • array_map — 指定した配列の要素にコールバック関数を適用する
  • array_merge_recursive — 二つ以上の配列を再帰的にマージする
  • array_merge — ひとつまたは複数の配列をマージする
  • array_multisort — 複数または多次元の配列をソートする
  • array_pad — 指定長、指定した値で配列を埋める
  • array_pop — 配列の末尾から要素を取り除く
  • array_product — 配列の値の積を計算する
  • array_push — 一つ以上の要素を配列の最後に追加する
  • array_rand — 配列から一つ以上の要素をランダムに取得する
  • array_reduce — コールバック関数を用いて配列を普通の値に変更することにより、配列を再帰的に減らす
  • array_replace_recursive — 渡された配列の要素を再帰的に置き換える
  • array_replace — 渡された配列の要素を置き換える
  • array_reverse — 要素を逆順にした配列を返す
  • array_search — 指定した値を配列で検索し、見つかった場合に対応する最初のキーを返す
  • array_shift — 配列の先頭から要素を一つ取り出す
  • array_slice — 配列の一部を展開する
  • array_splice — 配列の一部を削除し、他の要素で置換する
  • array_sum — 配列の中の値の合計を計算する
  • array_udiff_assoc — データの比較にコールバック関数を用い、 追加された添字の確認を含めて配列の差を計算する
  • array_udiff_uassoc — データと添字の比較にコールバック関数を用い、 追加された添字の確認を含めて配列の差を計算する
  • array_udiff — データの比較にコールバック関数を用い、配列の差を計算する
  • array_uintersect_assoc — データの比較にコールバック関数を用い、 追加された添字の確認も含めて配列の共通項を計算する
  • array_uintersect_uassoc — データと添字の比較に個別のコールバック関数を用い、 追加された添字の確認も含めて配列の共通項を計算する
  • array_uintersect — データの比較にコールバック関数を用い、配列の共通項を計算する
  • array_unique — 配列から重複した値を削除する
  • array_unshift — 一つ以上の要素を配列の最初に加える
  • array_values — 配列の全ての値を返す
  • array_walk_recursive — 配列の全ての要素に、ユーザー関数を再帰的に適用する
  • array_walk — 配列の全ての要素にユーザー定義の関数を適用する
  • array — 配列を生成する
  • arsort — 連想キーと要素との関係を維持しつつ配列を逆順にソートする
  • asort — 連想キーと要素との関係を維持しつつ配列をソートする
  • compact — 変数名とその値から配列を作成する
  • count — 変数に含まれるすべての要素、 あるいはオブジェクトに含まれる何かの数を数える
  • current — 配列内の現在の要素を返す
  • each — 配列から現在のキーと値のペアを返して、カーソルを進める
  • end — 配列の内部ポインタを最終要素にセットする
  • extract — 配列からシンボルテーブルに変数をインポートする
  • in_array — 配列に値があるかチェックする
  • key_exists — array_key_exists のエイリアス
  • key — 配列からキーを取り出す
  • krsort — 配列をキーで逆順にソートする
  • ksort — 配列をキーでソートする
  • list — 配列と同様の形式で、複数の変数への代入を行う
  • natcasesort — 大文字小文字を区別しない"自然順"アルゴリズムを用いて配列をソートする
  • natsort — "自然順"アルゴリズムで配列をソートする
  • next — 配列の内部ポインタを進める
  • pos — current のエイリアス
  • prev — 内部の配列ポインタをひとつ前に戻す
  • range — ある範囲の整数を有する配列を作成する
  • reset — 配列の内部ポインタを先頭の要素にセットする
  • rsort — 配列を逆順にソートする
  • shuffle — 配列をシャッフルする
  • sizeof — count のエイリアス
  • sort — 配列をソートする
  • uasort — ユーザー定義の比較関数で配列をソートし、連想インデックスを保持する
  • uksort — ユーザー定義の比較関数を用いて、キーで配列をソートする
  • usort — ユーザー定義の比較関数を使用して、配列を値でソートする

 

 

Linuxで使えるコマンドまとめ

catコマンド

catコマンドはファイルの内容を表示したり、複数のファイルを連結するコマンド

cat [option] filename
オプション 意味
-n すべての行に行番号をつける
-s 連続した空行を圧縮する
-b 空行以外に行番号をつける

例えば、以下のような.txtファイル(テキストファイルがあったとき)

sample.txt
hello

world
linux
ubuntu
command

次のようにすると

cat sample.txt

sample.txtの内容がそのまま表示される

行数も表示したいなら

cat -n sample.txt

これで得られる結果が

     1  hello
     2  
     3  world
     4  linux
     5  ubuntu
     6  command

これ。

から行に行番号をつけたくないならbオプションを使って

cat -b sample.txt

これの結果は以下の通り

     1  hello

     2  world
     3  linux
     4  ubuntu
     5  command

複数のファイルを連結したいなら以下のように書ける

cat filename1 filename2

上で使ったsample.txtと新たに以下の内容のtest.txtを連結し新たにIT.txtというファイルを作りたいとき

test.txt

このようにする

cat sample.txt test.txt > IT.txt

 標準入出力のリダイレクション

タイトルだけ見たらなんじゃこりゃ!!ってなりそうだけど、実は結構簡単

そもそも標準入出力とは標準入力がキーボードから入力されることで、標準出力が画面に表示すること

 <

この記号は標準入力をキーボードからファイルに切り替えるもの

もっと簡単に言うなら、「キーボードから入力された情報じゃなくて、ファイルの内容を使うよ」というもの

例えば以下のようなtxtファイルがあったとき

number.txt
 1+2+3+4

電卓みたいに計算してくれる「bc」コマンドを以下のように使うと

bc < number.txt

結果が「10」と表示される
ちなみに標準入出力のリダイレクションを使わないで書く以下のようにbcコマンドを一度呼び出して計算式を入力することと同じ

bc[enterを押す]
1+2+3+4

ただキーボードから入力された情報を使うか
ファイルの内容を使用するかの違い

 >

こっちは標準出力のリダイレクションですごく簡単

ざっくり言えば「結果を表示しないで、別のファイルの内容にするよ」というもの

ちなみに>>にするとファイルの最後に表示結果を連結するので
さっきやったsample.txtとtest.txtの連結は以下のようにも出来る

cat test.txt >> sample.txt

この方法だとIT.txtというファイルを作らなくてもファイルを連結できる

 <,>

リダイレクションを両方使い、標準入出力を一行で切り替えることもできる

それは以下のような形式をとる

command < input_datafile > output_file

これを踏まえてbcコマンド数式が入っているnumber.txt、その結果をresult.txtとして出力する方法は以下のようになる

bc < number.txt > result.txt

実はこんな便利なこともできる

 ls

lsコマンドは現在いる場所にあるファイルやディレクトリを表示してくれるもの

オプション 意味
-l 名前以外の詳しいデータも表示する
-a ファイル名の先頭が.のものも表示する
-t 最終更新が新しい順に表示します
-R サブディレクトリの下のすべてのファイルを表示する

これらを使った例を示すと

これでファイル名とディレクトリ名を表示できた
bash
ls

これで設定ファイルも表示できる

ls -a

実はコマンドを組み合わせることもできて-aと-Rを組み合わせてすべてのファイルを表示するのは以下のようにする

ls -aR

このように複数のオプションを組み合せることもできる

 cp

cpコマンドはファイルをコピーするコマンド
以下のような形式をとる

cp [オプション] [コピーしたいファイル] [コピー先]
オプション 意味
-i コピー先のファイルがすでに存在する場合上書きするか確認する
-R 再帰的(全部)にディレクトリの下のファイルをコピーする

これでcatの時使ったsample.txtsample2.txtとしてコピーする

cp sample.txt sample2.txt

たったこれだけ

 mv

mvはファイルをコピーではなく移動させるコマンド
以下の形式を取る
ちなみに名前の変更もできる

mv [オプション] [移動させたいファイル] [移動先]

オプションはcpで紹介した-iが有効、それ以外にも存在するが省略

さっき使ったtest.txtをホームディレクトリ直下のディレクトリに移動させるなら

mv test.txt ~/移動先ディレクトリ名

となる

ちなみにtest.txtの名前をtest2.txtにするなら以下のようになる

mv test.txt test2.txt

 rm

rmコマンドはファイルやディレクトリを削除するコマンド

オプション 意味
-r ディレクトリをまるごと削除するときに指定

test.txtファイルを削除したいなら

rm test.txt

となり、ディレクトリを削除したいときは

rm -r ディレクトリ名

となる

 rmdir

このコマンドはほとんどrmコマンドと大差無いがrmdirを使う場合消したいディレクトリが空である必要がある

 mkdir

これはディレクトリを作成するコマンド

例えばsampleというディレクトリを作るなら

mkdir sample

となる。またスペースで区切ることで複数のファイルを作成できる

mkdir sample sample2 sample3 ... sample10

みたいに

 cd

このコマンドはカレントディレクトリを移動するときに使う

例えばカレントディレクトリの直下にあるsampleというディレクトリに移動したい場合は

cd sample

となる

このコマンドにはもっと色々操作方法があってこれはぜひ覚えたい

操作 意味
cd ホームディレクトリに移動
cd 移動したいディレクト 移動したいディレクトリに移動
cd .. 一つディレクトリを戻る

 ps

プロセス状態を表示するコマンド

使用メモリ率やプロセスID、CPU利用率が表示される

 kill

指定したプロセスIDのプロセスを終了させるコマンド

kill [終了させたいPID]

 grep

このコマンドについては長くなるので、ここを参照

 sort

ソートコマンドは、そのままの意味で入力ファイルの並び替えを行う

オプション 意味
-r 逆順に並べる
-n 数値を昇順にして並べる
-f 大文字小文字区別なく並べる
-k フィールドの場所(何列目か)を指定する

例えば以下の内容のテストの点数と名前が含まれているstudent.txtが存在した時に

student.txt
80 John
19 Alex
65 Max

点数順にソートするなら

sort -n '^[0-9][0-9]' student.txt

出力は以下のようになる

19 Alex
65 Max
80 John

-rオプションを使うと

sort -nr student.txt

以下のようになる

80 John
65 Max
19 Alex

また二列目にある名前順に並べたいなら以下のようになる

sort -fk 2 student.txt

結果は以下のようになる

19 Alex
80 John
65 Max

 head

このコマンドはファイルの上から10行を表示する機能をもつ
また-nオプションをつけてスペース区切りで数値を入れることでその数の分だけ行を表示する

head sample.txt -n 3

これで上から3行目まで表示できる

つまりこう画面にでる

hello

world

 tail

このコマンドはheadと真逆のことをする。つまりファイルの最後の行から10行表示する。
これも-nオプションとスペース区切りで数値を渡すことで任意の行数だけ最後の行から表示できる

tail sample.txt -n 2

これで最後から2行目までを表示する

つまりこう画面にでる

ubuntu
command

 パイプ

パイプとは|←これのことでl(エル)ではなく¥のキーをshiftキーと共に押したときに出るヤツ

これはすごく便利でパイプの前にあるコマンドの標準出力をパイプの後にくるコマンドの標準入力として渡せる
こんなクソみたいな説明じゃわかりにくいので実例を踏まえて

cat -n sample.txt | head -n 3

これやると以下のような表示がでる

     1  hello
     2  
     3  world

こうなるに至った過程をざっくり説明してみる

以下(´・ω・`)をcatコマンド、(・。・をパイプ、(*´∀`)をheadコマンドとする

(´・ω・`)「sample.txtに行数つけて表示するぜぇ!!」

(・。・「ちょっとheadに横流しするわ」

(*´∀`)「それを上から三行だけ表示っ!!」

みたいなかんじです

 これは大して覚えなくてもいいけど知ってたら便利

 pwd

これはカレントディレクトリの場所を最初っから表示してくれるやつ

 man

これはオンラインマニュアルを表示してくれるやつ
でも大抵、[コマンド名] --helpのほうが便利

 

webサーバー1とwebサーバー2からマスタDBサーバーに外部接続できるようにする

マスタDBの現在のMySQLユーザーはこうなってます。

mysql> SELECT user, host FROM mysql.user ORDER BY user, host;

+-----------+-----------+

| user      | host      |

+-----------+-----------+

| mysql.sys | localhost |

| root      | localhost |

+-----------+-----------+

2 rows in set (0.00 sec)

 

外部接続するmaster_dataというdatabaseを作成しておきます。

mysql> create database master_data;

 

・webサーバー1からアクセスできるMySQLユーザーを追加します。

master_dataというデータベース全体にselect、insert、update、deleteができる権限をweb1ユーザーに与えます。

mysql>  GRANT SELECT, INSERT, UPDATE, DELETE ON master_data.* TO 'web1'@'webサーバー1のIPアドレス' IDENTIFIED BY 'パスワード';

・ユーザー追加を反映する。

mysql> flush privileges;

 

・ユーザーが追加されたことを確認する

mysql> SELECT user, host FROM mysql.user ORDER BY user, host;

・権限が付与されているかも確認する

mysql> show grants for 'web1'@'webサーバー1のIPアドレス';

 

・マスタDBサーバーの3306ポートを開けます。

vi /etc/sysconfig/iptables

-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPTを追加。

他のサーバーの設定時と同様にiptablesをインストールし起動します。

 

・webサーバー1でmysqlコマンドを使用するためmysqlもインストールしておきます。

 

・webサーバー1からマスタDBサーバーのDBにアクセスできるか確認します。

mysql -u web1 --password="パスワード" -h マスタDBのIPアドレス master_data

これでマスタDBのMySQLに入れれば成功です。

 

webサーバー2も同じことを行います。

マスタDBサーバーの設定をする

次にマスタDBのサーバー設定をします。

これでもうサーバーの契約は4台目です。笑

 

 まずMySQLをインストールします。

MySQLリポジトリを追加

sudo rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm

MySQLのインストール

sudo yum -y install mysql-community-server

mysqlサーバーのバージョン確認

mysqld --version

mysqlクライアントのバージョン確認

mysql --version

 

/etc/my.cnfの設定ファイルに以下の内容を追加します。

character-set-server=utf8(デフォルトの文字コードをUTF8にする)

default_password_lifetime=0(パスワードの期限が360日なので、変更しなくてもいいようにする)

 

・次にMySQLを起動と自動起動の設定をします。

sudo systemctl start mysqld.service

sudo systemctl enable mysqld.service

sudo systemctl status mysqld.service

 

MySQLの初期パスワードを確認する。

sudo 

cat /var/log/mysqld.log | grep 'temporary password'を叩き、

[Note] A temporary password is generated for root@localhost: hogehoge

と表示される「hogehoge」部分が初期パスワードとなります。

・初期パスワードを変更する。

mysql_secure_installationを叩くと、対話形式でパスワード変更ができます。

rootユーザーのパスワードの変更、

ポリシーに沿ったrootユーザーパスワードの設定(記号、大文字、小文字、数字を含んだ文字列)

anonymousユーザーの削除(yを入力)

リモートホストからrootユーザーでログインするのを禁止する(yを入力)

testデータベースの削除(yを入力)

を順に入力していきます。

 

mysql -u root -pで先ほど変更したパスワードでログインできれば成功です。

 

 

ロードバランサにきたリクエストをwebサーバー1とwebサーバー2へ振り分けできるようにする

まず、webサーバー2の設定をします。

webサーバー1と同じく、Nginxとphp-fpmのインストールまでします。

webサーバー2のIPアドレスへアクセス時の画像は以下のように背景を黄色にします。

f:id:free_programmer:20170212195650p:plain

 

 

次にwebのロードバランサにきたリクエストをwebサーバー1とwebサーバー2に流せるように設定します。

ちなみにNginxのロードバランシングの方法は以下の3種類があります。

1、ラウンドロビン

アプリケーションへのリクエストはラウンドロビンの形式で分配されます。何も設定していない時のデフォルトはラウンドロビンになります。

2、Least Connected

接続数が少ないサーバーに振り分ける方法。

3、IPハッシュ

同じIPアドレスからのアクセスを同じサーバーに振り分ける方法。サーバーが利用不可の場合を除いて常に同じサーバーに渡されることを保証します。なお、接続先のサーバーが利用不可の場合は他のサーバーに渡させる動きをします。

 

今回はラウンドロビンの設定にします。

/etc/nginx/にあるnginx.confのhttpブロックの中に以下を追加します。

upstream ロードバランサのIPアドレス{

        server webサーバー1のIPアドレス;

        server webサーバー2のIPアドレス;

    }

 

    server {

       listen 80;

       location / {

          proxy_pass http://ロードバランサのIPアドレス;

       }

    }

 

Nginxを再起動します。

sudo systemctl restart nginx.service

 

これで、http://ロードバランサのIPアドレスにアクセスすると交互にwebサーバー1の赤い画面とwebサーバー2の黄色い画面が表示されれば疎通成功です。

ちなみにwebサーバー2のNginxをstopさせるとwebサーバー1のみ表示されるようになり、サーバーが利用不可の時も問題なく生きてるサーバーへ振り分けられます。

2台目のサーバー設定をする(webサーバー1)

2台目としてサーバー構成図のwebサーバー1の設定をします。

PHPアプリケーションを動かすwebサーバーで、

今回はapacheではなくNginx上でPHPが動くようにしたいと思います。

なので、Nginxのインストールまでは1台目と同じ手順です。

ちなみにwebサーバー1のユーザー名はweb1という名前で追加しました。

 

Nginxのインストールまで終われば、次にNginx上でPHPを動かすために必要なPHP-FPMをインストールします。

まず、yumリポジトリphp-fpmがあるか確認

sudo yum list | grep php-fpm

あればインストール

sudo yum -y install php-fpm

インストールできたか確認

php-fpm -v

PHP5.4が入ってました。

 

PHP-FPMの設定ファイルにはデフォルトがapacheの設定になっているのでuserとgroupの「apache」を「nginx」に書き換えます。

/etc/php-fpm.d/www.conf
- user = apache
+ user = nginx

- group = apache
+ group = nginx

 

 

次に、nginxの設定ファイル中の、ドキュメントルートの設定とPHPを実行できるように書き換えます。

※デフォルトの設定ファイルはコピーして残します。

sudo cp default.conf default.conf.org

/etc/nginx/conf.d/default.conf
  location / {
-     root   /usr/share/nginx/html;
+     root   /var/www;
-     index  index.html index.htm;
+     index  index.php;
  }

- #location ~ \.php$ {
- #    root           html;
- #    fastcgi_pass   127.0.0.1:9000;
- #    fastcgi_index  index.php;
- #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
- #    include        fastcgi_params;
- #}
+ location ~ \.php$ {
+     root           /var/www;
+     fastcgi_pass   127.0.0.1:9000;
+     fastcgi_index  index.php;
+     fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
+     include        fastcgi_params;
+ }

 

PHP-FPMの起動と自動起動の設定

sudo systemctl start php-fpm

sudo systemctl enable php-fpm

sudo systemctl status php-fpm

 

・Nginxも設定ファイルを修正したので再起動

sudo systemctl restart nginx.service

 

・設定したドキュメントルートにindex.phpを作る。

/var/www/index.php

<html>

<body bgcolor="#ff0000">

<h4>web1 access!!</h4>

</body>

</html>

 

ブラウザから「http://webサーバー1のIPアドレス」にアクセスして、

f:id:free_programmer:20170212195428p:plain

この画像が表示されれば、PHP-FPMの設定は成功です。

 

1台目のサーバー設定をする(webのロードバランサ)

ServersManのVPSシンプルプランで契約しました。

・とりあえずrootで入ります。(ssh接続できるポート番号がメールに記載されています)

ssh -p 3843 root@IPアドレス

・root以外の管理者ユーザーを作成してパスワードを設定

useradd -G wheel lb_web

passwd lb_web

・作成した管理者ユーザーでログインして、sudoコマンドが使えることを確認

ssh -p 3843 lb_web@IPアドレス

sudo su -

 

Nginxをインストールしていきます。

・Nginxのリポジトリのインストール

sudo yum -y install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

 

・Nginxのパッケージのインストール

sudo yum -y install --enablerepo=nginx nginx

 

・インストールされた確認

nginx -v

 

http://IPアドレス」にアクセスするとServersManのVPSシンプルプランの場合、Apacheがインストールされているので、今回はNginxを使いたいためApacheを停止させます。

sudo systemctl stop httpd

 

iptablesのインストール

sudo yum -y install iptables-services

・80番ポートの開放

/etc/sysconfig以下にあるiptablesのファイルに一行追記します。

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

COMMIT

iptablesの起動と自動起動の設定

sudo systemctl start iptables

sudo systemctl enable iptables

sudo systemctl status iptables

 

・Nginxの起動と自動起動の設定

sudo systemctl start nginx.service

sudo systemctl enable nginx.service

sudo systemctl status nginx.service

 

iptablesとNginxの自動起動設定が正常に設定されているか確認

sudo systemctl list-unit-files -t service | grep -e iptables -e nginx

 

http://IPアドレスにアクセスして、「Welcome to nginx!」が表示されていれば成功。