Amazon MWS

Amazon MWS APIをPHP7環境へ移植したら動かなくなった話

発端

ご依頼の案件で既存システムをさくらVPSへ移植することがありました。

元のサーバーはPHP5.5でAmazon MWS APIを利用していたのですが、さくらVPSへ移動してからはなぜか動作しない…

確認したこと

地道にログを取りつつ進めると、あるファイルを開くと落ちることがわかってきました。

        require_once(dirname(__FILE__) . '/Model/ResponseHeaderMetadata.php');
        return new MarketplaceWebServiceProducts_Model_ResponseHeaderMetadata(
          $headers['x-mws-request-id'],
          $headers['x-mws-response-context'],
          $headers['x-mws-timestamp'],
          $headers['x-mws-quota-max'],
          $headers['x-mws-quota-remaining'],
          $headers['x-mws-quota-resetsOn']);

このコードのrequire_onceを実行した段階で落ちるんです。
旧サーバーで動いていたのに開いただけで落ちるなんてあるのかな?

ここにたどり着くまでに3日ほど要してしまった…

PHP出力を確認

もともとバックグラウンドで動かしていたこともあり、標準出力と標準エラーは取り出していませんでした。

exec('nohup php '.$command . ' >/dev/null 2>&1 &'); // バックグラウンドで実行

こちらを

	$logpath = dirname(__FILE__)."/log/result.txt";
	exec('nohup php '.$command . ' >'.$logpath.' 2>&1 &'); // バックグラウンドで実行

こっちに修正して出力を取るように変更。
さて、再実行してどうなるやら。

内部で起きている事

得られた出力ファイルには

Fatal error: Redefinition of parameter $quotaMax

Redefinition って再定義ってことですよね…なんのことでしょうか?

はてさて、ググってみると…ありました。
https://stackoverflow.com/questions/38003895/redefinition-of-parameter-quotamax-error-when-using-mws-to-get-product-informat
さすが先人の知恵は偉大です。

元のファイルはこうなっていますが、

class MarketplaceWebServiceProducts_Model_ResponseHeaderMetadata {

  const REQUEST_ID = 'x-mws-request-id';
  const RESPONSE_CONTEXT = 'x-mws-response-context';
  const TIMESTAMP = 'x-mws-timestamp';
  const QUOTA_MAX = 'x-mws-quota-max';
  const QUOTA_REMAINING = 'x-mws-quota-remaining';
  const QUOTA_RESETS_AT = 'x-mws-quota-resetsOn';

  private $metadata = array();

  public function __construct($requestId = null, $responseContext = null, $timestamp = null,
                              $quotaMax = null, $quotaMax = null, $quotaResetsAt = null) {
    $this->metadata[self::REQUEST_ID] = $requestId;
    $this->metadata[self::RESPONSE_CONTEXT] = $responseContext;
    $this->metadata[self::TIMESTAMP] = $timestamp;
    $this->metadata[self::QUOTA_MAX] = $quotaMax;
    $this->metadata[self::QUOTA_REMAINING] = $quotaMax;
    $this->metadata[self::QUOTA_RESETS_AT] = $quotaResetsAt;
  }

こちらに修正する必要があります。

class MarketplaceWebServiceProducts_Model_ResponseHeaderMetadata {

  const REQUEST_ID = 'x-mws-request-id';
  const RESPONSE_CONTEXT = 'x-mws-response-context';
  const TIMESTAMP = 'x-mws-timestamp';
  const QUOTA_MAX = 'x-mws-quota-max';
  const QUOTA_REMAINING = 'x-mws-quota-remaining';
  const QUOTA_RESETS_AT = 'x-mws-quota-resetsOn';

  private $metadata = array();

  public function __construct($requestId = null, $responseContext = null, $timestamp = null,
                              $quotaMax = null, $quotaMaxRmaining= null, $quotaResetsAt = null) {
    $this->metadata[self::REQUEST_ID] = $requestId;
    $this->metadata[self::RESPONSE_CONTEXT] = $responseContext;
    $this->metadata[self::TIMESTAMP] = $timestamp;
    $this->metadata[self::QUOTA_MAX] = $quotaMax;
    $this->metadata[self::QUOTA_REMAINING] = $quotaMaxRmaining;
    $this->metadata[self::QUOTA_RESETS_AT] = $quotaResetsAt;
  }

パッと見てわからないですよね。
32行目の引数が修正前だと同じ名称が続いているんです。

そりゃ、再定義してるよ!って怒られますよねorz

まとめ

修正後は元気!?にシステムが稼働し始めました。

PHP5系では曖昧だった個所もPHP7では厳密になり、動かなくなることがあります。

そんな時は落ち着いてログを確認&対処すれば、解決できます!

ABOUT ME
Nozomu.Kon
トータルソフトウェアコーディネーターがあなたのお困りを即時に解決!