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
あなたの回答
tips
プレビュー