Laravel-Snappyを商用サーバーで使用する

 

商用サーバーでLaravel-Snappyを利用しようとしてかなりはまったので、備忘録として残しておきます。

環境

  • Laravel 6
  • laravel-snappy 0.4.8
  • wkhmltopdf 0.12.6
  • CPIサーバー シェアードプラン ACE01

今回の目的は、ChartやGraphを掲載したPDFファイルを作成することです。

そこで、「Laravel chart pdf」などで検索して色々調べてみたのですが、単なるPDFを吐き出すライブラリでは対応できないことがわかりました。

理由は、PDFを吐き出すライブラリがJSを展開できないことや一部CSSにしか対応していないみたいで、これでは理想とするPDFは実現できなさそうです。

最終的には下記の二つの方法を検討することになりました。

  1. Headless Chromeの利用
  2. Laravel-Snappyの利用

今回はLaravel-Snappyを使ってみる

Laravel-Snappyの設定ですが、非常に骨がおれました。。。

このLaravel-Snappyでは、元Googleのライブラリだったのでしょうか? wkhtmltopdf というライブラリを必要としています。

https://wkhtmltopdf.org/

このインストールが一筋縄ではいきません。

まずは、下記のサイトを参考にして、Laravel-Snappyをインストール。ざっくりLaravelがらみの設定は行いました。

Laravel-Snappyでpdfを出力できるようになるまで[1/25更新] - Qiita

ローカルと公開サーバーの違い

wkhtmltopdf

一般的には、上記サイトから、自分の環境にあったファイルをダウンロードしてきて、そこにLaravel-Snappyの環境設定ファイルにそのパスを記述するだけのようですが、実際は、ローカルのサーバー環境と公開するサーバー環境が異なる場合が多いかと思います。

なので、ローカルの設定をそのままアップロードしてもうまくいきません。実際そのような報告やスレッドがあっちこっちにありました。

この時でるエラーには、よく見ると「Exec format error」というエラーが含まれています。

なんのフォーマットが違うのか、かなりさ迷いましたが、結果的には、そのライブラリのバイナリファイルがそもそも理解できない、例えるなら、日本語なら読めるけど、中国語じゃ読めないよ!という、全然違うよ!ってエラーだったようです。

公開サーバーのOSを調べる

フォーマット合わせるためには、公開サーバーのOSを調べなければなりません。

今回のサーバーは、CPIのACE01です。ググってみましたが、OSとなるとそれらしい表現が全くでてきません。

そこでSSHでサーバーに接続し、OSを調べようと考えました。

https://www.cpi.ad.jp/shared/ace01/startup/pdf/setup_sshkey_pc_teraterm.pdf

FreeBSDとwkhtmltopdf 

SSHでCPIに接続しました。

Welcome to FreeBSD!

接続が無事完了しましたが、そもそも「FreeBSD」自体をあまり理解していません。。。

そこで、一歩さがり、FreeBSDを調べると、uname -aというコマンドにいきつきました。

コマンドをたたくと、

% uname -a
FreeBSD xxxxxx.secure.ne.jp 11.3-RELEASE-p6 FreeBSD 11.3-RELEASE-p6 #0: Tue Jan 28 00:00:00 UTC 2020
root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC amd64


wkhtmltopdfのダウンロードページ
では、OSの種類とバージョンが必要です。ただamd64というところだけは、見つけられました。

このサーバーのOSは何だ??と調べまくっているところ、偶然調べた「FreeBSD wkhtmltopsd」というキーワードで下記のページにたどり着きました。

wkhtmltopdf-0.12.6.txz

「FreeBSD 11」「amd64」のキーワードがあります。これだ!と思い、サーバーに展開する方法を探しました。

そして見つけた方法が下記です

$ wget https://pkg.freebsd.org/FreeBSD:11:amd64/quarterly/All/wkhtmltopdf-0.12.6.txz --no-check-certificate
$ tar -xvf wkhtmltopdf-0.12.6.txz

上記「--no-check-certificate」のオプションが無いと取得できないので注意です。

そして「tar -xvf wkhtmltopdf-0.12.6.txz」で解凍され、展開します。

usrフォルダへの展開

共有サーバーなので、上位のusrフォルダには展開されません。

今回の公開サーバーのルートのパスは「usr/home/xxxxxxxx(サーバーID)」です。なので、本来ならば usr/ 以下に展開すべきですが、それはできません。

なので、今回は、「usr/home/xxxxxxxx」下に、改めて「usr」フォルダを作成し、展開しました。

※ここで上記解凍の時に自動で「usr」フォルダできたのかは見逃しました。。。

今回は、上記の「https://pkg.freebsd.org/FreeBSD:11:amd64/quarterly/All/wkhtmltopdf-0.12.6.txz --no-check-certificate」のファイルをローカルにダウンロードし、解凍ソフトで、無理やり解凍したところ、下記のファイルとusrフォルダができました。

