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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ImageMagick

ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

imagick

IMagickは、PHPからImageMagickを使う場合に使用する拡張インターフェースです。PHPで簡単にImageMagickの機能が利用できます。

Q&A

2回答

545閲覧

[Laravel][Job/Queue] Imagickが読み込まれない。

CreateMoto

総合スコア0

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ImageMagick

ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

imagick

IMagickは、PHPからImageMagickを使う場合に使用する拡張インターフェースです。PHPで簡単にImageMagickの機能が利用できます。

0グッド

0クリップ

投稿2023/09/21 09:38

編集2023/09/22 00:40

実現したいこと

  • Job/Queue機能を使って、画像処理機能を実現したい。
  • Jobの中でImagickを使いたい。

前提

Laravelを使ってシステムを作っています。

PDFをjpgに変換するコードを書いていたのですが、
処理時間が長くなる為にJobとQueueを使って非同期処理を行おうと思いました。

以下が実際のJobのコードです。

<?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Imagick; class CreateOCRRecognitionResultJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * Create a new job instance. */ public function __construct() { } /** * Execute the job. */ public function handle(): void { $imagick = new Imagick(); } }

use Imagick;としていますが、Jobを実行すると以下のようなエラーメッセージが発生しました。

発生している問題・エラーメッセージ

Class "Imagick" not found {"exception":"[object] (Error(code: 0): Class \"Imagick\" not found at ...

試したこと

  • ImagickはDockerfileに追記してインストール済みです。
  • Controllerにベタ書きするとエラーなく動きます。
  • intervention/imageをインストールして、new Image()としても結果は同じでした。

/usr/bin/convert/の利用

$input = '省略'; $output = '省略'; $command = "/usr/bin/convert -density 200 -resize 1600x1600 $input $output"; system($command);

上記のように/usr/bin/converコマンドで実行してみましたが、以下のエラーメッセージが出ます。

sh: /usr/bin/convert: No such file or directory

こちらも同じく、Controller内やDockerDesktopのターミナルから実行すると正しくコマンドが実行され、Imagickで画像処理が可能でした。


Jobの中にコードを入れると動かないようです。
Jobの中では、importができないのでしょうか?

補足情報(FW/ツールのバージョンなど)

MacのDockerDesktopで以下のリポジトリを使い、Laravelを動かしています。
https://github.com/ucan-lab/docker-laravel

  • 使用PC:MacBook Air M2 2022
  • OSバージョン:macOS Ventura 13.5.1
  • Docker Desktop:4.23.0
  • フレームワーク:Laravel v10.10
  • PHPバージョン:8.2

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

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

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

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

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

guest

回答2

0

動作しているソースです。
ブラウザでlocalhostにアクセスしてsrc/storageに画像ファイルが作成されます。

  • src/routes/web.php
<?php use Illuminate\Support\Facades\Route; use App\Jobs\ImageJob; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider and all of them will | be assigned to the "web" middleware group. Make something great! | */ Route::get('/', function () { ImageJob::dispatch(); return 'ok'; });
  • src/app/Jobs/ImageJob.php
<?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; class ImageJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * Create a new job instance. */ public function __construct() { // } /** * Execute the job. */ public function handle(): void { $imagick = new \Imagick(); $imagick->newImage(500, 500, 'red'); $imagick->setImageFormat("png"); $imagick->writeImage(storage_path(now()->format('Ymd_His').'new_image.png')); } }

投稿2023/09/22 00:55

niiyz

総合スコア131

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

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

0

Jobの中では、importができないのでしょうか?

Jobの中とか関係ないです。

Dockerfileに書いてあるサーバーにimagemagickがインストールされていないので
phpinfo()したときに「imagick」の項目が存在しません。

Dockerfileを修正してmake buildしなおしてmake upしてください。

  • infra/docker/php/Dockerfileに5行追加
RUN apt-get update \ && apt-get -y install --no-install-recommends \ locales \ git \ unzip \ libzip-dev \ libicu-dev \ libonig-dev \ imagemagick \ <- これを追加 libmagickwand-dev \ <- これを追加 libmagickcore-dev \ <- これを追加 && apt-get clean \ && rm -rf /var/lib/apt/lists/* \ && locale-gen en_US.UTF-8 \ && localedef -f UTF-8 -i en_US en_US.UTF-8 \ && docker-php-ext-install \ intl \ pdo_mysql \ zip \ bcmath \ && pecl install imagick \ <- これを追加 && docker-php-ext-enable imagick \ <- これを追加 && composer config -g process-timeout 3600 \ && composer config -g repos.packagist composer https://packagist.org

「use Imagick;」の定義も不要です。

投稿2023/09/21 11:18

niiyz

総合スコア131

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

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

CreateMoto

2023/09/21 22:44

ご回答ありがとうございます。 大変申し訳ございません。質問文の中に書き忘れておりました。 Dockerfileにはご提示いただいたように修正済みでして、 phpinfo()からも確認ができ、Jobの中に書かなければ通常通り動作をしております。 niiyz様の環境では問題なく動作いたしますでしょうか?
niiyz

2023/09/22 00:55

dispatch()して動作しました。 > 「use Imagick;」の定義は不要です。 new \Imagick() or new Imagick()書くかの違いだと思うので無視してください。 画像ファイルを保存する予定のディレクトリの権限とか見直してみればどうでしょうか。 回答に動作したソース貼っておきます。
CreateMoto

2023/09/22 02:16

追加のご回答ありがとうございます。 動作したソースを貼ってみましたが当方のDockerでは同じく、動きませんでした。 しかし、レンタルサーバにソースをアップし、実行してみたところ正常に画像が作成されました。 こちらのDocker環境に問題があるのかもしれません。 その辺りをもう一度調査してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問