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

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

ただいまの
回答率

89.99%

xampp環境でimagickを利用して画像・pdfファイルを読み込むとFatal Errorがでる

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 953

17ec084

score 5

 前提・実現したいこと

xamppで Windows 10 Proのパソコンを自宅サーバ化し、そのサーバでpdfファイルをjpgなどの画像ファイルに変換するphpプログラムを動かしたく、ImageMagickやGhostScriptをダウンロードしました。

手順は、GitHubのリポジトリ に示した通りで行いました。

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

phpinfo();による出力で、imagickが有効になっていることまでは確認できているのですが、
実際にimagickを利用すると、readImgや他の関数を使ってpdfファイルやjpgファイルを読み込む実験をしても、また、file_get_contents('画像ファイルのパス(フルパスも相対パスも試しました)')の出力を読み込んでも、例えば次のようなエラーを返すばかりです。  

 <br />
 <b>Fatal error</b>:  Uncaught ImagickException: Failed to read the file in  C:\xampp\htdocs\test3.php:5
 Stack trace:
 #0 C:\xampp\htdocs\test3.php(5): Imagick-&gt;readimage('http://localhos...')
 #1 {main}
   thrown in <b>C:\xampp\htdocs\test3.php</b> on line <b>5</b><br />

GitHubのリポジトリで「反省」にも示した通り、ImageMagickのバージョンの問題かなとも思っているのですが、実際どうなのでしょうか?

VC15だと、バージョン7未満のImageMagickが公開されていないようで、バージョンダウンもできない状態です。

どうか、どなたかお知恵を貸してください。よろしくお願いいたします。  


 1. 以下、GitHubのレポジトリのREADME.mdのコピーです。

 2.使用環境、ソフト

・Windows 10 Pro  
xampp (PHP 7.2.12) (Control Panelのバージョンはv3.2.2であった)  
ImageMagick-7.0.7-11-vc15-x86  
php_imagick-3.4.3-7.2-ts-vc15-x86  
Ghostscript 9.26 for Windows (32 bit) AGPL licence  
・Microsoft Word 2016

 3.実験と結果

実験日: 2018/11/25

 3-1-1.実験1 端末のサーバ化[1]

①参考サイト[1]に従ってXAMPPをインストールした。  
但し、すべてのソフトを選択してインストールした。  
また、xamppをインストールしたディレクトリはc:\xamppである。
②http://localhost/ にアクセスした。

 3-1-2.実験1の結果

図3-1-2のようなページが表示された。  
図3-1-2  
図3-1-2 実験1の結果

 3-2-1 実験2 拡張モジュールの確認

①次のようなファイルtest.php[2]を作成し、C:\xampp\htdocsにコピーした。このディレクトリにコピーすることは、サーバへのアップロードに相当する。  

<?php

$im = new Imagick();
//画像を生成したいPDFを読み込む
$im->readImage('hoge.pdf');
//ページ数を取得する
$totalPage = $im->getImageScene();

for ($i = 0; $i <= $totalPage; $i++) {
    //PDFのページ
    $im->setImageIndex($i);
    //サムネイルサイズ 640pxに収める
    $im->thumbnailImage(640, 640, true);
    //シャープ
    $im->sharpenImage(0, 1);
    //生成
    $im->writeImage('out_' . $i . '.jpg');
}

$im->destroy();

?>

②Microsoft Word 2016で「hoge.pdf」とだけ書いた文章hoge.pdfを作成し、C:\xampp\htdocsにコピーした。  
③WWWブラウザで、サーバにアップロードしたtest.phpを閲覧した。  

 3-2-2.実験2の結果

実験2の結果、次のようにFatal errorが表示された。

> <br />
> <b>Fatal error</b>:  Uncaught Error: Class 'Imagick' not found in C:\xampp\htdocs\test.php:3
> Stack trace:
> #0 {main}
>   thrown in <b>C:\xampp\htdocs\test.php</b> on line <b>3</b><br />


