Blog

ブログ

エックスサーバーの仕様変更でPHPからメールが送信できなくなった

一ヶ月くらい前から、このブログに頂いたコメントのメール通知が届かなくなりました。

ちょうどサーバーの転送設定を間違えて、メールサーバーがパンクしてしまっていたため、てっきりそのせいだと思っていたのですが、「お問い合わせフォーム」もメールが送信されなくなっていました。

フリーでお仕事をしていると、新規のご相談はほとんど、メールフォームから入ってきます。もう大慌てでPHP構文や改行コードなど見直したのですが、全く問題は見つかりません。

一日かかって、このサイトがあるエックスサーバーPHPに関する仕様変更が原因だということがわかりました。
私と同じ問題が起こっている人がいるかもしれませんので、記事にしておきます。

エックスサーバーは、2010年8月頃にPHP周りの大幅な拡充を行いました。
PHP5.2以降への対応と、php.iniを管理画面からドメインごとに変更可能にする機能です。

PHP5.2になるとSOY CMSが使いやすくなることもあり、最初の通知が来た時点ですぐにこのサーバーのPHPバージョンを5.2にアップしました。
5.3にすると、a-blog cmsのioncube loaderが動作しなくなってしまいましたが、5.2では特に問題は見当たりませんでした。
いまさら言ってもしょうがないですが、メールフォームもチェックしておくべきでした…

さて、「php.ini設定機能」が追加される前は
「変更したい設定だけを書いたphp.iniを、サーバーのルートか任意のディレクトリに設置すると、デフォルトの設定に追加する」
という仕様になっていました。
CMSを使うと、どうしてもPHPの高度な設定変更が必要になります。
私もPEARやioncube loaderのパスなどを記述したphp.iniを、サーバールートに置いたままにしていました。

ところが、PHPのバージョンを切り替えると、このデフォルトの設定が変わってしまうようです。

つまり…

  • PHPバージョンを5.2か5.3に変えると、php.iniのデフォルト設定が変わってしまう
    (どう変わるかは不明だが、少なくともmail関連の関数が機能しなくなる)
  • これまで通り、サーバールートにphp.iniの差分を置いていると回避できない
  • 管理画面の「PHP.ini設定」で
    ドメインごとのphp.ini設定を有効にしたうえで、
    「php.iniの直接編集」でこれまでの差分を末尾に書き足して保存する
    と、回避できる

…ということらしいです。(実際そうやったら直った)

メチャクチャわかりにくい。

さらに詳しい情報は以下の通り。
サーバー管理画面の「PHPバージョン切り替え」「PHP.ini設定」のページをそれぞれよく見ると、こんなことが書いてあります…

■お客様側で個別にphp.iniを設置されている場合のご注意
 【PHP5.2.x】【PHP5.3.x】では php.ini 未設定項目の値は
 php4/php5.1とは異なる値となる場合があります。

 特にお客様側で個別に設置されているphp.iniにて、
 「sendmail_path」や「date.timezone」が未設定の場合、
 プログラムが正常に動作しなくなる可能性があります。
 上記現象を回避するには、事前に php.ini に設定値を追記する必要があります。

【個別にphp.iniを設定されている場合の注意】
本機能を有効(ON)に設定したドメインにおいては、
ホームディレクトリなどにお客様側で個別に設定されたphp.iniは全て無効となり、
本機能にて指定された設定のみが有効となりますのでご注意ください。

本機能を無効(OFF)に設定しているドメインについては、
ホームディレクトリ、またはディレクトリ毎に個別設定されているphp.iniが優先されます。

ふたつのページの説明を解読して、やっとこ上記の結論に達しました。
大事なことなので、まとめて箇条書きにしてほしいものです…

エックスサーバーはサブドメイン無限+独自ドメイン可というサービスが強力なので、ブログやCMSをたくさん入れて使い倒している人も多いと思います。
サーバー番号によって異なるかもしれませんが、以前からphp.iniを上書きしている人は、くれぐれもご注意ください。

サーバー、移転しようかな… _ノ乙(、ン、)_