質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
さくらのVPS

さくらのVPSは、さくらインターネット社が提供するVPS(仮想専用サーバー)です。高速なSSDの選択や複数台構成も可能。利用者に応じた柔軟なプランが用意されています。大規模システムにも対応可能なスケーラビリティを備えたホスティングサービスです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1669閲覧

さくらVPSで、スクレイピングをしてmysqlにINSERT SELECTなどを繰り返すプログラムが、一定量を超えると、エラーメッセージなく止まってしまう

gugupoo

総合スコア31

さくらのVPS

さくらのVPSは、さくらインターネット社が提供するVPS(仮想専用サーバー)です。高速なSSDの選択や複数台構成も可能。利用者に応じた柔軟なプランが用意されています。大規模システムにも対応可能なスケーラビリティを備えたホスティングサービスです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/07/21 02:07

さくらVPSで、PHPで自サイトスクレイピングをして、mysql,phpmyadminにデータをINSERTしたり、SELECTをしたり
という処理を繰り返しております。

処理そのもののエラーはなく、
処理をしようとするmysqlの数を増やすと、ある程度一定数を超えると最後までいかずに中断されてしまうというものです。
いつもはcronで実行しておりますが、停止してしまう挙動を見ようと
ブラウザでphpファイルを実行してみると
エラーのコメントなく、止まってしまっているというものです。

途中、部分的に Notice: や warning: などが表示される箇所はありますが、
最後はNoticeもwarningもなく、fatal errorもなく、ただ停止してしまっているかのように見えます。

phpファイルを実行して、dbを多くINSERTして、
次に最初からselectして、などを繰り返すものです。

これを数を増やして2000行 ~idが1~2000くらいまでは無事処理は1時間程で終わります。

これが2500くらい行くらいの場合はいつも止まります。

以前にもこれに近い形で phpファイルの実行が最後まで実行されない事があったため、
これはphp.iniファイルだったり、httpd.confでappacheの設定であったり

そのあたりをクリアすれば大丈夫だと思い、
思う箇所をネット上のサイトで調べたように変えてみましたが、
やはりいつもと同じような量に達すると停止してしまっているようです。

ですのでこの停止の原因が分かれば最後まで実行出来たり、
もし不可能でも諦める事ができたりするとは思っていますがどうすればよいでしょうか…。

phpiniで自分がした変更箇所としましては

memory_limit
post_max_size
upload_max_filesize
max_execution_time

など思う箇所は変えたのですが、
エラーメッセージがなく、問題はあく停止しているかのように見えるこの状態をなんとか打破したいのですが

もう一度自分も、
php.iniファイル
httpd.confファイル

などを今から確認を繰り返したいと思いますが、
いかがすればよろしいでしょうか・・・・

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/07/21 02:37

そもそもスクレイピングを許可してる先ですか?
gugupoo

2020/07/21 03:15

m.ts10806様 はい。
CHERRY

2020/07/21 03:20

特定のサイトに連続してアクセスしているので有れば、アクセス拒否されている可能性はないでしょうか?
gugupoo

2020/07/21 03:28

CHERRY様 可能性はあるかもしれません。 が… 取得先は私のサイトですので(借りているスペースは私のものではありませんが)そういった設定はしたつもりは無い状態ではあります。 私が設定をしていなくてもサーバー会社がそういう設定をする可能性はあるのかもしれません。 そういった事例はあまり知りませんが。 1年半ほど借りている先からの取得で(私のサイトですが) 取得量を増加したら今回の停止が起きている次第です。 今までと同じ量でしたらもちろん取得できます。 必ずしも相手側(私のスペース側)でなく、 phpmyadmin mysqlの設定の上限で私の設定ミスなどがあると思うのですが それが分からない状態です・・すみません・・
yuki84web

2020/07/21 03:37

CPU使用時間でプロセスがkillされてるとか…?VPSのシステムログに何かあるかもしれません
CHERRY