このことから、xamppによって作られたサーバにはImageckというクラスが用意されていない、即ちImageMagickがインストールされていないということが分かった。

 3-3-1.実験3 ImageMagickを利用可能化[2]

①次のようなisTs.php[3]を作成し、c:\xampp\htdocs にコピーし、 http\://localhost/isTs.php にアクセスし、  
・php versionを確認した。  
・Compiler versionを確認した。  
・Architectureを確認した。  
・thread safeが有効か否かを確認した。  

<?php
print phpinfo();
?>


②GhostScriptをC:\xampp\gs\gs9.26にインストールした。  
③ImageMagickの公式ダウンロードページにアクセスし、ImageMagick-7.0.7-11-vc15-x86.zip をダウンロードした。  
vc15はxamppに入っているphpのコンパイラのバージョンであり、x86は、xamppに入っているソフトはみな32 bitで動作するものであるからである。(表3-3-2-1を確認されたい)  
そして展開し、中身をc:\xampp\ImageMagickにすべてコピーした。  
④Imagickの公式ダウンロードページにアクセスし、3.4.3 ディレクトリを選択し、php_imagick-3.4.3-7.2-ts-vc15-x86.zip を探した。  
7.2は、phpのバージョンが7.2.nであることを、tsはthread safeが有効であること、vc15はコンパイラのバージョン、x86は32 bitを意味する。  
表3-3-2-1と対応させて正しい名前のzipファイルを選ばないと、実験が正常に行えない。  
参考サイト[2]に示されたダウンロードページにphp_imagick-3.4.3-7.2-ts-vc15-x86.zipは存在しなかった。しかし、別のページ[4]には存在したので、それをダウンロードした。  
展開後php_imagick.dll をC:\xampp\php\ext へコピーし、  
CORE_RL_ で始まるファイルをすべてC:\xampp\ImageMagick\bin\ に上書きコピーした。  
C:\xampp\php\php.ini の  

;;;;;;;;;;;;;;;;;;;;;;  
; Dynamic Extensions ;  
;;;;;;;;;;;;;;;;;;;;;;  

のところにextension= が並んでいるところがあるので、そこにextension=php_imagick.dll を加筆した。  
⑥図3-3-1のように環境変数を指定した。

図3-3-1  

図3-3-1 環境変数の設定

 3-3-2.実験3の結果

①の結果、表3-3-2-1のようなことが分かった。  

<Div Align="center">表3-3-2-1 インストールされたphpの仕様</Div>

 PHP Version     7.2.12                   
 Compiler        MSVC15 (Visual C++ 2017) 
 Architecture    x86                      
 Thread Safety   enabled                  

②~⑥をしたうえでhttp://localhost/isTs.php にアクセスした結果、①の段階では表示されなかった、表3-3-2-2(省略します。リポジトリを見てください)が表示された。

これは、ImageMagickのモジュールが正常に読み込まれたことを意味する。  

そしてhttp://localhost/test.php にアクセスすると、

> <br />
> <b>Fatal error</b>:  Uncaught ImagickException: UnableToOpenBlob 'hoge.pdf': No such file or directory @ error/blob.c/OpenBlob/3315 > in C:\xampp\htdocs\test.php:5
> Stack trace:
> #0 C:\xampp\htdocs\test.php(5): Imagick-&gt;readimage('hoge.pdf')
> #1 {main}
>   thrown in <b>C:\xampp\htdocs\test.php</b> on line <b>5</b><br />

のように表示され、エラーの内容が実験2のときとは異なるものとなった。  
このことにより、phpプログラム自体は書き直さなくてはいけないが、モジュール自体は動作しているということが改めて確認された。

 3-4 実験4 phpファイルの読み込み とその結果