+COMPACT_MANIFEST
+MANIFEST
usr

この「usr」フォルダの中身をそのまま、usr/home/xxxxxxxx/usr の中に入れました。

ここで、動作確認をするために、SSHに戻ります。

動作確認

SSHで、wkhtmltopsdが動作するか確認します。

まず、Laravel-Snappyの設定でできた「config/snappy.php」ファイルの「wkhtmltopdf」「wkhtmltoimage」のパスの設定を変更します。

・・・
'binary' => base_path('usr/local/bin/wkhtmltopdf'),
・・・
'binary' => base_path('usr/local/bin/wkhtmltoimage'),
・・・

SSHで上記ファイルのあるフォルダに移動します。

$ cd usr/local/bin

このフォルダ内に目的の「wkhtmltopdf」「wkhtmltoimage」が存在します。

そして、下記コマンドを入力します


nbsp;./wkhtmltopdf

先頭に必ず「./」が必要です。

すると、エラーがでます。

./wkhtmltopdf: Permission denied.

パーミッションエラーです。そこで、「wkhtmltopdf」「wkhtmltoimage」の二つのファイルのパーミッションを「777」に設定しまし、再度、下記のコマンドを実行します。

Shared object "libstdc++.so.6" not found, required by "wkhtmltopdf"

また、エラーがでました。。。「libstdc++.so.6」が見つからないというエラーです。

今まで、PHPのライブラリのエラーが出たらあきらめていました。

もう打つ手はないのか。。。しかし、今回はさらに調べつづけてみました。

PHPのライブラリのインストール

共有サーバーの限界かと、あきらめかけつつ、「libstdc++.so.6」について調べ続けました。

すると下記のサイトを見つけました。

RPM Fedora 17 libstdc++ 4.7.0 i686 rpm

上記サイトから「libstdc++.so.6」がダウンロードできそうです。

とりあえず、ダウンロード。

拡張子「.rpm」というファイルがダウンロードできます。rpmとは「Red Hat Package Manager」の略?なのか、圧縮ファイルのようです。

そこで、解凍してみます。

すると今度は、「libstdc++-4.7.0-5.fc17.i686.cpio」となり、拡張子が変わっただけです。

「.cpio」の拡張子を調べてみると、これも圧縮ファイルのようです。

なので解凍してみました。

すると、「usr」フォルダが展開されました!!

※ちなみに解凍ソフトは、「7-Zip」というものを使っています。バリバリ解凍できて便利です w

再びusrフォルダへ

解凍後のusrフォルダを見ると、「lib」や「share」などのフォルダができてます。

これは、上記の「wkhtmltopdf」のフォルダ構成と似つつ、ぶつからないことに気づき、usr/home/xxxxxxxx/usr に再びぶっこみました。

さて、SSHで下記を実行してみます。


nbsp;./wkhtmltopdf Shared object "libstdc++.so.6" not found, required by "wkhtmltopdf"

結果は変わりませんでした。。。

最終調整はphp.ini

しかし、気付きました。上記でぶっこんだファイルは、PHPのライブラリ。

どこかでパスを通すとかすれば、よいんじゃないかと。

そして、CPIの管理画面から、PHPのバージョンのあったphp.iniのテキストをコピーし、php.iniファイルを作成しました。

下記を参考にして、そのファイルのinclude_pathの設定を行いました。

PHPのinclude_pathの設定(Apacheとpnp.ini) – ボンシのサイクリング&グルメ道

include_path = ".:/usr/home/xxxxxx/usr/"

そしてサーバーにアップ、最初に設定したLaravelのURLをたたく!

見事表示されました!!!

※グラフについては、調整が必要なようです。「Laravel-SnappyでPDFを出力するときにチャートが表示されなくなった - Qiita」を参考にしてください。

WEBサイト制作のお問い合わせ、お見積り依頼、ご質問は
こちらのお問い合わせフォームよりお願いいたします

メールお問い合わせはこちら

フライング・ハイ・ワークスの紹介

フライング・ハイ・ワークスは、東京のホームページ制作・Web制作会社・システム開発会社です。東京都及びその近郊(首都圏)を中心として、SEO対策を意識したPC及びスマホのサイトをワンソース(レスポンシブ対応)で制作します。

実績

デザイナーチームは、グラフィックデザインやイラストの制作も得意としており、著作権を意識しない素材の提供が可能です。システム・コーディングチームでは、Laravelなどを使用したスクラッチからのオリジナルシステム開発を始め、WordPressのカスタマイズを得意としております。

また、SEOやランディングページ(LP)、広告向けバナーなどを他社様でやっていた作業の引継ぎでも問題ありません。制作実績は多数ございますので、お客様に合わせたご提案が可能です。

500点以上のフライング・ハイ・ワークスの制作実績ページをご覧ください!

WEBサイト制作のお問い合わせ、お見積り依頼、ご質問は
こちらのお問い合わせフォームよりお願いいたします

メールお問い合わせはこちら