2012-05-06 10 views
7

Dopo aver lottato per una mezza giornata, finalmente riesco a ottenere reCAPTCHA al lavoro convertendo questa funzione:Che cosa sta bloccando 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; 
} 

Fondamentalmente, io sono interessato a scoprire perché curl lavori mentre fsockopen non riesce con "Impossibile aprire il socket". Grazie.

Inoltre: Supporto socket abilitato.

+0

l'operatore stfu (@) errori di silenzio. Ciò rende molto difficile scoprire quale sia il problema. – goat

+0

@chris, l'errore è "php_network_getaddresses: getaddrinfo non riuscito: nome o servizio sconosciuto". Qualsiasi aiuto? –

+0

la mia ipotesi sarebbe il tuo valore di $ host non è corretto. vedere la documentazione per fsockopen() – goat

risposta

0

Cosa c'è in $ errno e $ errstr dentro se (falso === ...)? Allora, che cosa lo fa in uscita se si passa ad

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

Dice "php_network_getaddresses: getaddrinfo non riuscito: nome o servizio sconosciuto" –

+0

cosa fa dire? – Alexey

+0

È impostato su on. –

0

Woah,

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

Ciò non ha alcun senso sicuramente. Prova:

Anche Skype blocca anche la porta 80 a volte.

+1

ha senso. In PHP, il risultato di un incarico è il valore assegnato. quindi $ fs ottiene il valore di ritorno di fsockopen, e quindi quel valore è anche testato contro il falso. Ecco come '$ x = $ y = $ z = 42;' assegnerebbe 42 a tutte e tre le variabili contemporaneamente. –

+0

omg, ora ho anche risposto a questa domanda, ma non prima di rendermi conto di aver sollevato questa domanda di 16 mesi :) –

0

Googling per il tuo errore porta a chiedersi se il tuo /etc/resolv.conf sia leggibile da PHP. Fare ls -lah /etc/resolv.conf nella bash per vedere se è leggibile. Otterrete qualcosa di simile:

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. 

Se non è leggibile, prova a fare in bash: chmod 644 /etc/resolv.conf per renderlo leggibile.

+0

Sì, è già leggibile da Altri. –

1

Potrei sbagliarmi, ma utilizzare $port = 80 in fsockopen() mentre in cURL caso questa variabile non è utilizzato a tutti. Ho avuto lo stesso problema quando ho provato a connettermi a SSL tramite port 80 invece della porta 443; per quanto ne so, cURL controlla SSL per impostazione predefinita e si collega di conseguenza.

Inoltre, provare a eseguire cURL con CURLOPT_VERBOSE per vedere cosa fa.

+0

Grazie per la risposta in ritardo, ma ho provato con la porta 443 sul vecchio codice. Non funziona anche –