ImageMagickをphpで動かし、pdfファイルを読み込むことのできるphpプログラムのコードがネットのどこかに落ちていないか探した。  
しかし、どの関数を使ってpdfファイルやjpgファイルを読み込む実験をしても、file_get_contents()の出力を読み込んでも、エラーを返すばかりであった。  

 4.反省

参考サイト[5][6]によると、ImageMagickをダウンロードしたら、適切な方法でコンパイルしてconfigure.exeなるファイルを作る必要があり、しかも今回インストールしたImageMagick7ではだめで、バージョン6で行わないといけないようである。   
次回再挑戦する場合は、ImageMagick6をインストールすることにする。  
但し、この変更により、現状がさらに悪化して、なおかつ復旧不可能になるようではもったいないので、C:\xampp\ImageMagickをGitHubに保管、公開しておくことにする。  

 5.参考サイト

[1]http://www.kent-web.com/www/chap1.html  
[2]https://qiita.com/_xider/items/73c29d79eb4e252e64f7  
[3]https://mumu.jpn.ph/forest/computer/2017/03/19/8093/  
[4]https://windows.php.net/downloads/pecl/snaps/imagick/3.4.3/  
[5]https://oxynotes.com/?p=10474  
[6]https://qiita.com/tsukachin999/items/f955b77095ec8502ab9b

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m6u

    2018/11/26 12:38

    シンプルなテスト用phpファイルを起こして、アップロードされた想定のファイルをphpからバイナリーオープンすることはできますか?

    キャンセル

  • 17ec084

    2018/11/26 12:44

    ご援助ありがとうございます。頓珍漢なこと申しましたらごめんなさい。バイナリオープンというのはfile_get_contents('ファイル名')で開くことでよろしいでしょうか?もしそれであっていましたら、エラーメッセージの時に、3ケタの8進数のようなものがたくさん表示されましたので、おそらく画像ファイルをデータとして取得すること自体はできていると愚考します。

    キャンセル

  • 17ec084

    2018/11/26 12:48

    Fatal error: Uncaught ImagickException: Invalid filename provided in C:\xampp\htdocs\test4.php:7 Stack trace: #0 C:\xampp\htdocs\test4.php(7): Imagick->readimage('\x89PNG\r\n\x1A\n\x00\x00\x00\rIHD...') #1 {main} thrown in C:\xampp\htdocs\test4.php on line 7 こんなのです

    キャンセル

  • 17ec084

    2018/11/26 13:15

    ごめんなさい。間違えました。file_get_contents('')でデータを何らかの文字にして読めるのは、imagickに無関係ですよね。申し訳ありませんが、僕自身「バイナリオープン」という言葉に疎く、またネットで調べてもその言葉が見つからなかったので、ご教授いただけると幸いです。お手数をおかけしますがよろしくお願いします。

    キャンセル

回答 1

checkベストアンサー

0

phpからファイルにアクセスできるかできないかを確認したくて、
質問への追記・修正の依頼を出しておりました。

2つ確認していただきたいです。

1つ、
phpからファイルオープンができるかどうか。
例えばPHP: fopen - Manualを使って。
このとき、単純な英数字で構成されたファイル名はオープンできれば、
アクセス権にまつわる問題ではないと確認できます。

もう1つ、
アップロードされたファイルのファイル名を
仮のテキストファイルにでも出力して、
それがどういうエンコードなのかを確認してください。
ファイル名のエンコーディングがSJISで
php内部エンコーディングがUTF-8だったりすると、
ファイル名が適切に扱えてないこともあるので、
念のためにPHP: mb_convert_encoding - Manualを駆使して管理することも試してみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/27 14:13

    返信遅くなり申し訳ありません。
    <?php print fopen("http://localhost/a.png", "r"); ?>
    を実行した結果、次のように表示され、ファイルオープンには成功しました。
    Resource id #3
    またファイル名は英数字のみのものを利用していて、エンコードの問題は生じないように心がけました。

    キャンセル

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

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる