CakePHPでOAuthを使うのに、このライブラリが有名だと思います。
MITライセンスなのが良いですよね。
ところが、これを使ったCakePHPのシステムで、debug=2の時は動くのに、debug=0にすると動かないという謎の問題に出くわしました。
止まる場所は、認証ページへのリダイレクトに使う、
$consumer->getRequestToken('http://twitter.com/oauth/request_token', $callback);
のあたりです。
ソースを追ってみたところ、OAuth.phpの以下の場所で止まっていました。
public function get_normalized_http_url() { $parts = parse_url($this->http_url); $port = @$parts['port']; // ←ここ!! $scheme = $parts['scheme']; $host = $parts['host']; $path = @$parts['path']; $port or $port = ($scheme == 'https') ? '443' : '80'; if (($scheme == 'https' && $port != '443') || ($scheme == 'http' && $port != '80')) { $host = "$host:$port"; } return "$scheme://$host$path"; }
いや、確かに、portというキーは無かったんですけど、
そのための@演算子だし、そもそもこんなのでFatal Errorになるはずもなく。
要するに、PHPエンジンの方のバグなのか、謎ですね・・・
解決策は以下。
public function get_normalized_http_url() { $parts = parse_url($this->http_url); //== add this == if (!array_key_exists('port', $parts)) { $parts['port'] = (isset($parts['scheme']) && $parts['scheme'] == 'https') ? '443' : '80'; } //== add this == $port = @$parts['port']; $scheme = $parts['scheme']; $host = $parts['host']; $path = @$parts['path']; $port or $port = ($scheme == 'https') ? '443' : '80'; if (($scheme == 'https' && $port != '443') || ($scheme == 'http' && $port != '80')) { $host = "$host:$port"; } return "$scheme://$host$path"; }