システム開発 – 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は実現できなさそうです。
最終的には下記の二つの方法を検討することになりました。
- Headless Chromeの利用
- Laravel-Snappyの利用
今回はLaravel-Snappyを使ってみる
Laravel-Snappyの設定ですが、非常に骨がおれました。。。
このLaravel-Snappyでは、元Googleのライブラリだったのでしょうか? wkhtmltopdf というライブラリを必要としています。
このインストールが一筋縄ではいきません。
まずは、下記のサイトを参考にして、Laravel-Snappyをインストール。ざっくりLaravelがらみの設定は行いました。
Laravel-Snappyでpdfを出力できるようになるまで[1/25更新] – Qiita
ローカルと公開サーバーの違い
一般的には、上記サイトから、自分の環境にあったファイルをダウンロードしてきて、そこに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」というキーワードで下記のページにたどり着きました。
「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制作のお問い合わせ、お見積り依頼、相談、質問は
お問い合わせフォームよりお願いいたします