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

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

ただいまの
回答率

90.83%

  • PHP

    18702questions

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

  • Node.js

    1686questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • Puppet

    5questions

    Puppetは、Rubyで作られた UNIX系OSのシステム管理を自動で行うためのツールです。

Puppeteerをphpのexec関数で実行するとエラーが出る

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 114

takabooo

score 1

Node.jsのライブラリ「Puppeteer」のjsコードをphpから実行したいと思っています。

まず、前提として以下のようなwebページのタイトルを取得してコンソールに表示させる簡単なNode.jsコードを書きました。

sample.js

(async() => {
  const puppeteer = require('puppeteer');
  const browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox']});
  const page = await browser.newPage();
  await page.goto('https://google.co.jp/');
  console.log(await page.title());
  await browser.close();
})();

ソースは、centos7のサーバーに置いており、
コンソールから、「node sample.js」とするとページタイトルが表示され問題なく動作します。

そこでこの処理を、本題となるphpのexec関数経由で行おうと思い、同一サーバーに以下のようなphpコードを書き、そのphpファイルにブラウザでアクセスしました。

exec('/path/to/node /path/to/sample.js 2>&1',$array);
var_dump($array);

すると、以下のようなエラーメッセージが表示されます。

array (size=30)
  0 => string '(node:35498) UnhandledPromiseRejectionWarning: Error: Failed to launch chrome!' (length=78)
  1 => string '[0514/170117.637027:ERROR:icu_util.cc(133)] Invalid file descriptor to ICU data received.' (length=89)
  2 => string '[0514/170117.637161:FATAL:content_main_delegate.cc(57)] Check failed: false.' (length=76)
  3 => string '#0 0x563b8fcae82c base::debug::StackTrace::StackTrace()' (length=55)
  4 => string '#1 0x563b8fc35290 logging::LogMessage::~LogMessage()' (length=52)
  5 => string '#2 0x563b8dee5de3 content::ContentMainDelegate::TerminateForFatalInitializationError()' (length=86)
  6 => string '#3 0x563b8f964941 content::ContentMainRunnerImpl::Initialize()' (length=62)
  7 => string '#4 0x563b8f96ec12 service_manager::Main()' (length=41)
  8 => string '#5 0x563b8f963184 content::ContentMain()' (length=40)
  9 => string '#6 0x563b93b3ba39 headless::(anonymous namespace)::RunContentMain()' (length=67)
  10 => string '#7 0x563b93b3bac2 headless::HeadlessBrowserMain()' (length=49)
  11 => string '#8 0x563b8f96bf8f headless::HeadlessShellMain()' (length=47)
  12 => string '#9 0x563b8dee41ac ChromeMain' (length=28)
  13 => string '#10 0x7f113a516445 __libc_start_main' (length=36)
  14 => string '#11 0x563b8dee402a _start' (length=25)
  15 => string '' (length=0)
  16 => string '' (length=0)
  17 => string '' (length=0)
  18 => string 'TROUBLESHOOTING: https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md' (length=94)
  19 => string '' (length=0)
  20 => string '    at onClose (/path/to/node_modules/puppeteer/lib/Launcher.js:255:14)' (length=91)
  21 => string '    at Interface.helper.addEventListener (/paht/to/node_modules/puppeteer/lib/Launcher.js:244:50)' (length=117)
  22 => string '    at Interface.emit (events.js:187:15)' (length=40)
  23 => string '    at Interface.close (readline.js:374:8)' (length=42)
  24 => string '    at Socket.onend (readline.js:152:10)' (length=40)
  25 => string '    at Socket.emit (events.js:187:15)' (length=37)
  26 => string '    at endReadableNT (_stream_readable.js:1086:12)' (length=50)
  27 => string '    at process._tickCallback (internal/process/next_tick.js:63:19)' (length=66)
  28 => string '(node:35498) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)' (length=248)
  29 => string '(node:35498) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.' (length=204)

上記コードは特に大きな意味をなさないものですが、最終的にやりたいことは、Puppeteerで動的なwebページのブラウジングをして、任意の要素を取得(スクレイピング)したいと思っています。
その実行タイミングをphpからのexecコマンドで制御したいというものです。

当方、Node.jsにはあまり明るくなくて申し訳ないのですが、上記コードで何か問題があるところがあれば、是非ご指摘いただきたく思います。
よろしくお願いいたしますm(_ _)m

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

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

  • ただいまの回答率 90.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    18702questions

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

  • Node.js

    1686questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • Puppet

    5questions

    Puppetは、Rubyで作られた UNIX系OSのシステム管理を自動で行うためのツールです。