browsershot 은 html 을 pdf 로 저장하기 위한 라이브러리이다.
그런데 왜 라라벨에서 browsershot 사용하기가 아니라 centos 에서 사용하기라고 제목을 붙였냐면 mac 에서는 매우 간단한 설정만 거치면 사용이 가능한 것에 비해 리눅스에서는 뭐가 안되도 참 잘 안됐다. ㅠ_ㅠ
그래서 다음에 또 리눅스에서 laravel + browsershot 을 사용할 일이 생길까봐 기록해 둔다.
- 파일을 write 하는데 내가 설정한 경로에 안쓰여질때
Browsershot은 렌더링된 html 내용을 파일로 쓰고 pdf 로 변환하는 방식으로 구현되어 있었다.
그런데 html 을 파일로 쓸때부터 문제가 생겼다.
Browsershot.php 파일 내에서 file_put_contents 를 하는데 /tmp/systemd-private-xxx 폴더내에 써지는 것이다. (실제 내가 설정한 path 는 /tmp)
이건 아파치의 보안을 위한 것으로 보인다.
설정을 바꿔주면 내가 원하는 위치에 파일을 쓸 수 있다.
vim /usr/lib/systemd/system/httpd.service
PrivateTmp=false 변경
systemctl daemon-reload
apachectl restart
- laravel 에서 Browsershot 호출
$pdfStream = Browsershot::html($html)
->setOption('landscape', false)
->setIncludePath('$PATH:/usr/local/bin:/opt/homebrew/bin'.':/usr/local/lib/node/bin')
->setOption('timeout', 200000) // Puppeteer의 타임아웃 설정
->setOption('args', ['--no-sandbox', '--disable-setuid-sandbox']) // Chrome 실행 옵션 추가
->setOption('debug', true)
->pdf();
ssh 에서 아파치 계정으로 browsershot 실행
sudo -u apache -s
$PATH:/usr/local/bin:/opt/homebrew/bin:/usr/local/lib/node/bin:/root/.nvm/versions/node/v17.9.0/bin/ NODE_PATH=`npm root -g` node '/web/pharmacist/vendor/spatie/browsershot/src/../bin/browser.cjs' '{"url":"file:\/\/\/tmp\/1200951517-0172934001705629309\/index.html","action":"pdf","options":{"args":["--no-sandbox","--disable-setuid-sandbox"],"viewport":{"width":800,"height":600},"displayHeaderFooter":false,"landscape":false,"timeout":200000,"debug":true}}'
다음과 같은 오류 발생
Error: Could not find Chrome (ver. 119.0.6045.105). This can occur if either
1. you did not perform an installation before running the script (e.g. `npx puppeteer browsers install chrome`) or
2. your cache path is incorrectly configured (which is: /usr/share/httpd/.cache/puppeteer).
For (2), check out our guide on configuring puppeteer at https://pptr.dev/guides/configuration.
at ChromeLauncher.resolveExecutablePath (/usr/local/lib/node/lib/node_modules/puppeteer/node_modules/puppeteer-core/lib/cjs/puppeteer/node/ProductLauncher.js:278:27)
at ChromeLauncher.executablePath (/usr/local/lib/node/lib/node_modules/puppeteer/node_modules/puppeteer-core/lib/cjs/puppeteer/node/ChromeLauncher.js:209:25)
at ChromeLauncher.computeLaunchArguments (/usr/local/lib/node/lib/node_modules/puppeteer/node_modules/puppeteer-core/lib/cjs/puppeteer/node/ChromeLauncher.js:103:37)
at async ChromeLauncher.launch (/usr/local/lib/node/lib/node_modules/puppeteer/node_modules/puppeteer-core/lib/cjs/puppeteer/node/ProductLauncher.js:69:28)
at async callChrome (/web/pharmacist/vendor/spatie/browsershot/bin/browser.cjs:91:23)
{"requestsList":[],"consoleMessages":[],"failedRequests":[],"redirectHistory":[],"pageErrors":[],"exception":"Error: Could not find Chrome (ver. 119.0.6045.105). This can occur if either\n 1. you did not perform an installation before running the script (e.g. `npx puppeteer browsers install chrome`) or\n 2. your cache path is incorrectly configured (which is: /usr/share/httpd/.cache/puppeteer).\nFor (2), check out our guide on configuring puppeteer at https://pptr.dev/guides/configuration."}
해결방법 (올바른지는 모르겠다.)
chrome 설치
PATH=$PATH:/usr/local/lib/node/bin /usr/local/lib/node/bin/npx puppeteer browsers install chrome
폴더 생성
mkdir /usr/share/httpd/.cache/puppeteer
chown -R apache:apache .cache/
pdf 생성이 잘된다.
생각보다 오래 걸릴 수도 있을 거 같아서 pdf 생성은 큐로 처리해야 할거 같다.
'개발 > PHP 라라벨' 카테고리의 다른 글
session_start() 함수 호출해도 쿠키에 PHPSESSID 저장 안되는 문제 (0) | 2023.08.23 |
---|---|
OSX(MacBook) 에 php5.3 설치하기 (0) | 2023.05.18 |
웹에서 애플로그인 (Sign In with Apple) 구현을 위한 설정 (0) | 2023.03.17 |
라라벨 큐 & Database 사용하기 (0) | 2023.01.31 |
withTrashed does not exist 에러 (0) | 2021.07.22 |