2020/07/21 03:44 編集

アクセスしているサイトがご自身が管理されているサイトで有ればあまり関係ないですね。 他の可能性としては、件数が増えると発生するということなので、メモリ等のリソース不足が発生していないでしょうか? リソース不足が出ているようであれば、OOM Killer でプロセスが止められているのかもしれません。その場合、/var/log/messages 等に Killed process 5789 のようなログが残っていると思います。(数字は、プロセスID です。)
gugupoo

2020/07/21 11:28

yuki84web様 有難うございます!皆様にもご回答頂けましたが、killの表示がログにあったため、 おそらくそれが原因と思いますので、 iniファイルの設定を見直す、という楽なものでなく(本当はそれで直っても嬉しいですが) プログラム全体を、いくつかに区切ったりして CPU使用時間やその近辺の不可を減らすなり、分割する案でいってみようと思います。 有難うございました! CHERRY様 /var/log/messagesを調べさせて頂いて、Killed process 12592、なるものを見つけました! その前後のログをしっかりとは読めなかったので見えないものの おおよそこれが原因で止まってしまっていると思います。 プログラムを処理を数回に分ける、ですとか、 重いと自覚する箇所もありますので、そのあたりの修正から入りたいと思います。 有難うございました!
guest

回答1

0

ベストアンサー

完全に勘ですが
CHERRYさんのコメント

リソース不足が出ているようであれば、OOM Killer でプロセスが止められているのかもしれません。その場合、/var/log/messages 等に Killed process 5789 のようなログが残っていると思います。(数字は、プロセスID です。)

か、Segmentation Faultで落ちているんじゃないかなという気がします。

根本的な解決方法としては、

  1. スクレイピングしたデータを直接DBに格納するのではなく、ファイル等に一時保存する
  2. スクレイピングしているPHPとは別のPHPで一時保存されたファイルを一定数処理してDBに保存するるPHPを書く
  3. 2をcron等で定期実行する(多重実行されないように工夫する必要はあり)

という感じになるかと思います。
(メッセージキューを使って処理すればより柔軟で堅牢な仕組みになります)

簡単にやるならインスタンスを強くすれば何とかなる気もします。

とりあえずの解決&判定法

強めのインスタンスを一時的に契約して、そこで実行させてみて処理できる上限が増える用であればリソースの問題であることが特定できるので、インスタンスを強くして回避するか仕組みで回避するかの選択が出来るかと思います。

上限が増えないのであれば、何らかの設定の問題である可能性が高いと思われるので、設定を詰める方向で調べるのが良いかと思います。

投稿2020/07/21 09:05

tanat

総合スコア18713

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gugupoo

2020/07/21 11:35

tanat様 Killed processがありましたので、おそらくそれかと思いますが、tanat様のSegmentation Faultというものも、それに対する理解は私はあまりないかもしれませんが… ただ自分でもfor文を用いて、file_get_contentsしたものを 文字列の置換をして、INSERTしたものをもう一度SELECTして、 それを置換してそれを別テーブルにいれて、それを・・・・・・ など、なんとなく経験の浅い自分でも、スクレイピングの問題でなく、 こういうのmysqlのINSERT、SELECTは負荷はかかりそうな予感は十分にありましたので、 プログラムをファイルで分ける方法は、 分ける箇所も何通りもあるかと自分でも思いますので 分かりやすくしっかりして、処理をして休ませて、処理をして休ませるプログラムにしてみようと思います。 そういうプログラムの元からの修正も思いつかないわけではなかったのですが、 少し設定を触ればうまくいくであろうと、腰が重いところもあったので、 これでようやく腰を上げる必要にかられた気持ちになりましたので 修正してみようと思います。 有難うございました!
tanat

2020/07/21 17:16

一度、DBへの保存部分をコメントアウトしてみて問題が発生しないかなどは試してみても良いかもしれませんね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問