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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

2回答

2019閲覧

wkhtmltopdf でのバックグランドでプロセスを動かす方法

m8150568151

総合スコア10

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2019/07/08 04:57

編集2019/07/08 08:00

前提・実現したいこと

wkhtmltopdfを使用していて作成に1~2分かかるためバックグランドで作成させ、ページを離れていても完成時にローカルにファイルが落ちてくるようにしたい

該当のソースコード

$url = "https://www.google.co.jp/"; Storage_path = Storage::disk('pdf'); $command = 'nohup /usr/local/bin/wkhtmltopdf --quiet --no-pdf-compression --page-size A4 --encoding EUC-JP --orientation Portrait "' . $url . '" ' . $storage_path . " /dev/null 2>&1 &"; exec($command, $output, $return);

ご教授お願いします。

多数の方にエスパーしていただきありがとうございます。
返信も共に感謝いたします。

追記

エラー内容ですが、

このサイトにアクセスできません http://localhost:8080/pdf/1234 のウェブページは一時的に停止しているか、新しいウェブアドレスに移動した可能性があります。 ERR_INVALID_RESPONSE
local.ERROR: File not found at path: sample.pdf {"exception":"[object] (League\Flysystem\FileNotFoundException(code: 0): File not found at path: sample.pdf at /var/www/html/vendor/league/flysystem/src/Filesystem.php:388)
$command = 'nohup /usr/local/bin/wkhtmltopdf --quiet --no-pdf-compression --page-size A4 --encoding EUC-JP --orientation Portrait "' . $url . '" ' . $storage_path . " /dev/null 2>&1 &";

上記のコマンドを実行すると起こります。
しかし下記のコマンドを実行すると問題なくダウンロードできます。

$command = ' /usr/local/bin/wkhtmltopdf --quiet --no-pdf-compression --page-size A4 --encoding EUC-JP --orientation Portrait "' . $url . '" ' . $storage_path . " 2>&1";

またデータが多くなるとtimeoutになってしまいます。

度々すみませんがよろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/07/08 05:03

で、現在起きている問題、質問はなにでしょうか。
mikkame

2019/07/08 06:05

エスパーすると 非同期で処理した結果、非同期の終了を検知できないので、ダウンロードさせれません ってところですかね
m8150568151

2019/07/08 07:33

ご返信ありがとうございます。 問題の追記致しました。
guest

回答2

0

リクエスト処理内の非同期処理には、Laravelのジョブキューの利用を検討してみてください
Laravel 5.8 キュー

投稿2019/07/08 05:50

aro10

総合スコア4106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

該当のソースコードの時点で、非同期処理はできていると思うのですが
おそらく、非同期処理の結果をブラウザに伝えられてなくて困っているのかと思います。

HTTPと非同期処理は相性が悪く、サーバからブラウザに処理結果を投げる方法は限られます。

  • web push で伝える
  • websocket で伝える
  • commetでポーリングして結果を取得する

など。

まあ一番簡単なのは非同期処理をせずに処理する事ですね。
別タブでダウンロードさせれば、画面のロックもなく、そのうちDLされるんじゃないですかね


追記に関して

nohup して、非同期で処理しているので、ファイルが出来上がる前にブラウザにレスポンスをしている。
もちろん、ファイルが出来上がる前にPHPの処理が進むので、File not found at path (ファイルが見つかりません)となる。

while (!file_exists(Storage_path.'/sample.pfd')) { sleep(1); }

みたいにファイルが生成されるまで待てばいいと思うのだが、そしたら非同期で処理する意味がないですね。

結論として、やりたい事に対する非同期で処理するメリットがございません。
どうしても非同期でやりたい場合は、pdfの作成が終わったらメール通知してダウンロードしてもらうぐらいがちょうどいいと思います

投稿2019/07/08 06:09

編集2019/07/09 03:59
mikkame

総合スコア5036

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m8150568151

2019/07/08 07:33

ご返信ありがとうございます。 問題の追記致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問