マーケティングの業務を効率化するために、GoogleのAdwords APIを使って自分用ツールを開発しました。
(申請〜開発の流れは、後日別記事にて書きます。)
今日は、ローカルで動いていたソースコードをAWSのサーバー上にアップしたら500エラーで動かなくなったので、対応したときのことを書きます。
- ローカルのMAMP環境では動くのに、サーバー上では動かない
- 500Errorになったときに確認すること
- Use of undefined constant WSDL_CACHE_NONE
- SOAPのモジュールが入っているか確認する
- PHPにSOAPをインストールする
- 再度Adwords APIを実行・・・するもUse of undefined constant WSDL_CACHE_NONE
- php.iniでSOAP通信時にキャッシュを無効にする
- ファイルのpermissionを適切なものに直す
ローカルのMAMP環境では動くのに、サーバー上では動かない
Adwords APIを利用したプログラムのファイルをサーバーにアップロードして、
ドキュメントルートを設定して、apache再起動して・・・。
いざアクセスすると、ページが真っ白に。
なんで?と思ってデバッグツールで見てみると、500エラーになっていました。
500Errorになったときに確認すること
まず、エラーの原因を把握しないと対処できません。
というわけで、実行しているファイルの最初に、下記を追記しました。
ini_set("display_errors", On); error_reporting(E_ALL);
エラーの時にエラー内容を表示する、という記述です。
これでブラウザを再読み込みすると、・・・原因がわかりました!
Use of undefined constant WSDL_CACHE_NONE
表示されたエラーはこちら。
PHP Notice: Use of undefined constant WSDL_CACHE_NONE - assumed 'WSDL_CACHE_NONE' in /var/www/html/api/app/AdsUser.php on line 120 Notice: Use of undefined constant WSDL_CACHE_NONE - assumed 'WSDL_CACHE_NONE' in /var/www/html/api/app/AdsUser.php on line 120
「WSDL_CACHE_NONEって定義されてない定数なんだけど!なんやこれ!」という感じのようです。
ちょっと調べてみると、SOAPのモジュールが入ってない時に見かけられるエラーだそう。
SOAPのモジュールが入っているか確認する
いきなりインストールする前に、ちゃんとmoduleが入っているかどうか確認しましょう。
Linux系サーバーで、SOAPのmoduleが入っているか確認する
yum search php | grep -i soap
Ubuntuで、SOAPのmoduleが入っているか確認する
apt-cache search php | grep -i soap
結果、わたしのサーバー上のPHPではmoduleが入っていないようなので、インストールをします。
※moduleが入っていると、下記のようなものが返ってきます。
php-soap.x86_64 : A module for PHP applications that use the SOAP protocol php54-soap.x86_64 : A module for PHP applications that use the SOAP protocol php55-soap.x86_64 : A module for PHP applications that use the SOAP protocol php56-soap.x86_64 : A module for PHP applications that use the SOAP protocol php70-soap.x86_64 : A module for PHP applications that use the SOAP protocol php-ZendFramework-Soap.noarch : SOAP web services server part helper
PHPにSOAPをインストールする
Linux系サーバーで、SOAPのmoduleをインストールする
sudo yum install php-soap
Ubuntuで、SOAPのmoduleをインストールする
apt-get install php-soap
再度Adwords APIを実行・・・するもUse of undefined constant WSDL_CACHE_NONE
SOAPのmoduleがインストールし終わったので、再度Adwords APIのプログラムを実行してみます。・・・が、まだこのエラーが表示されています。
PHP Notice: Use of undefined constant WSDL_CACHE_NONE - assumed 'WSDL_CACHE_NONE' in /var/www/html/api/app/AdsUser.php on line 120 Notice: Use of undefined constant WSDL_CACHE_NONE - assumed 'WSDL_CACHE_NONE' in /var/www/html/api/app/AdsUser.php on line 120
うーん。
調べたところ、SOAP通信では、キャッシュが有効になっているとデータが取得できないケースがあるらしい。
php.iniで(もしくは、SOAPを利用するプログラム単体で)キャッシュを無効にするように設定変更をする必要があるようです。
今回の場合、他のプログラムでキャッシュを利用する、ということがないので php.ini でキャッシュを無効にします。
php.iniでSOAP通信時にキャッシュを無効にする
※php.iniの場所がわからない人は、適当な場所でphpinfo();
を実行して php.ini の場所を確認しましょう。
ちなみに私は /etc/php.ini
でした。
下記の記述の部分を、
[soap] ; Enables or disables WSDL caching feature. ; http://www.php.net/manual/en/soap.configuration.php#ini.soap.wsdl-cache-enabled soap.wsdl_cache_enabled=1
このように、1行コメントアウトして、1行追記します。
[soap] ; Enables or disables WSDL caching feature. ; http://www.php.net/manual/en/soap.configuration.php#ini.soap.wsdl-cache-enabled ;soap.wsdl_cache_enabled=1 soap.wsdl_cache=0
ファイルのpermissionを適切なものに直す
再度Adwords APIのプログラムを実行すると、ログ系のファイルでpermission deniedとなるので、エラーになっているファイルのpermissionを変更します。
ファイルの性質に合わせて、755, 777などに変更しましょう。
今回はこれで解決できました!
Adwords APIの便利さなどはまた別の機会にご紹介します!

SOAP 技術入門 ― Simple Object Access Protocol の概念、活用技法、可能性
- 作者:ケナード・スクリブナー,マーク・C・スタイバー
- 発売日: 2001/06/22
- メディア: 単行本(ソフトカバー)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)
- 作者:山本 陽平
- 発売日: 2010/04/08
- メディア: 単行本(ソフトカバー)
REST APIやらSOAPやら、あまり理解できてないところもあるからおさらいしなきゃー。