発端
ご依頼の案件で既存システムをさくら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では厳密になり、動かなくなることがあります。
そんな時は落ち着いてログを確認&対処すれば、解決できます!