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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

PHP

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

Q&A

0回答

1548閲覧

PHPにてヘッドレスchromeを使っていますが、メモリ消費が増え続けます

ycy

総合スコア19

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

PHP

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

0グッド

1クリップ

投稿2021/10/18 00:19

編集2021/10/18 06:13

phpにてヘッドレスchromeを使っています。
問題点は、バックグラウンドでchrome.exeが少しずつ溜まっていっており、4時間ほどでメモリ50Gほど使ってしまっています。
およそ4時間の実行で60個位chrome.exeが並んでいたと思います。
処理内で $browser->close();は行っています。

現在は4時間ごとに、「TASKKILL /F /IM chrome.exe」のbatファイルを走らせてとりあえず対策はしています。
バックグラウンドのchrome.exeを消すとメモリは回復します。

並列でPHPを走らせており、1時間に2000回程はヘッドレスchromeの呼出しを繰り返しており、4時間ごとにすべての並列処理を停止し、インターバルを20分程取りbatファイルの実行が不便である事。
メモリ消費量が多く、操作が出来なくなる事や画面表示がおかしくなったりします。

例えば、開いてから指定時間で開いたヘッドレスchromeを落とすなどが出来れば解決しそうにも思います。

なにか解決策などありませんでしょうか?


追加です。
環境は WIN-SERVER 2016 PHPは7.2 APACHE chromeは最新バージョンになります。

$browserFactory = new BrowserFactory(); $agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"; // headless chromeの開始 $browser = $browserFactory->createBrowser([ 'windowSize' => [1920, 1000], 'enableImages' => false, 'startupTimeout' => 360, 'keepAlive' => true, ] ); $page = $browser->createPage(); $page->setUserAgent($agent); if(!empty($url_ary)){    foreach($url_ary as $key=>$url){       $navigation = $page->navigate($url);       $navigation->waitForNavigation(@HeadlessChromium\Page::NETWORK_IDLE); $evaluation = $page->evaluate('document.documentElement.innerHTML'); $value = $evaluation->getReturnValue(); $source=str_replace(array("\r\n","\r","\n","\t"), '', $value);//改行削除 $source_ary[$key]=$source;  } } $browser->close();

$url_aryにURLの配列を入れてLOOPしています。

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

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

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

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

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

AbeTakashi

2021/10/18 02:24

メモリの消費が増え続ける症状の再現が可能な最低構成のソースコードを質問文に追記することは可能でしょうか? 現状ではヘッドレスchrome側の問題なのか、ソース側の問題なのかも含めて判断材料に乏しいため、的確な回答が出にくい状況にあると思います。 同時に、実行させている環境(OS、PHPのバージョンなど)、使用しているヘッドレスchromeの情報(導入方法やバージョン情報など)も合わせて提示していただくと、より的確な回答が出てくる可能性があります。
AbeTakashi

2021/10/18 07:29

ソースコードを見た限りだと最後にしか $browser->close(); がありませんので、foreachでぐるぐる回してる限り、メモリの使用量は増え続けるようにしか見えませんが、それは意図している挙動でしょうか? このソースコード見る限りでは、$url_aryにどれだけのURLが入っているか分かりませんので、かなりの数があるなら処理も終わらずにメモリもどんどん増えていくのはむしろ普通かな?と思います。$browser->close();をforeachのループ内に入れ込むことができるのであれば、入れ込んでしまったらいいのでは?とも思いました。$browser->close()でメモリを解放しているかどうか知らないので、確実ではないですけど。
ycy

2021/10/18 08:09

問題点は、$browser->close()でバックグラウンドのchrome.exeが終了していない場合があるためです。 foreachの中でのメモリ使用量増加は承知の上で、色々とテストを行いましたが、foreach内で$browser->close()を行うと、逆に毎回OPENすることになるため遅くなることなどから、ページ推移にて行っています。 url_aryには20URLです。 ちなみに、foreachの無い形で行っても、バックグラウンドに大量のchrome.exeが残ってしまいました。 現状は仕方なくtaskkillにて行っている次第です。
AbeTakashi

2021/10/18 09:14

ヘッドレスchromeって独立した子プロセス立ち上げて(Unixでいうところのfork)、そこで色々処理してるんですね。そしてその子プロセスのメモリが増えていてかつ終了せずに残っているという話ですかね? そうだとすると、立ち上げた子プロセスが正常終了せずにゾンビプロセスになっていると思われます。正常に一連の処理が終了したなら子プロセスはきっちり回収されてプロセスは残らないはずなので、ちゃんと処理が終了するようにforeachの中の一連の処理を見直した方が良さそうな気がします。$navigation->waitForNavigation のところとかなんとなく怪しい気がします(waitって入ってるし)が、例えばタイムアウトを設定するなどの方法などを試してみてはどうでしょう。ちゃんと使ったことないので具体的なアドバイスができなくて申し訳ないですが、子プロセスが終了までいかない理由を探すべきじゃないかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問