joppot

コピペで絶対動く。説明を妥協しない

サーバ ソフトウェア

MAMPでphpのshell_execを使用してunixコマンドを実行できない場合の対処(imagemagick,convert)

投稿日:

Pocket

Eastern Bluebird

概要

みなさんこんにちはcandleです。今回はちょっと問題が起きてshell_execがうまくいかないときのトラブルシューティングをまとめます。

私はMAMPをバージョンアップする前は、phpのshell_execからunixのconvertコマンドを使う事ができたのですが、バージョンアップ後、急に使えなくなりました。

どうやって、そこから解決まで持っていったのかまとめます。

今回は、imagemagickのconvertコマンドを使うという前提で話を進めていきます。

前提

なし

SPONSORED LINK


サンプルファイルと画像を用意する

まずは、shell_execをするphpファイルを作ります。私は「do_shell_exec.php」というファイルを適当なプロジェクトに作成します。

私はalltestプロジェクトに置きました。

do_shell_exec.phpの中身は下の様にします。

<?php

$command="convert -geometry 50% ./apple.jpg ./50p.jpg";
$result=shell_exec($command);
echo $result;
echo "end";
?>

Web - alltest_do_shell_exec.php - Aptana Studio 3 - _Applications_MAMP_htdocs

画像を用意します。
下の写真を「do_shell_exec.php」があるフォルダに置いてください。

apple


do_shell_execを実行する

MAMPを起動して、今作成したphpフィアルのところにいきます。
私の場合は下のURL になります。

http://localhost:8888/alltest/do_shell_exec.php

もしも、shell_execでconvertが作動すれば、画像のサイズが半分になった50p.jpgというファイルが生成されます。

画面をみると、phpのスクリプトは最後まで実行されています。

‎localhost_8888_alltest_do_shell_exec.php

しかし、このphpスクリプトが置かれたフォルダ(私の場合はalltestフォルダ)には50p.jpgというファイルが生成されていません。
alltest

これはつまり、shell_execは動いているが、unixコマンドがうまく実行されてい無い事を表しています。


unixコマンドにエラーを吐かせる

現在、このサンプルソースは下の様に、unixの実行結果を$resultにおさめています。

$result=shell_exec($command);
echo $result;

もしも、unixコマンドでエラーがでれば、確認できるというわけです。エラーを出す為に、do_shell_exec.phpを変更しましょう。

<?php
$command="convert -geometry 50% ./apple.jpg ./50p.jpg 2>&1";
$result=shell_exec($command);
echo $result;
echo "</br>";
echo "end";
?>

unixコマンドの最後に「2>&1」というが加えられました。これでエラーがみれます。
ブラウザをリロードすると下のようなエラーがでました。

「sh:convert: command not found」

Menubar

このエラーはconvertコマンドが見当たらないようという意味です。convertのコマンドがある場所を探して指定しましょう。
ターミナルでconvertのある場所を探します。下のコマンドを打ちましょう。

which convert

alltest — bash

私のはmacportsでImagemagickを入れているのでopt以下にありますね。brewで入れている人はusr以下にあると思います。

ということで、今調べたパスを用いて、ソースコードを編集します。下のPATHはmacportsでimagemagickを入れた時のconvertコマンドのパスです。ちゃんと自分の調べたものを入れてください。

<?php
$command="export PATH='/opt/local/bin/'; convert -geometry 50% ./apple.jpg ./50p.jpg 2>&1";
$result=shell_exec($command);
echo $result;
echo "</br>";
echo "end";
?>

では、これでブラウザをリロードしてみましょう。

今度は別のエラーがでました。これもMAMPのバージョンや使っているunixコマンドによって違うのですが、だいたいはdylibのエラーだと思われます。

例えば、下のようなエラーや

「dyld: Library not loaded: /opt/local/lib/libfreetype.6.dylib Referenced from: /opt/local/bin/convert Reason: Incompatible library version: convert requires version 18.0.0 or later, but libfreetype.6.dylib provides version 16.0.0 」

‎localhost_8888_alltest_do_shell_exec.php-1

下のようなエラーがでるかもしれません。

「dyld: Symbol not found: __cg_jpeg_resync_to_restart Referenced from: /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib Expected in: /Applications/MAMP/Library/lib/libJPEG.dylib in /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib 」

Mozilla Firefox


envvarsを編集する

これらのエラーを出さない為に、MAMPのenvvarsを編集します。私はこのファイルでdylibがどのように影響しているか詳しく知らないのですが、もしも、不具合が生じたい場合は戻しておくと良いでしょう。

下のパスに移動します。

/Applications/MAMP/Library/bin/

この中に「envvars」というファイルがあります。これを適当なエディタで開きます。

下の1文をコメントアウトします。

DYLD_LIBRAY_PATH=”/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH”

MAMPの古いバージョンでは下の場所をコメントアウトします。

envvars-1

最新版ではif文になっています。その中の同じ文章をコメントアウトしましょう。

envvars

これで修正は終わりです。
サーバを再起動しましょう。

ブラウザをリロードすると、今度はエラーメッセージがでてきません。

Skitch

フォルダをみると、無事convertコマンドが実行されて、画像が生成されています。

alltest-1

まとめ

今回は、convertメソッドをみてきましたが、他のコマンドでも同じだと思います。まずはエラーを出力して、どのような問題が起きているか把握して、対処しましょう。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-サーバ, ソフトウェア
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

centosのfluentdをdaemon toolsを使って自動起動する

概要 みなさんこんにちはcandleです。今回は、fluentdの自動起動を試したいと思います。 centosかつfluentdかつdaemon toolsって誰に需要があるのか分からない記事ですがよ …

AtomのMarkdownでプレビューがトップにスクロールして戻ってしまうのを防ぐ方法

English 日本語 概要 みなさんこんちにcandleです。今回はAtomのMarkdownで記述中のプレビューがスクロールアップしてしまうのを防ぐ方法です。 Atomには初めからmarkdown …

Ubuntuにmemcachedをインストールする方法と動作確認

概要 みなさんこんにちは、今回はubuntuにmemcachedを入れて、起動や、動作確認を行ってみたいと思います。 memcachedとは比較的短期間「key=>value」という形で値を保存するサ …

railsのaws-sdk gemを使ってs3のフォルダ(folder)を削除する

概要 みなさんこんにちはcandleです。今回はs3にあるフォルダを丸ごとrailsのaws-sdk gemを使用して削除してみたいと思います。 実はこの方法を確立するまですごく四苦八苦しました。なん …

ubuntuでnginxの起動と最低限のコマンド

概要 今回は、nginxの起動と最低限のコマンドをまとめました。 前提 nginxがインストールされている nginxの起動と停止と再起動 nginxはインストールした当初の設定ではubuntuを起動 …

  • English
  • 日本語

プロフィール


ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー

スポンサードリンク

アーカイブ