2017-11-09 30 views
0

このライブラリlaravel-snappyを使用して、キューにPDFを生成しています。laravel-snappyによって生成された一時ディレクトリ内のファイルを削除する

ライブラリは、スクリプトの実行後にすべてのtmpファイルを削除するように設計されています。これはKnp\Snappy\AbstractGeneratorクラスに次のコードが原因である:

public function __destruct() 
{ 
    $this->removeTemporaryFiles(); 
} 

リファレンス - https://github.com/KnpLabs/snappy/blob/master/src/Knp/Snappy/AbstractGenerator.php#L57我々はqueue:workコマンドが起動した後、それがされるまで実行し続けますキュージョブの内側とLaravelでこれを使用していると

手動で停止するか、端末を閉じます。

tmpファイルを消去するために、毎回キューワーカーを再起動する必要があります。

これに代わる方法はありますか?

注 - laravel-snappyのラッパー内のクラスKnp\Snappy\AbstractGeneratorのインスタンスは、protectedです。だから私は直接そのメソッドを呼び出すことはできません。

リファレンス - https://github.com/barryvdh/laravel-snappy/blob/master/src/PdfWrapper.php#L20

+0

は、ファイルの削除の少量を試みる最大実行時間の問題かもしれこの機能チェックPHPの設定でループがありますもう一つは、あなたのフォルダのアクセス許可を確認してください。 –

+0

キューワーカーが毎日自動的に起動して一時ファイルを削除する必要がありますか?あなたが実際に望んでいることは、setTemporaryFolderを使って一時フォルダの場所を変更することができても、この小さな事を心配している理由を明示してください。 –

答えて

0

REFF: -Read this doc

スーパーバイザ設定

スーパーバイザは、Linuxオペレーティングシステムのためのプロセスモニタで、自動的にキューを再起動します:聴いたり、キュー:仕事コマンドが失敗した場合Ubuntuでスーパーバイザーをインストールするには、次のコマンドを使用できます

sudo apt-get install supervisor 

スーパーバイザの設定ファイルは、通常/etc/supervisor/conf.dディレクトリに格納されています。このディレクトリ内では、スーパーバイザにプロセスの監視方法を指示する任意の数の構成ファイルを作成できます。たとえば、のは、キューを開始し、監視laravel-worker.confファイルを作成してみましょう:作業プロセス:作業プロセスとのすべてを監視します。この例では

[program:laravel-worker] 
process_name=%(program_name)s_%(process_num)02d 
command=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3 --daemon 
autostart=true 
autorestart=true 
user=forge 
numprocs=8 
redirect_stderr=true 
stdout_logfile=/home/forge/app.com/worker.log 

を、numprocsのディレクティブは、8キューを実行するためにスーパーバイザーに指示しますそれらが失敗した場合に自動的に再起動します。もちろん、コマンドディレクティブのqueue:work sqs部分を変更して、選択したキュードライバを反映させる必要があります。

設定ファイルが作成されたら、あなたはスーパーバイザーの構成を更新し、次のコマンドを使用してプロセスを開始することは:

sudo supervisorctl reread 

sudo supervisorctl update 

sudo supervisorctl start laravel-worker:* 
+0

申し訳ありませんが、あなたは質問を受け取りませんでした。私はもう一度言い換えて詳細を述べます。 –

0

私はライブラリを使用しますが、私が理解から、存在しませんPDFを生成するために使用するGeneratorクラス。

このクラスが解放されると、デストラクタが呼び出されるため、すべてのtmpファイルが削除されます。

ラッパーで開催されるようですので、あなたがnullに設定することはできません$generator = new SomeConcreteGenerator();

よう

Knp\Snappy\AbstractGenerator 

の実装への参照があります。

あなたは、おそらくあなたは$pdf = null経由でラッパーを解放し、新しいものを作ることができ

$pdf = App::make('snappy.pdf.wrapper'); 

を経由して、具体的な発電機を保持しているラッパーを取得。 1000 Pdfsが作成された後、これを行う必要があります。

このアプローチの問題は、サービスが$this->app->singleton(...)によってシングルトンとしてDICにバインドされていることです。 See source code

したがって、私たちは解放したいという言葉を保持しています。

$this->app->singleton(...)ではなく、ソースコードを$this->app->bind(...)に変更して試してください。

See here on binding

(あなたは基本的にDICが所有しているオブジェクトを破壊として、あなたは__destruct()を呼び出すべきではありません。)

+0

'$ pdf = null'は役に立ちませんでしたが、' $ pdf - > __ destruct() 'のような処理をすると' Knp \ Snappy \ AbstractGenerator'クラスのdestructを呼び出し、すべてのtmpファイルを削除します。私はこの解決策に100%納得しているわけではないので、いくつかの選択肢を使って図書館にPRを提供します。他のアイデアがあれば教えてください。 –

+0

私はソースコードをチェックし、私の答えを編集しました。 – Stefan

+0

はい、あなたは '__destruct()'のものです。それを使用しないでください。 –

関連する問題