Schlagwort-Archive: Plugin

WordPress Fehler: Connection timed out

Jedes Mal wenn ich bei einer lokalen WordPress Installation das Dashboard aufrief, dauerte dies mehrere Sekunden und es erschien die Fehlermeldung WP HTTP Error: Resolving timed out after 3512 milliseconds. Nach einigem Suchen habe ich die betreffende Stelle in der wp-includes/class-http.php gefunden, die diesen Fehler ausgegeben hat.

Im nächsten Schritt habe ich dann mittels curl_getinfo( $handle ); das Ziel der Anfrage herausgefunden, https://api.wordpress.org/plugins/update-check/1.1/. Nach einigem herumprobieren habe ich versucht die selbe Abfrage im Terminal durchzuführen, also curl -vv --connect-timeout 3 https://api.wordpress.org/plugins/update-check/1.1/. Und siehe da, auch hier reichen 3s (wie von WordPress vorgegeben) nicht aus.

Durch eine Google Suche stieß ich auf eine cURL-Mailingliste wo unter anderem IPv6 als mögliche Ursache genannt wird. Also nochmal die cURL-Doku gewälzt und die Option --ipv4 gefunden. Mit dieser lässt sich die Abfrage problemlos ausführen. Die Ursache für den Fehler war, dass cURL jeweils 15s lang versucht hat per DNS über IPv6 den Hostnamen aufzulösen, was mangels funktionierendem IPv6 am Telekomiker Anschluss nicht ging. Bis cURL auf IPv4 zurückgefallen war, war das von WordPress definierte Timeout (3 Sekunden) abgelaufen.

Ein auf die schnelle eingefügtes curl_setopt( $handle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 ); in die class-http.php löste den Fehler auch in WordPress. Da Core-Dateien zu verändern immer schlecht ist (Updates und so) gibt es praktischerweise vor der Ausführung des HTTP-Request einen Hook, mit dem sich das $handle manipulieren lässt. Daraus ergibt sich dieses (MU-)Plugin:

<?php
/**
 * curl-no-ipv6.php
 *
 * @package curl-no-ipv6
 * @version 1.0
 * @since 1.0
 */
/*
Plugin Name: cURL no IPv6
Plugin URI: https:
Description: On systems where cURL is compiled with IPv6, Requests to Wordpress Update API will timeout since cURL tries it about 15s. Since the timeout defined by WordPress is 3s/5s/10s this will breake the Updater. This Plugin simply forces cURL to use IPv4 only.
Author: GOLDERWEB – Jonathan Golder
Version: 1.0
Author URI: http://golderweb.de/
*/
/*
 * Copyright 2014 GOLDERWEB – Jonathan Golder <jonathan@golderweb.de>
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301, USA.
 * 
 * 
 */

// Safety first
defined( 'ABSPATH' ) OR	die();

/**
 * Sets CURLOPT_IPRESOLVE to CURL_IPRESOLVE_V4 for cURL-Handle provided as parameter
 * 
 * @param resource $handle A cURL handle returned by curl_init()
 * @return resource $handle A cURL handle returned by curl_init() with CURLOPT_IPRESOLVE set to CURL_IPRESOLVE_V4
 * 
 */
function gw_curl_setopt_ipresolve( $handle ){	
	curl_setopt( $handle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
	return $handle;
}
// Add function to hook 'http_api_curl' with priority 10 and expecting 1 parameter. 
if( function_exists( 'gw_curl_setopt_ipresolve' ) ){
	add_action( 'http_api_curl', 'gw_curl_setopt_ipresolve', 10, 1);
}