Soumettre la recherche
Mettre en ligne
swooleを試してみた
•
0 j'aime
•
546 vues
Y
Yukihiro Katsumi
Suivre
ArcanaMeetup#50で使用した資料です
Lire moins
Lire la suite
Internet
Signaler
Partager
Signaler
Partager
1 sur 46
Télécharger maintenant
Télécharger pour lire hors ligne
Recommandé
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
leverages_event
WordPressと外部APIとの連携
WordPressと外部APIとの連携
Hidekazu Ishikawa
OSC京都2011
OSC京都2011
haganemetal
WordPress のキャッシュ機構
WordPress のキャッシュ機構
katanyan
test
test
a1yama1123
Yapc -asia 2012 lt @studio3104
Yapc -asia 2012 lt @studio3104
Satoshi Suzuki
Django boodoo
Django boodoo
泰 増田
Try Jetpack
Try Jetpack
Hideaki Miyake
Recommandé
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
leverages_event
WordPressと外部APIとの連携
WordPressと外部APIとの連携
Hidekazu Ishikawa
OSC京都2011
OSC京都2011
haganemetal
WordPress のキャッシュ機構
WordPress のキャッシュ機構
katanyan
test
test
a1yama1123
Yapc -asia 2012 lt @studio3104
Yapc -asia 2012 lt @studio3104
Satoshi Suzuki
Django boodoo
Django boodoo
泰 増田
Try Jetpack
Try Jetpack
Hideaki Miyake
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
Atsuo Yamasaki
もにかじ2 lt @studio3104
もにかじ2 lt @studio3104
Satoshi Suzuki
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
Koji Ishimoto
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
Yusuke Ando
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
Yatabe Terumasa
PHP Object Injection入門
PHP Object Injection入門
Yu Iwama
⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5
Nishida Kansuke
Backbone.js
Backbone.js
daisuke shimizu
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
Arata Fujimura
WordPress関数の処理コストを考えよう
WordPress関数の処理コストを考えよう
Naoki Matsuda
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
jamadam
CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発
Shinzo SAITO
はじめてのCouch db
はじめてのCouch db
Eiji Kuroda
MT meets PHP
MT meets PHP
純生 野田
第一回Miim勉強会
第一回Miim勉強会
Yuri Kawamoto
Chiba.pm #1 lt @studio3104
Chiba.pm #1 lt @studio3104
Satoshi Suzuki
jQuery超入門編
jQuery超入門編
Yasuhito Yabe
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
Nobuhiro Sue
後期03
後期03
Takenori Nakagawa
Cinnamon - simple deploy tool
Cinnamon - simple deploy tool
Yuki Shibazaki
Silex入門
Silex入門
Takuya Sato
Using Dancer
Using Dancer
Yoshihiro Sasaki
Contenu connexe
Tendances
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
Atsuo Yamasaki
もにかじ2 lt @studio3104
もにかじ2 lt @studio3104
Satoshi Suzuki
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
Koji Ishimoto
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
Yusuke Ando
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
Yatabe Terumasa
PHP Object Injection入門
PHP Object Injection入門
Yu Iwama
⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5
Nishida Kansuke
Backbone.js
Backbone.js
daisuke shimizu
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
Arata Fujimura
WordPress関数の処理コストを考えよう
WordPress関数の処理コストを考えよう
Naoki Matsuda
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
jamadam
CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発
Shinzo SAITO
はじめてのCouch db
はじめてのCouch db
Eiji Kuroda
MT meets PHP
MT meets PHP
純生 野田
第一回Miim勉強会
第一回Miim勉強会
Yuri Kawamoto
Chiba.pm #1 lt @studio3104
Chiba.pm #1 lt @studio3104
Satoshi Suzuki
jQuery超入門編
jQuery超入門編
Yasuhito Yabe
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
Nobuhiro Sue
後期03
後期03
Takenori Nakagawa
Tendances
(19)
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
もにかじ2 lt @studio3104
もにかじ2 lt @studio3104
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
PHP Object Injection入門
PHP Object Injection入門
⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5
Backbone.js
Backbone.js
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
WordPress関数の処理コストを考えよう
WordPress関数の処理コストを考えよう
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発
はじめてのCouch db
はじめてのCouch db
MT meets PHP
MT meets PHP
第一回Miim勉強会
第一回Miim勉強会
Chiba.pm #1 lt @studio3104
Chiba.pm #1 lt @studio3104
jQuery超入門編
jQuery超入門編
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
後期03
後期03
Similaire à swooleを試してみた
Cinnamon - simple deploy tool
Cinnamon - simple deploy tool
Yuki Shibazaki
Silex入門
Silex入門
Takuya Sato
Using Dancer
Using Dancer
Yoshihiro Sasaki
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか
Hiroshi Tokumaru
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
Akabane Hiroyuki
初心者向け SQLite の始め方
初心者向け SQLite の始め方
suno88
PerlとSQLのいろいろ
PerlとSQLのいろいろ
Takuya Tsuchida
FuelPHPをさわってみて
FuelPHPをさわってみて
Sotaro Omura
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
Hiroaki KOBAYASHI
Ci tutorial
Ci tutorial
Kazuaki Ueda
Infrastructure as code for azure
Infrastructure as code for azure
Keiji Kamebuchi
CMSとPerlで遊ぼう
CMSとPerlで遊ぼう
Daiki Ichinose
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門
Hisashi HATAKEYAMA
⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2
Nishida Kansuke
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
Naoyuki Yamada
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発
Kentaro Ohkouchi
CodeIgniter入門
CodeIgniter入門
Sho A
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
Aya Komuro
Itcamp長崎2012 capistrano
Itcamp長崎2012 capistrano
kumachang_LL
オンプレを少しずつコンテナ化する
オンプレを少しずつコンテナ化する
Kenkichi Okazaki
Similaire à swooleを試してみた
(20)
Cinnamon - simple deploy tool
Cinnamon - simple deploy tool
Silex入門
Silex入門
Using Dancer
Using Dancer
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
初心者向け SQLite の始め方
初心者向け SQLite の始め方
PerlとSQLのいろいろ
PerlとSQLのいろいろ
FuelPHPをさわってみて
FuelPHPをさわってみて
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
Ci tutorial
Ci tutorial
Infrastructure as code for azure
Infrastructure as code for azure
CMSとPerlで遊ぼう
CMSとPerlで遊ぼう
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門
⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発
CodeIgniter入門
CodeIgniter入門
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
Itcamp長崎2012 capistrano
Itcamp長崎2012 capistrano
オンプレを少しずつコンテナ化する
オンプレを少しずつコンテナ化する
Plus de Yukihiro Katsumi
New Relic の一部機能を触った話
New Relic の一部機能を触った話
Yukihiro Katsumi
エンタープライズアプリケーションアーキテクチャパターン
エンタープライズアプリケーションアーキテクチャパターン
Yukihiro Katsumi
Php artisan migrate
Php artisan migrate
Yukihiro Katsumi
今更ながらDBのカウントアップの話
今更ながらDBのカウントアップの話
Yukihiro Katsumi
arcadeがやりたい!
arcadeがやりたい!
Yukihiro Katsumi
Brainf**k
Brainf**k
Yukihiro Katsumi
Virtualbox+vagrant+docker
Virtualbox+vagrant+docker
Yukihiro Katsumi
hackday2017に参加しました。
hackday2017に参加しました。
Yukihiro Katsumi
まよいの墓(レゴ編)
まよいの墓(レゴ編)
Yukihiro Katsumi
ぱわぽ
ぱわぽ
Yukihiro Katsumi
アルカナに入社しました。
アルカナに入社しました。
Yukihiro Katsumi
Plus de Yukihiro Katsumi
(11)
New Relic の一部機能を触った話
New Relic の一部機能を触った話
エンタープライズアプリケーションアーキテクチャパターン
エンタープライズアプリケーションアーキテクチャパターン
Php artisan migrate
Php artisan migrate
今更ながらDBのカウントアップの話
今更ながらDBのカウントアップの話
arcadeがやりたい!
arcadeがやりたい!
Brainf**k
Brainf**k
Virtualbox+vagrant+docker
Virtualbox+vagrant+docker
hackday2017に参加しました。
hackday2017に参加しました。
まよいの墓(レゴ編)
まよいの墓(レゴ編)
ぱわぽ
ぱわぽ
アルカナに入社しました。
アルカナに入社しました。
swooleを試してみた
1.
バッチ処理を早くしたい swooleを試してみた 2019/05/24 Arcana Meetup #50 勝見 幸弘
2.
swooleとは • phpのエクステンション。 - composerでinstallするやつじゃなくてmakeとかするやつ •
PHPerKaigi2019でいくつか取り上げられてました。 • phpで非同期処理ができたりします。 • 試したい!
3.
swooleのサイト https://www.swoole.com/
4.
swooleの導入方法 • https://github.com/swoole/swoole-src git clone
https://github.com/swoole/swoole-src.git cd swoole-src phpize ./configure make && make install の後にextensionファイルをphp.iniに追加する • 導入自体は簡単。ただ、xdebugが入ってると警告が出たので xdebugは外す必要がありそうです。
5.
httpで試すのは大変そう なので、コマンドで試します
6.
試すコマンド
7.
こんな感じの テーブルレコードに CREATE TABLE `users`
( `id` int(11) NOT NULL AUTO_INCREMENT, `mail` varchar(255) NOT NULL, `pass` varchar(255) NOT NULL, `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`)
8.
こんな処理 private function passHash() { Log::info(‘passHash’.’_start’); while(true){ $datas
= DB::table('users')->where(DB::raw('length(pass)'), '<', 50)->limit(100)->get(); if ($datas->isEmpty()) { break; } foreach($datas as $data){ $datas = DB::table('users')->where('id', $data->id)->update(['pass' => Hash::make($data->pass)]); } } Log::info('passHash'.'_end'); }
9.
ざっくり説明 • とあるテーブルのとあるカラムのデータをphpでHash::makeっ てやった後のデータで更新する処理。
10.
private function passHash() { Log::info(‘passHash’.’_start’); while(true){ $datas
= DB::table('users')->where(DB::raw('length(pass)'), '<', 50)->limit(100)->get(); if ($datas->isEmpty()) { break; } foreach($datas as $data){ $datas = DB::table('users')->where('id', $data->id)->update(['pass' => Hash::make($data->pass)]); } } Log::info('passHash'.'_end'); } こんな処理 とあるテーブルのデータを取得
11.
private function passHash() { Log::info(‘passHash’.’_start’); while(true){ $datas
= DB::table('users')->where(DB::raw('length(pass)'), '<', 50)->limit(100)->get(); if ($datas->isEmpty()) { break; } foreach($datas as $data){ $datas = DB::table('users')->where('id', $data->id)->update(['pass' => Hash::make($data->pass)]); } } Log::info('passHash'.'_end'); } 44GT44KT44Gq5Yem55CG Hash::makeでデータ更新
12.
cHJpdmF0ZSBmdW5jdGlvbiBwYXNzSGFzaCgp ew== XExvZzo6aW5mbygncGFzc0hhc2gnLidfc3RhcnQnKTs= d2hpbGUodHJ1ZSl7 JGRhdGFzID0gXERCOjp0YWJsZSgndXNlcnMnKS0+d2hlcmUoXERCOjpyYXcoJ2xlbmd0aChwYXNzKScpLCAnPCcsIDUwKS0+bGltaXQoMTAwKS0+Z2V0K Ck7 aWYgKCRkYXRhcy0+aXNFbXB0eSgpKSB7 YnJlYWs7 fQ== Zm9yZWFjaCgkZGF0YXMgYXMgJGRhdGEpew== JGRhdGFzID0gXERCOjp0YWJsZSgndXNlcnMnKS0+d2hlcmUoJ2lkJywgJGRhdGEtPmlkKS0+dXBkYXRlKFsncGFzcycgPT4gXEhhc2g6Om1ha2UoJGRhd GEtPnBhc3MpXSk7 fQ== fQ== XExvZzo6aW5mbygncGFzc0hhc2gnLidfZW5kJyk7 fQ== 44GT44KT44Gq5Yem55C G
13.
このソースはフィクションです この処理のコマンドは件数によってかなり時間がかかりそうなの で、これがどれだけ早くなるか試してみました。
14.
前哨戦
15.
データ準備(通常) private function insertUser($count) { Log::info('insertUser'.'_start'); for($i
= 0;$i < $count;$i++){ for($j = 0;$j < $count;$j++){ $sql = "insert into users (mail, pass) VALUES ('$i mail@mail.com', '$i abcdefghij');"; DB::statement($sql); } } Log::info('insertUser'.'_end'); } • $count=100で1万件作成。 • ローカル環境で実施(mac + docker)。
16.
データ準備(通常) • 大体15秒程度。 mysql> SELECT
* FROM `users` ORDER BY `update_time` DESC LIMIT 1; +-------+------------------+---------------+---------------------+ | id | mail | pass | update_time | +-------+------------------+---------------+---------------------+ | 10000 | 99 mail@mail.com | 99 abcdefghij | 2019-05-19 11:17:57 | +-------+------------------+---------------+---------------------+ 1 row in set (0.01 sec) mysql> SELECT * FROM `users` ORDER BY `update_time` ASC LIMIT 1; +----+-----------------+--------------+---------------------+ | id | mail | pass | update_time | +----+-----------------+--------------+---------------------+ | 1 | 0 mail@mail.com | 0 abcdefghij | 2019-05-19 11:17:42 | +----+-----------------+--------------+---------------------+ 1 row in set (0.00 sec)
17.
データ準備(swoole)private function insertUserSwoole($count) { Log::info('insertUser'.'_start'); for($i
= 0;$i < $count;$i++){ go(function () use ($i, $count) { $mysql = $this->getMysql(); for($j = 0;$j < $count;$j++){ $statement = $mysql->prepare("insert into users (mail, pass) VALUES (‘$i $j mail@mail.com', ‘$i $j abcdefghij');"); $result = $statement->execute(); } }); } Log::info('insertUser'.'_end'); } • さっきのと同じ条件で実行。 • go()で囲まれているとこが非同期に実行される(んだと思う)。 private function getMysql() { $mysql = new SwooleCoroutineMySQL(); $mysql->connect([ 'host' => env('DB_HOST'), 'port' => 3306, 'user' => env('DB_USERNAME'), 'password' => env('DB_PASSWORD'), 'database' => env('DB_DATABASE'), 'timeout' => 4, // 設定しといた方がよい ]); return $mysql; }
18.
• 大体4秒程度。 mysql> SELECT
* FROM `users` ORDER BY `update_time` DESC LIMIT 1; +------+---------------------+------------------+---------------------+ | id | mail | pass | update_time | +------+---------------------+------------------+---------------------+ | 9329 | 44 94 mail@mail.com | 44 94 abcdefghij | 2019-05-19 11:29:37 | +------+---------------------+------------------+---------------------+ 1 row in set (0.01 sec) mysql> SELECT * FROM `users` ORDER BY `update_time` ASC LIMIT 1; +----+-------------------+----------------+---------------------+ | id | mail | pass | update_time | +----+-------------------+----------------+---------------------+ | 1 | 3 0 mail@mail.com | 3 0 abcdefghij | 2019-05-19 11:29:33 | +----+-------------------+----------------+---------------------+ 1 row in set (0.01 sec) データ準備(swoole)
19.
15秒→4秒
20.
おお すごい
21.
では本番
22.
ハッシュ(通常) private function passHash() { Log::info('passHash'.'_start'); while(true){ $datas
= DB::table('users')->where(DB::raw('length(pass)'), '<', 50)->limit(100)->get(); if ($datas->isEmpty()) { break; } foreach($datas as $data){ $datas = DB::table('users')->where('id', $data->id)->update(['pass' => Hash::make($data->pass)]); } } Log::info('passHash'.'_end'); } • さっき作成した1万件で実行。
23.
• 大体9分17秒程度。 mysql> SELECT
* FROM `users` ORDER BY `update_time` DESC LIMIT 1; +-------+--------------------+--------------------------------------------------------------+---------------------+ | id | mail | pass | update_time | +-------+--------------------+--------------------------------------------------------------+---------------------+ | 10000 | 0 99 mail@mail.com | $2y$10$oFmEp9d6qtK5WrvUtQ4PRevs8BtFK5CcLEF04qD4Vl0TdQaAY2yMa | 2019-05-19 12:14:41 | +-------+--------------------+--------------------------------------------------------------+---------------------+ 1 row in set (0.01 sec) mysql> SELECT * FROM `users` ORDER BY `update_time` ASC LIMIT 1; +----+--------------------+--------------------------------------------------------------+---------------------+ | id | mail | pass | update_time | +----+--------------------+--------------------------------------------------------------+---------------------+ | 1 | 68 0 mail@mail.com | $2y$10$JdBPfgEMn2kAJm2sotn9NObS7hHzuoZwfamx0VrrtQHuhBlxMu5rm | 2019-05-19 12:05:24 | +----+--------------------+--------------------------------------------------------------+---------------------+ 1 row in set (0.01 sec) ハッシュ(通常)
24.
ハッシュ(swoole) private function passHashSwoole($count) { Log::info('passHashSwoole'.'_start'); $coefficient
= 2; $parent = $count / $coefficient; $child = $count * $coefficient; for($i = 0;$i < $parent;$i++){ $sql = DB::table('users')->limit($child); if ($i > 0) { $sql->offset($i * $child); } $datas = $sql->get(); go(function () use ($datas) { $mysql = $this->getMysql(); foreach($datas as $data){ $pass = Hash::make($data->pass); $id = $data->id; $data = $mysql->query("update users set pass = '$pass' where id = $id;"); } }); Log::info('passHashSwoole_child'.'_end'); } Log::info('passHashSwoole'.'_end'); } • 色々あって何とか辿りついたソース。
25.
ハッシュ(swoole) mysql> SELECT *
FROM `users` ORDER BY `update_time` DESC LIMIT 1; +------+---------------------+--------------------------------------------------------------+---------------------+ | id | mail | pass | update_time | +------+---------------------+--------------------------------------------------------------+---------------------+ | 8794 | 64 97 mail@mail.com | $2y$10$dJEFSl9CikhSv.E4ICumMO3uOCqbVvK2E0uTzZWON8tPAejrIm5wq | 2019-05-19 14:54:31 | +------+---------------------+--------------------------------------------------------------+---------------------+ 1 row in set (0.01 sec) mysql> SELECT * FROM `users` ORDER BY `update_time` ASC LIMIT 1; +----+-------------------+--------------------------------------------------------------+---------------------+ | id | mail | pass | update_time | +----+-------------------+--------------------------------------------------------------+---------------------+ | 1 | 5 0 mail@mail.com | $2y$10$PFUJN/mKBE3uVNtX/GpE6Oaz5I.VjEFkRxWvh2wiFStQySkdSQJcy | 2019-05-19 14:45:58 | +----+-------------------+--------------------------------------------------------------+---------------------+ 1 row in set (0.01 sec)
26.
( ゚д゚) ・・・ (つд⊂)ゴシゴシ
27.
• 大体8分33秒程度。 mysql> SELECT
* FROM `users` ORDER BY `update_time` DESC LIMIT 1; +------+---------------------+--------------------------------------------------------------+---------------------+ | id | mail | pass | update_time | +------+---------------------+--------------------------------------------------------------+---------------------+ | 8794 | 64 97 mail@mail.com | $2y$10$dJEFSl9CikhSv.E4ICumMO3uOCqbVvK2E0uTzZWON8tPAejrIm5wq | 2019-05-19 14:54:31 | +------+---------------------+--------------------------------------------------------------+---------------------+ 1 row in set (0.01 sec) mysql> SELECT * FROM `users` ORDER BY `update_time` ASC LIMIT 1; +----+-------------------+--------------------------------------------------------------+---------------------+ | id | mail | pass | update_time | +----+-------------------+--------------------------------------------------------------+---------------------+ | 1 | 5 0 mail@mail.com | $2y$10$PFUJN/mKBE3uVNtX/GpE6Oaz5I.VjEFkRxWvh2wiFStQySkdSQJcy | 2019-05-19 14:45:58 | +----+-------------------+--------------------------------------------------------------+---------------------+ 1 row in set (0.01 sec) ハッシュ(swoole)
28.
(;゚д゚) ・・・ (つд⊂)ゴシゴシゴシ
29.
9分17秒→8分33秒
30.
(゚´Д`゚)゚・:*:・゜’★
31.
全然早くない
32.
この動く処理にたどり着く までに既に結構大変だっ たのに。。。
33.
GCPの良いインスタンス で試したりとかもほぼ無駄 だった。
34.
いろいろ調べた結果
35.
• Cpuを使い切れてない様子。 • ローカルでも2つCpuが使えれば、せめて倍くらいの速度は出 せるはず。 top
- 21:41:33 up 9:04, 0 users, load average: 0.79, 0.40, 0.22 Tasks: 15 total, 2 running, 13 sleeping, 0 stopped, 0 zombie Cpu0 : 1.0%us, 2.3%sy, 0.0%ni, 96.3%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st Cpu1 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 実行サーバ
36.
Swoole Process Manager
37.
プロセスを自分で管理で きるやつです。 詳しく知らないので説明 はできません。 これを試してみました。
38.
ハッシュ(複数プロセス)private function passHashSwooleProcess() { Log::info('passHashSwooleProcess'.'_start'); $workers
= []; $worker_num = 2; $data_count = DB::table('users')->where(DB::raw('length(pass)'), '<', 50)->count(); for($i = 0; $i < $worker_num; $i++){ $sql = DB::table('users')->where(DB::raw('length(pass)'), '<', 50)->limit($data_count / 2); if ($i > 0) { $sql->offset($i * $data_count / 2); } $userss = $sql->get(); $process = new SwooleProcess(function($process) use ($userss){ go(function () use ($process, $userss) { $mysql = $this->getMysql(); foreach($userss as $users){ $pass = Hash::make($users->pass); $id = $users->id; $data = $mysql->query("update users set pass = '$pass' where id = $id;"); } Log::info('passHashSwooleProcess_child'.'_end'); $process->exit(0); }); }); $pid = $process->start(); $workers[$pid] = $process; } Log::info('passHashSwooleProcess'.'_end'); }
39.
private function passHashSwooleProcess() { Log::info('passHashSwooleProcess'.'_start'); $workers
= []; $worker_num = 2; $data_count = DB::table('users')->where(DB::raw('length(pass)'), '<', 50)->count(); for($i = 0; $i < $worker_num; $i++){ $sql = DB::table('users')->where(DB::raw('length(pass)'), '<', 50)->limit($data_count / 2); if ($i > 0) { $sql->offset($i * $data_count / 2); } $userss = $sql->get(); $process = new SwooleProcess(function($process) use ($userss){ go(function () use ($process, $userss) { $mysql = $this->getMysql(); foreach($userss as $users){ $pass = Hash::make($users->pass); $id = $users->id; $data = $mysql->query("update users set pass = '$pass' where id = $id;"); } Log::info('passHashSwooleProcess_child'.'_end'); $process->exit(0); }); }); $pid = $process->start(); $workers[$pid] = $process; } Log::info('passHashSwooleProcess'.'_end'); } ハッシュ(複数プロセス) プロセスを作って
40.
ハッシュ(複数プロセス)private function passHashSwooleProcess() { Log::info('passHashSwooleProcess'.'_start'); $workers
= []; $worker_num = 2; $data_count = DB::table('users')->where(DB::raw('length(pass)'), '<', 50)->count(); for($i = 0; $i < $worker_num; $i++){ $sql = DB::table('users')->where(DB::raw('length(pass)'), '<', 50)->limit($data_count / 2); if ($i > 0) { $sql->offset($i * $data_count / 2); } $userss = $sql->get(); $process = new SwooleProcess(function($process) use ($userss){ go(function () use ($process, $userss) { $mysql = $this->getMysql(); foreach($userss as $users){ $pass = Hash::make($users->pass); $id = $users->id; $data = $mysql->query("update users set pass = '$pass' where id = $id;"); } Log::info('passHashSwooleProcess_child'.'_end'); $process->exit(0); }); }); $pid = $process->start(); $workers[$pid] = $process; } Log::info('passHashSwooleProcess'.'_end'); } プロセス動かす。
41.
private function passHashSwooleProcess() { Log::info('passHashSwooleProcess'.'_start'); $workers
= []; $worker_num = 2; $data_count = DB::table('users')->where(DB::raw('length(pass)'), '<', 50)->count(); for($i = 0; $i < $worker_num; $i++){ $sql = DB::table('users')->where(DB::raw('length(pass)'), '<', 50)->limit($data_count / 2); if ($i > 0) { $sql->offset($i * $data_count / 2); } $userss = $sql->get(); $process = new SwooleProcess(function($process) use ($userss){ go(function () use ($process, $userss) { $mysql = $this->getMysql(); foreach($userss as $users){ $pass = Hash::make($users->pass); $id = $users->id; $data = $mysql->query("update users set pass = '$pass' where id = $id;"); } Log::info('passHashSwooleProcess_child'.'_end'); $process->exit(0); }); }); $pid = $process->start(); $workers[$pid] = $process; } Log::info('passHashSwooleProcess'.'_end'); } ハッシュ(複数プロセス) 終わったら殺す。
42.
実行サーバでTOP
43.
いけてそう!!!! top - 21:34:34
up 1 day, 14:42, 0 users, load average: 0.54, 0.51, 0.58 Tasks: 5 total, 3 running, 2 sleeping, 0 stopped, 0 zombie Cpu0 : 94.0%us, 3.0%sy, 0.0%ni, 2.3%id, 0.0%wa, 0.0%hi, 0.7%si, 0.0%st Cpu1 : 93.0%us, 4.3%sy, 0.0%ni, 0.0%id, 2.0%wa, 0.0%hi, 0.7%si, 0.0%st 実行サーバでTOP
44.
計測
45.
• 大体4分39秒程度。 mysql> SELECT
* FROM `users` ORDER BY `update_time` DESC LIMIT 1; +-------+---------------------+--------------------------------------------------------------+---------------------+ | id | mail | pass | update_time | +-------+---------------------+--------------------------------------------------------------+---------------------+ | 10000 | 91 99 mail@mail.com | $2y$10$60bx7lqjuNUys/tHUC3pOOkooM6AyN2/KabeP3flsmGWXfAn7HoRG | 2019-05-19 15:23:22 | +-------+---------------------+--------------------------------------------------------------+---------------------+ 1 row in set (0.01 sec) mysql> SELECT * FROM `users` ORDER BY `update_time` ASC LIMIT 1; +----+-------------------+--------------------------------------------------------------+---------------------+ | id | mail | pass | update_time | +----+-------------------+--------------------------------------------------------------+---------------------+ | 1 | 0 0 mail@mail.com | $2y$10$h6ziNoQHFSTsMbe8qOKJ8O/FDfM80vmy21/9nt7Q6H76aV9lcC1VW | 2019-05-19 15:18:43 | +----+-------------------+--------------------------------------------------------------+---------------------+ 1 row in set (0.01 sec) ハッシュ(swoole)
46.
• 非同期とかプロセスとか結構大変だった。 - 気軽には勧められないかも。 •
フレームワークを使えばhttpでも比較的簡単に使える。 - らしい。試してない。来世で試します。 • 今回試した奴は、コマンド2回叩けば同じことできるんじゃない かと思う。処理工夫してサーバ複数でやる方が、非同期とかプ ロセスとかより簡単。 swooleの感想
Télécharger maintenant