2010-07-12 24 views
5

¿Cómo puedo aliviar el error "No se pudo abrir el socket" que está sucediendo en mi sitio?"No se pudo abrir el socket"

Tengo problemas que es CAPTCHA (estoy usando reCAPTCHA). Solo muestra este error en las dos páginas donde uso reCAPTCHA.

He estado generando nuevos juegos de llaves, y algunas veces funciona y otras no. Por ejemplo, funcionó en Safari y, a veces, no, pero en Firefox, y viceversa, y funcionó para mí y no para uno de mis socios y viceversa.

¿Cómo puedo solucionar este problema? ¿Podría ser que mi servidor tenga problemas para ejecutar el comando fsocketopen? Si es así, ¿cómo lo arreglo?

+5

su pregunta es muy vago: ¿puedes publicar algunos ejemplos de código/decirnos si estás usando un servicio de terceros como recaptcha? –

+0

ha sido editado @Kieran Allen – LightningWrist

Respuesta

7

¿Podría ser que mi servidor tenga problemas para ejecutar el comando fsocketopen?

Exactamente, aunque no necesariamente significa que algo no funciona en su servidor. Simplemente significa que en algún lugar entre su servidor y el servidor recaptcha, hay un problema de comunicaciones de red que impide que la conexión de socket se abra.

Esto podría ser un montón de cosas. Podría ser un problema de configuración con su código o en su servidor, (especialmente si hay algún aspecto de la configuración en su servidor que sea dinámico), podría ser un problema con el nivel de conectividad que tiene su servidor, podría ser una configuración de red problema donde se aloja su servidor, podría ser un problema de configuración de red entre su servidor y el servidor recaptcha, podría ser un problema de ancho de banda donde están alojados, podría ser un problema de configuración de su parte. Es posible que desee utilizar los argumentos adicionales de informes de errores al fsockopen para ver si puede obtener algún mensaje que tenga sentido. También puede probar su configuración en al menos 2-3 servidores diferentes en redes totalmente diferentes, eso también podría darle una indicación algo específica sobre dónde está el problema.

La otra pregunta, sin embargo, es cómo vas a manejar este tipo de cosas en general. fsockopen a veces falla al obtener una conexión, porque incluso en el mejor entorno de red configurado, no hay garantía de comunicación. El hardware falla, ocurren accidentes, los administradores de redes tienen momentos con los dedos gordos, los servidores remotos se confunden, la guerra termonuclear global puede acabar con un centro de datos, nunca se sabe. Por lo tanto, debe escribir su código (y administrar su configuración), de modo que tenga casos pendientes para cuando ocurra una falla y muestre mensajes de error que sean aceptables para el usuario final.

Es posible que desee examinar la función set_error_handler de PHP y configurar una función para llamar en las ocurrencias donde fsockopen falla. En algunas situaciones, me he convertido en aficionado a usarlo para activar excepciones, algo como esto:

function throw_error_exception($number = 0, $str = '',$file = null,$line = null) { 
    throw new ErrorException($str, 0, $number, $file, $line); 
} 

set_error_handler('throw_error_exception',E_ALL); 

Con esa configuración, se puede administrar conexiones fsockopen algo como esto:

try { 
    fsockopen('remote.host.com',8080,$fso_errnum,$fso_errstr,30); 
} catch(Exception $e) { 
    // here you can look at properties/methods of $e, and $fso_* values, and 
    // figure out what nice error messages you want to display for your users 
} 
+1

¡excelente respuesta! Gracias por pasar el tiempo! – LightningWrist

+1

En la cláusula try, "fsocketopen" debería ser "fsockopen" – edt

Cuestiones relacionadas