« 昼食後の(猛烈な)眠気は低血... Main Firefox上でのYouTube不調 »

WordPressが更新できない

WordPressの4.3.1の更新指示が出ていたので、自動更新しようとしてもエラーで更新できない(「ダウンロードに失敗しました。: 要求されたリクエストを完了できる HTTP トランスポートがありません。」と出る)。
20150926155017

どうも、php側からcurlを使っての更新に失敗しているもよう。

―と思ったら、システムのphp自体が更新されていたのだが、「–with-curl」のオプション付きでコンパイルされていなかった。それならばと、このオプションを有効にしようとするとコンパイル自体は成功するのだが、Apacheに組み込んだ際に他のライブラリだかと衝突するのか、httpdサーバが動作を停止してしまう。

Apacheがだいぶ古くなってしまっているが、こちらのバージョンも上げればいいのかな。

とりあえず、WoredPressは手動更新するか…。

前までは自動更新できていたが、WordPress側がcurlを使っていなかったか、以前にインストールされていたphpがcurl付きでもhttpdが正常動作していたか、どちらかか?

[以下、補記]
WordPressの自動更新箇所(というか、httpでのデータ取得箇所は以下)

上記のエラーメッセージ自体(の原語)はwp-includes/class-http.phpにある:

return new WP_Error( 'http_failure', 
  __( 'There are no HTTP transports available which can complete the requested request.' ) );

class-http.phpの内部メソッドの_dispatch_request()を経由して_get_first_available_transport()でWordPressのzipファイルにアクセスしているらしいんだが、このURLにcurlコマンドでアクセスしてみるとhttpsの場合はアルゴリズムエラーと出るし、httpの場合は「301 Moved Permanently」と出て、どちらもダウンロードできない。

_get_first_available_transport()でトランスポートに使われる$request_orderを見てみるとarray(2) { [0]=> string(4) “curl” [1]=>string(7) “streams” } となっていて、どちらでも失敗している模様。この値を使って ‘WP_HTTP_’ + ‘curl’クラスなどのtest()メソッドが呼ばれてテストされるらしい。

このクラス自体は同じclass-http.php内のWP_Http_Curlとして定義されている(関数名のキャピタライズは不一致だが大丈夫?)。test()メソッドの呼び出しは行なわれていて、そのメソッド内でfunction_exists(‘curl_init’)とfunction_exists(‘curl_exec’)がチェックされているが、どちらもfalseでエラーになっていた。

Leave a comment

Your comment