20220111のPHPに関する記事は4件です。

Paiza出力は同じなのにエラーになる原因

Paiza提出前に確認すること 最近Paizaを始めた者です。 出力は同じなのにエラーになったので原因を探ったところ簡単なミスでした。 しかし同じミスで解決できてない方もいるかもなので共有しておきます。 実際の処理 //期待される出力 3 3 7 3 7 5 8 3 5 3 //出力処理 foreach($posts as $post){ echo $post.' '; } //実際の出力 3 3 7 3 7 5 8 3 5 3 こちらでエラーになりました。 結論から原因は最後の数値の後ろにもスペースが入っているというものでした。 Paizaさんも提出前にちゃんと 「期待する出力と出力結果が同じに見えるのに失敗になる場合、半角スペースや改行の数が異なっていると考えられます。 余分な半角スペースや改行がないかを今一度ご確認ください。」 と教えてくれていました。しっかり最後まで文章を読まなくては。。。 解決策 一応今回のケースの解決策も載せておきます。 //期待される出力 3 3 7 3 7 5 8 3 5 3 //出力処理 $str = implode( ' ', $inputs); echo $str; //実際の出力 3 3 7 3 7 5 8 3 5 3 implode()を使い値の間にだけスペースを入れることで解決しました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

テスト投稿

テスト  リンクを貼ってみた。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

さくらでcronの実行

さくらサーバーでcronの設定を行いました。 実行コマンドについて cd /home/アカウント/www/app/batch; これで、対象のディレクトリまで移動します 今回はphpで実行したいので、 /usr/local/bin/phpがプログラムのコマンドパスになります(参照1) 黒塗り.phpが実行するファイルになります 実行日時は上記の設定だと2分毎に実行されます 参考 https://usortblog.com/sakuracron/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel,MySQL】MySQLへのinsert速度について調べてみた

概要 本記事は、PHPフレームワークLaravel入門 第2版で学習している中の疑問・つまづきの備忘録です。 今回はLaravelからMySQLへのinsert速度について調べたことをまとめます。 なお、PHPフレームワークLaravel入門 第2版ではSQLiteを利用していますが、MySQLに読み替えて同じことを行なっています。 サンプルコード 以下はPHPフレームワークLaravel入門 第2版に記載されていた、シーディング処理です。 PeopleTableSeeder.php public function run() { $param = [ 'name' => 'taro', 'mail' => 'taro@yamada.jp', 'age' => '12', ]; DB::table('people')->insert($param); $param = [ 'name' => 'hanako', 'mail' => 'hanako@flower.jp', 'age' => '34', ]; DB::table('people')->insert($param); $param = [ 'name' => 'sachiko', 'mail' => 'sachiko@happy.jp', 'age' => '56', ]; DB::table('people')->insert($param); } PHPフレームワークLaravel入門 第2版 このコードではinsert()メソッドが同じように複数回呼ばれています。 冗長で効率が悪く見えたので見えたので次のコードも試してみたところ、同様に動作しました。 PeopleTableSeeder.php public function run() { $param1 = [ 'name' => 'taro', 'mail' => 'taro@yamada.jp', 'age' => '12', ]; $param2 = [ 'name' => 'hanako', 'mail' => 'hanako@flower.jp', 'age' => '34', ]; $param3 = [ 'name' => 'sachiko', 'mail' => 'sachiko@happy.jp', 'age' => '56', ]; //ここを変更 $insert_params = [$param1, $param2, $param3]; //insertの呼び出しが1回で済む DB::table('people')->insert($insert_params); } 結局どちらがいいのか コードのきれいさでは後者の方がよさそうですが、大量のレコードをinsertする場合はどちらの方が効率がいいのかを調査しました。 その結果、MySQLの場合は、一度に複数レコードをinsertする方が高速に処理できるようです。 また、このことをバルクインサートと言います。 バルクインサートとは、リレーショナルデータベース(RDB)のテーブルに行を追加する際、複数の行を一回のSQL文の実行で追加すること。 INSERT文に複数行のデータを列挙する バルクインサート(bulk insert)とは - IT用語辞典 e-Words 下のグラフは一度にinsertする件数と速度の関係を示しています。 It takes around 1,000 inserts per query to reach the maximum throughput in both cases, but 40 inserts per query are enough to achieve 90% of this throughput on localhost, which could be a good tradeoff here. It’s also important to note that after a peak, the performance actually decreases as you throw in more inserts per query. High-speed inserts with MySQL 従って、MySQLでは一度に1000レコード程度をinsertした場合に最速となります。特にlocalhostの場合は、一度に40レコード程度で最速の90%の速度が出るようです。 一方で1000レコード以上に増やしていくと、徐々に速度が落ちていきます。 MySQLのドキュメントにも以下のような記載があります。 同じクライアントから同時に多数の行を挿入する場合は、複数の VALUES リストで INSERT ステートメントを使用して、同時に複数の行を挿入します。 これは、個別の単一行の INSERT ステートメントを使用するより、大幅に (場合によっては数倍) 速くなります。 MySQL 8.0 リファレンスマニュアル(INSERTステートメントの最適化) 実際に試してみた まずは、10000レコードを1レコードごとにinsertしてみました。 PeopleTableSeeder.php public function run() { for ($i = 0; $i < 10000; $i++) { $param = [ 'name' => "name{$i}", 'mail' => "test{$i}@example.com", 'age' => '30', ]; DB::table('people')->insert($param); } } $ ./vendor/bin/sail artisan db:seed Seeding: Database\Seeders\PeopleTableSeeder Seeded: Database\Seeders\PeopleTableSeeder (67,399.28ms) Database seeding completed successfully. 結果は67秒程度。 次に、10000レコードを1000ずつ分割してinsertしました。 PeopleTableSeeder.php public function run() { $params = []; for ($i = 0; $i < 10000; $i++) { $param = [ 'name' => "name{$i}", 'mail' => "test{$i}@example.com", 'age' => '30', ]; $params[$i] = $param; if (count($params) >= 1000) { DB::table('people')->insert($params); $params = []; } } } $ ./vendor/bin/sail artisan db:seed Seeding: Database\Seeders\PeopleTableSeeder Seeded: Database\Seeders\PeopleTableSeeder (236.20ms) Database seeding completed successfully. 速い!! こちらは1秒以下で終了しました。 10000レコードでこの差なので、件数が増えるとさらに影響が大きくなりそうですね。 まとめ MySQLにおいてレコードをinsertする際は、1000レコード程度をバルクインサートするのが最も高速になります。 実際に試してみて、insert処理1つでこれほどの差が出て感動しました。 特に大規模なアプリになると、このようなDBとのやりとりの実装方法も重要になると実感できたので、今後に活かそうと思います。 参考文献 PHPフレームワークLaravel入門 第2版 バルクインサート(bulk insert)とは - IT用語辞典 e-Words High-speed inserts with MySQL MySQL 8.0 リファレンスマニュアル(INSERTステートメントの最適化)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む