- 投稿日:2020-01-03T23:18:51+09:00
PHP7.4の性能比較 一億回のループとDB500万件からの検索
PHP7.4の性能比較を行ってみました。
現在契約しているレンタルサーバーのグレードをアップしようかなと思い、
ついでと言っては何ですが、どの程度性能が上がるかを確認するために、
PHPそれぞれのバージョンで性能を比較してみました。比較対象としたバージョンは以下の通りです。
■5.6.40
■7.0.33
■7.1.31
■7.2.21
■7.3.9
■7.4.1処理としてはPHPでは1億回の単純な足し算をfor文でぶん回す事と
DBはMarriaDBですが、インデックスが貼られていないテーブルから500万行より
適当な文字列の検索を行ってみました。実行結果としてはこのような感じになりました。
バージョン php処理時間 MySQL処理時間 5.6.40 10.96秒 3.21秒 7.0.33 04.90秒 3.06秒 7.1.31 04.56秒 3.06秒 7.2.21 03.17秒 2.72秒 7.3.9 02.50秒 3.15秒 7.4.1 02.10秒 3.11秒 この結果より導き出される事は以下三点です。
DBの処理はPHPのバージョンに依存しない
処理時間の差については誤差の範囲です。
5.X系はすぐにでも7.x系にかえましょう
雲泥の差です。
7.x系は大差なしです。
確かにバージョンが上がるたびに処理速度が上がっています。
しかし、この処理はこのような計算です。
$j=0;
for ( $i = 0; $i < 100000000; $i++ ) {
$j=$j+$i;
}
何かコードを描く際に1億回ものループ処理を行うことって通常は無いですよね?
あっても100回~1000回程度だと思います。
コンマ何秒の世界を生きているわけではないのであれば無理してバージョンアップをする必要はないですね。
- 投稿日:2020-01-03T18:11:16+09:00
railsのDBで型をintegerからfloatへ変更しnumber_fieldで小数点を扱えるようにする
前回の記事の続きで初めてfloat型を扱ったのでメモ
やりたい事
- DBに間違ってinteger型で作ったカラムをfloat型に変更
- form_for内でnumber_fieldで小数点を扱えるようにする
- DBに保存した値を合計するメソッドを作る
参考
【Rails】form_for の number_field で小数を入力できるようにする
https://qiita.com/tegnike/items/07f789eb22c7a7bf6a19マイグレーションを使ったカラムの追加、削除、データ型の変更 [ 自分用メモ ]
https://qiita.com/dawn_628/items/13fa64dc6d600e921ce3【Rails】カラムの合計値を求める!
https://qiita.com/tomokichi_ruby/items/8758a91566957cfc5429number_fieldでは整数のみしか扱えない
new.html.erb<%= form_for @count_time do |f| %> <%= f.number_field :count_hour, class:'input_form' %> <%= f.submit '登録', class:'input_submit' %> <% end %>というフォームがあって,
new.html.erb<%= form_for @count_time do |f| %> <%= f.number_field :count_hour, step: '0.1', class:'input_form' %> <%# step: '0.1'を追加 %> <%= f.submit '登録', class:'input_submit' %> <% end %>
step: '0.1'を追加すると小数点以下第一位までの数値を扱えるようになりますこのままだとDBには整数でしか保存されない
DBの
count_hourはinteger型なので整数のみしか保存してくれないのでカラムの型を変更するターミナル$ rails g migration change_data_count_hour_to_count_time Running via Spring preloader in process 94544 invoke active_record create db/migrate/20200103074431_change_data_count_hour_to_count_time.rbカラム名がcount_hourでテーブル名がcount_timeになります
20200103074431_change_data_count_hour_to_count_time.rbclass ChangeDataCountHourToCountTime < ActiveRecord::Migration[5.2] def change change_column :count_times, :count_hour, :float #追記。テーブル名は複数形で end end
rails db:migrateしますこれでfloat型に変更できたのでnumber_fieldから送られる小数点の値がDBへ保存できるようになりました
DBの値をビューへ描画
index.html.erb<table> <tr> <th>日付</th> <th>時間</th> </tr> <% @count_time.each do |count_time| %> <tr> <td><%= count_time.created_at.to_date %></td> <td><%= count_time.count_hour %>時間</td> </tr> <% end %> </table>sumメソッドを使い学習時間の合計を表示させる
count_time_controller.rbclass CountTimesController < ApplicationController def index @count_time = CountTime.where(user_id: current_user.id).order('updated_at DESC').limit(5) @count_hour = @count_time.sum(:count_hour) end endsumメソッドの引数にカラムを指定するで合計値を出します
完成
まとめ
ひとまずこれで自分が最初に想像していた主要機能が完成しました。開発にそんな時間がかからないアプリでしたが知らない事も学べたので良かったかなと。あとは思い付いた追加の機能を開発していこうと思います。
終わり
- 投稿日:2020-01-03T16:47:39+09:00
VagrantにMySQLをインストールし、ローカルから接続する
この記事について
テスト用のDBが欲しかったのですが、ローカル環境にDBを作成したくなかったので、Vagrantを立てて、そこにMySQLを落としてみました。そのやり方を記述します。また、ローカル側のMySQLWorkbenchからVagrant上のMySQLに接続する際にエラーが出たのですが、グーグルで調べても解決策の情報があまり載っていなかったため、苦労しました。そこも触れていきます。
環境
ローカル
Mac
Vagrant 2.2.6
Virtualbox 5.2仮想環境 (192.168.33.10)
CentOS 7.2手順
以下の流れで行なっていきます。
1. Vagrantを起動する(vagrant init)
2. Vagrantfileとprovision.shを編集する
3. Vagrant upする
4. MySQLに接続してみる
5. MySQLへの接続許可するように設定するTRY!
1. Vagrantを起動する(vagrant init)
まず、Mac上で仮想サーバーを立てるフォルダを作成し、
vagrant initのコマンドを実行します。
2. Vagrantfileとprovision.shを編集する
次に、Vagrantfileを編集します。ちなみにVagrantileとは、
仮想サーバーを立てる際に、どうやってサーバーを立てるかの指示が書かれているもので、例えば、どんなOSを仮想サーバーに入れるのか、フォルダの書込許可はどのユーザーに当てるのか、などが設定できます。今回は、Vagrantfileで3つの指示を指定します。
1. CentOSをOSに指定
2. MySQLをインストール
3. ローカル(ホスト)からアクセスできるIPアドレスを解放2については、サーバーを立てた後でCentOSのコマンドを叩いても可能ですが、サーバーを立てる際にインストールした方が手間が省けます。
1. CentOSをOSに指定
Vagrantfileをテキストエディタで開き、以下の箇所を変更します。
# Every Vagrant development environment requires a box. You can search for # boxes at https://vagrantcloud.com/search. config.vm.box = "base"After:
# Every Vagrant development environment requires a box. You can search for # boxes at https://vagrantcloud.com/search. config.vm.box = "bento/centos-7.2"見ての通り、
config.vm.boxではOSを指定することができるのがわかるかと思います。2. MySQLをインストール
次に、MySQLをインストールするため、先ほどのコードの下に、以下を追記します。
#Run provision.sh config.vm.provision :shell, :path => "provision.sh"
config.vm.provision :shellは.shファイルを実行するという指示を意味します。:path =>の後に.shファイルのパスを書きます。今回はprovision.shというファイルを指定します。次に、
provision.shを作成しましょう。ターミナルでvi provision.shを実行します。
作成された
provision.shで以下のようにMySQLをインストールし、デーモンを起動するようにします。# Install MySQL sudo yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm sudo yum -y install mysql-community-server # Start MySQL when vagrant is up sudo systemctl enable mysqld.service sudo systemctl start mysqld.service3. ローカル(ホスト)からアクセスできるIPアドレスを解放
最後に、ローカル(ホスト)から仮想サーバー(ゲスト)アクセスできるIPアドレスを解放するため、Vagrantfileの
config.vm.network "private_network"の箇所をコメントアウトします。# Create a private network, which allows host-only access to the machine # using a specific IP. config.vm.network "private_network", ip: "192.168.33.10"これにより、Vagrantを起動するだけで、
192.168.33.10にMySQLの入ったCentOSが作成されます。3. Vagrant upする
次に、Vagrantを起動するため、
vagrant upを実行します。
こんな感じで、仮想サーバーが作られていきます。4. MySQLに接続してみる
このままMySQLに接続するとどうなるのかを検証します。
まず、仮想サーバー(ゲスト)にSSHでアクセスし、MySQLに接続できるか確認します。仮想サーバー(ゲスト)にSSHでアクセスするため、以下のコマンドを叩きます。$vagrant ssh次に、MySQLに接続します。
provision.shで作成されたMySQLでは、デフォルトではパスワードのないrootユーザーが作成されているので、以下のコマンドで接続できます。$mysql -u root -pこれで、MySQLへの接続が確認できました。
今度は、ローカル(ホスト)からMySQLに接続ができるか確認するため、MySQLWorkbenchを開き、以下の情報を入力します。
Hostname: 192.168.33.10
Port: 3306
Username: root
Password: (blank)すると、以下のようなメッセージが出てきます。
Can't connect to MySQL server on '192.168.33.10' (60)同じことがMacのターミナルからtelnetで確認できます。
$telnet 192.168.33.10 3306どうやら、
192.168.33.10自体に繋がってなさそうです。
pingで接続確認します。
pingすら通っていませんね。。
Vagrantfileのあるフォルダ配下で、vagrant reloadを実行し、再度pingしてみます。
pingが通りました。自分の場合、config.vm.network "private_network"のコメントアウトをしたのが実はvagrant upの後だったのでこのエラーが出ていたようです。記事を書きながら動かしていたのでうっかりしていました。再度、ローカルからMySQLに接続できるか確認します。今回はTelnetのみ実行します。MySQLWorkbenchでも同じ結果が出ます。
これは、仮想サーバ(ゲスト)側のMySQLが、ローカル(ホスト)からのアクセスを拒んでいる時に出てくるメッセージです。次のステップでこれを解消します。
5. MySQLへの接続許可するように設定する
再度、仮想サーバー(ゲスト)にSSHでアクセスし、MySQLに
rootユーザーでアクセスします。次に、以下のクエリを実行すると仮想サーバー(ゲスト)のMySQLはどこからでもrootユーザーのアクセスを許可するようになります。GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;実行後
Ctrl+Cでmysql>を閉じ、systemctl restart mysqldでデーモンを再起動します。この時、VagrantのRootユーザのパスワードが聞かれます。パスワードはディフォルトでvagrantです。ローカル(ホスト)側に戻り、MySQLWorkbenchで接続確認します。
無事接続できました。
最後に
以上、VagrantにMySQLをインストールし、ローカルから接続する方法でした。自分はあまり環境構築に慣れていないため、苦労しました。。どうか参考になったと感じたら「いいね」してもらえると幸いです。
参考
Connect to a MySQL Server inside of a Vagrant Machine from the Host Machine
vagrant上のmariadbにローカルのマネージメントツールからアクセスするためにやったこと
- 投稿日:2020-01-03T13:31:13+09:00
MySQLでカラム名が変えられない
ドットインストールでPHP学習入門を取り組んでいる際...
index.phpにて// ユーザーをDBに登録してブラウザに user add!!! と出力したい $db->exec("insert into users (name, score) values ('tanaka', 99)"); echo "user add!!!";よっしゃ、これでOKなはずと思ったがブラウザで以下エラーが表示される
エラーSQLSTATE[42S22]: Column not found: 1054 Unknown column 'score' in 'field list'原因
ターミナルでusersテーブルを見ると、scoreで作ったはずがscireと作っていました。
mysql> desc users; +-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | | NULL | | | scire | int(11) | YES | | NULL | | +-------+--------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)ささっとググり、ターミナルでカラム名を変更るためにコマンドを叩く
alter table users change column scire score; 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 '' at line 1あれなんでエラーが出るんだろう.....
対策
カラム名を変更するときは型も指定しなければいけない
先ほどのコマンドの最後にintを追加して再度実行すると、無事DBにデータも登録出来てブラウザにも期待通りの出力が出来ましたmysql> alter table users change column scire score int; Query OK, 0 rows affected (0.12 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc users; +-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | | NULL | | | score | int(11) | YES | | NULL | | +-------+--------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)


















