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";
}