人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

LAMPで画像付きメールの投稿システムを開発しております。

現在、画像メールの受信、解析まではできているのですが、DBへの登録が行えなく悩んでいます。

Command died with status 255: "
/usr/bin/php -q /var/www/html/app/mail/mail.php >> /tmp/mail_log.txt".

Command output: PHP Fatal error: Class 'MDB2' not found in
/var/www/html/app/mail/mail.php on line 3

メールを投稿するとmail.phpが起動するようになっていまして、
mail.php内でMDB2を経由してDBへ接続をしようとしているのですが、エラーとなって上記のような文章が返信されてきます。


メール受信

/etc/aliases でmail.phpが起動するようにセット

mail.phpが起動して解析開始
解析が完了したのでDBへ接続し登録を始める

エラー

エラーのメールが返ってくる

原因がつかめておらずこのような場合、どのような対処を行えばよいでしょうか?

procmail?か何かでスクリプトを動かしている場合は何か対応が必要なのでしょうか。

ご知見のある方教えていただけますと助かります。
php5.3.8
postfix2.3
mysql5.5

●質問者: aiueo
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● kodairabase
●0ポイント

PEAR::MDB2 がインストールされていないのではありませんか?
http://pear.php.net/manual/ja/package.database.mdb2.php


2 ● うぃんど
●100ポイント ベストアンサー

(1)原因
'MDB2' not found なので、
MDB2への相対パスが間違っているってことです

(2)MDB2がどこにあるかの調査
Linuxのコマンドラインから下記のコマンドを入力すると、
PEARへの絶対パスが出力されます

pear config-get php_dir

(3)プログラム修正
mail.phpを書き直す
dirname(__FILE__)を用いて相対パスにしても間違いではありませんが、
ライブラリの読み込みは絶対パスを用います

require_once 'MDB2.php';
 ↓
require_once '絶対パス/MDB2.php'

(4)応用
PEARを使うたびに絶対パスを書くのは面倒でしょう
php.iniにPEARへの絶対パスを書いておけば、
ライブラリの位置を確認してプログラムを書き直したりする必要がなくなり、
単純に'MDB2.php'だけを書けば良いことになるわけです
指定方法は絶対パスを用います
(相対パスはphpのワーキングディレクトリによって、
違った場所を指してしまうためダメなのです
だから、前述3でも絶対パスを用いているわけです)

include_path=".;PEARの絶対パス"

うぃんどさんのコメント
ところで、、、 前々回の質問がまだ受付中なのはtdoiさんからの返事待ち? 細かなメール仕分けをしたい場合に、 postfix+procmailという組み合わせを選択する人が多いので、 例としてあげただけだと思いますよ あなたがpostfixの.forward にてmail.phpを起動しているなら、 procmailは使ってないってことになりますし・・・ 余談: ポイント欲しさにいいかげんに回答しまくっている人がいるので、 相手しないようにするか、適当にあしらっておきましょう matさんの過去質問を軽くみるだけでもMDB2使っていることは判るのですから・・・

tdoiさんのコメント
あ、すみません。質問されていると感じてなく、解決したようだったので、スルーしてました。 windofjulyさんがおっしゃるようにprocmailは単に例として挙げただけで、Webサーバから起動される訳じゃないときという意味で書いただけでした。

aiueoさんのコメント
ありがとうございます。 調べたところ /usr/share/pear と表示されました。 ただ、mail.php内では require_once("/usr/share/pear/MDB2.php"); と記載してありまして問題なさそうなのですが。。 また、ブラウザとrootのカレントディレクトリが違うということを先ほど調べて理解しまして、 require_once("../macros/db_connect.php"); 上記のような形でデータベースへの接続を管理しているphpを設けているのですが db_connect.phpの中身 $dsn = 'mysql://xxx:xxx@xxx/xxx'; $mdb2 =& MDB2::connect( $dsn, array() ); この場合も /usr/bin/php などをいれて require_once("/usr/bin/php/var/www/html/macros/db_connect.php"); のような記載にしなければダメ?でしょうか。

うぃんどさんのコメント
>ブラウザとrootのカレントディレクトリが違う 前々回ならびに今回で、 「動かし方によって始点が違う」ことは理解されたことと思いますが、 それだけではなくて、 「実行しているユーザーによっても見えるものや見え方が違う」のでやっかいです ブラウザから見た場合にはapacheユーザーの視点であり始点になり、 rootでログインして見た場合にはrootの視点であり始点になりますので、 確認なさったようにカレントが違うということになったりします さてここで・・・mail.phpを動かしているのは誰でしょう? それはpostfixユーザーのはずです(そちらのセットアップ状況によります) rootではなくpostfixユーザーでログオンして、 /usr/share/pear/MDB2.php の存在確認をしてみてください >require_once("../macros/db_connect.php"); ブラウザからのアクセスで問題がないなら、そのまま相対パスで良いです ブラウザからも、コマンドラインからも使うのであれば、 絶対パス(どこから使っても絶対に同じ場所を指し示す)に替えた方がいいです こんなことを言うのは失礼かもしれしれませんが、 Linuxのユーザー管理とファイル管理の基礎を学びなおしたほうが多分ですがスッキリします phpやpostfixなどではなくて、Linuxの入門書を何冊か読んでみてください 一日か二日かけて軽く読み流すだけでも大きく違ってくるはずですから・・・

aiueoさんのコメント
丁寧なお返事有難うございます。 おっしゃられる通り、linuxについてもプログラミングについても知識がかなり浅くご迷惑をおかけします。 Linuxの入門書を購入して読みながら進めてみます。 ただ、どうしても時間がない状況でしてまた質問してしまうかと思いますがどうぞよろしくお願いいたします。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