読者です 読者をやめる 読者になる 読者になる

女子WEBエンジニアのTechメモ

都内の某企業でマーケッターやってます。営業→WEBエンジニア・オフショア開発チーム駐在→マーケッター(SEO)ちょっと便利だなと思ったことをメモしています。

AdwordsAPI実行時に500Errorになった【エラー対処法】

マーケティングの業務を効率化するために、GoogleのAdwords APIを使って自分用ツールを開発しました。
(申請〜開発の流れは、後日別記事にて書きます。)

今日は、ローカルで動いていたソースコードをAWSのサーバー上にアップしたら500エラーで動かなくなったので、対応したときのことを書きます。

ローカルの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 の概念、活用技法、可能性

SOAP 技術入門 ― Simple Object Access Protocol の概念、活用技法、可能性

  • 作者: ケナード・スクリブナー,マーク・C・スタイバー,スリー・エー・システムズ
  • 出版社/メーカー: ピアソン・エデュケーション
  • 発売日: 2001/06/22
  • メディア: 単行本(ソフトカバー)
  • クリック: 7回
  • この商品を含むブログを見る
Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

REST APIやらSOAPやら、あまり理解できてないところもあるからおさらいしなきゃー。