2012-05-06 24 views
7

Después de luchar durante medio día, por fin pude conseguir reCAPTCHA para trabajar mediante la conversión de esta función:¿Qué está bloqueando fsockopen?

function _recaptcha_http_post($host, $path, $data, $port = 80) { 

$req = _recaptcha_qsencode ($data); 

$http_request = "POST $path HTTP/1.0\r\n"; 
$http_request .= "Host: $host\r\n"; 
$http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n"; 
$http_request .= "Content-Length: " . strlen($req) . "\r\n"; 
$http_request .= "User-Agent: reCAPTCHA/PHP\r\n"; 
$http_request .= "\r\n"; 
$http_request .= $req; 

$response = ""; 
if(false == ($fs = @fsockopen($host, $port, $errno, $errstr, 10))) { 
    die ("Could not open socket"); 
} 

fwrite($fs, $http_request); 

while (!feof($fs)) 
    $response .= fgets($fs, 1160); // One TCP-IP packet 
fclose($fs); 
$response = explode("\r\n\r\n", $response, 2); 
return $response; 
} 

a:

function _recaptcha_http_post($host, $path, $data, $port = 80) { 
$req = _recaptcha_qsencode ($data); 
$request = curl_init("http://".$host.$path); 

curl_setopt($request, CURLOPT_USERAGENT, "reCAPTCHA/PHP"); 
curl_setopt($request, CURLOPT_POST, true); 
curl_setopt($request, CURLOPT_POSTFIELDS, $req); 
curl_setopt($request, CURLOPT_RETURNTRANSFER, true); 

$response = curl_exec($request); 
return $response; 
} 

Básicamente, estoy interesado en saber por qué curl trabaja mientras fsockopen falla con "No se pudo abrir el socket". Gracias.

Además: Sockets Support está habilitado.

+0

el operador stfu (@) silencia los errores. Esto hace que sea muy difícil averiguar cuál es el problema. – goat

+0

@chris, el error es "php_network_getaddresses: getaddrinfo failed: Nombre o servicio desconocido". ¿Alguna ayuda? –

+0

Supongo que su valor de $ host es incorrecto. ver la documentación de fsockopen() – goat

Respuesta

0

¿Qué hay en $ errno y $ errstr dentro if (false === ...)? Por lo tanto, lo que hace que la salida si cambia a

if(false == ($fs = @fsockopen($host, $port, $errno, $errstr, 10))) { 
    die ("Could not open socket, error: " . $errstr); 
} 
+0

Dice "php_network_getaddresses: getaddrinfo failed: Nombre o servicio no conocido" –

+0

que hace decir? – Alexey

+0

Está activado. –

0

Woah,

if(false == ($fs = @fsockopen($host, $port, $errno, $errstr, 10))) { 
    die ("Could not open socket"); 
} 

Eso no tiene ningún sentido sin duda. Pruebe:

$fs = fsockopen($host, $port, $errno, $errstr, 10); // @ ignores errors 
if(!$fs) die ("Could not open Socket"); 

También Skype también bloquea el puerto 80 a veces.

+1

tiene sentido. En PHP, el resultado de una tarea es el valor que se le asigna. así que $ fs obtiene el valor de retorno de fsockopen, y luego ese valor también se prueba contra falso. Así es como '$ x = $ y = $ z = 42;' asignaría 42 a las tres variables a la vez. –

+0

omg, ahora también he respondido esta pregunta, pero no sin antes darme cuenta de que usted hizo esta pregunta de 16 meses :) –

0

Googling por su error lleva a preguntarse si su /etc/resolv.conf es legible por PHP. Haz ls -lah /etc/resolv.conf en el bash para ver si es legible. Usted consigue algo como:

myserver:~ myname$ ls -lah /ets/resolv.conf 
lrwxr-xr-x 1 root wheel 20B 16 mrt 2011 /etc/resolv.conf 
    ^if there is an 'r' here it is readable. if you have '-' here, it is not. 

Si no se puede leer, trate de hacer en la fiesta: chmod 644 /etc/resolv.conf para que sea legible.

+0

Sí, ya es legible por Otros. –

1

puedo estar equivocado, pero utilizar $port = 80 en fsockopen() mientras que en cURL caso, esta variable no se utiliza en absoluto. Tuve el mismo problema cuando intenté conectarme al SSL a través de port 80 en lugar del puerto 443; por lo que sé, cURL comprueba SSL de forma predeterminada y se conecta en consecuencia.

Además, intente ejecutar cURL con CURLOPT_VERBOSE para ver lo que hace.

+0

Gracias por la respuesta tardía, pero probé con el puerto 443 en el código anterior. No funciona también. –

Cuestiones relacionadas