2011-11-06 165 views
8

Necesito una configuración PHP cURL para que mi script pueda enviar solicitudes e ignorar las respuestas enviadas por la API.PHP cURL solo requiere enviar y no esperar la respuesta

curl_setopt($ch,CURLOPT_URL,$url); 
curl_setopt($ch,CURLOPT_POST,count($fields)); 
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string); 
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); 
//curl_setopt($ch, CURLOPT_TIMEOUT_MS, 100); 
$result = curl_exec($ch); 
echo $result; 
curl_close ($ch); 

He intentado añadir: // curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, false); // curl_setopt ($ ch, CURLOPT_TIMEOUT_MS, 100);

Pero no funciona correctamente y el servidor web API no recibe las solicitudes.

La razón de esto es que estoy enviando una gran cantidad de solicitudes a la API, por lo tanto, mi script es muy lento porque espera todas y cada una de las solicitudes.

Cualquier ayuda es apreciada.

Respuesta

6

`

public function cccc($test=1) { 
if($test==1) { 
    $url = 'http://examplesite.com/test/cccc/2'; 
    $curl = curl_init();     
    $post['test'] = 'test'; 
    curl_setopt($curl, CURLOPT_URL, $url); 
    curl_setopt ($curl, CURLOPT_POST, TRUE); 
    curl_setopt ($curl, CURLOPT_POSTFIELDS, $post); 

    curl_setopt($curl, CURLOPT_USERAGENT, 'api'); 
    curl_setopt($curl, CURLOPT_TIMEOUT, 1); 
    curl_setopt($curl, CURLOPT_HEADER, 0); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, false); 
    curl_setopt($curl, CURLOPT_FORBID_REUSE, true); 
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 1); 
    curl_setopt($curl, CURLOPT_DNS_CACHE_TIMEOUT, 10); 

    curl_setopt($curl, CURLOPT_FRESH_CONNECT, true); 

    $data = curl_exec($curl); 
    echo $data; 


    curl_close($curl); 
} else { 
    ob_end_clean(); 
    header("Connection: close\r\n"); 
    header("Content-Encoding: none\r\n"); 
    header("Content-Length: 1"); 
    ignore_user_abort(true); 

    sleep(10); 
    $this->db->query('UPDATE new_hook_memory SET new=new+1 WHERE id=1');  

    }} 

// test

`

+20

¿No estás midiendo algún comentario al código? Esto es inútil. –

+1

¡Impresionante, funciona, gracias! –

+0

Esto funciona, pero si configura un tiempo de espera demasiado pequeño (10 milisegundos en mi caso), se interrumpe antes de que la solicitud se envíe por completo. –

0

¿Cómo se puede saber si la solicitud fue exitosa o no? Debe esperar al menos el código de estado del servidor para determinarlo. Si el problema es la latencia, consulte la multi API curl para realizar varias solicitudes en paralelo. Debería poder establecer una función de devolución de llamada de escritura para cancelar la recepción de datos devueltos una vez que se haya devuelto el código de estado.

3

Si es posible se puede ejecutar wget en el fondo (usando exec)

+0

Esto no soluciona el problema. Es equivalente al curl de fondo, y todavía tendrá un proceso esperando la respuesta, consumiendo recursos computacionales. – Bladt

2

Un poco tarde, pero la solución a esto para cualquier persona interesada es que CURLOPT_RETURNTRANSFER debe establecerse en VERDADERO, no falso. De esta forma, la función curl_exec devuelve un valor de forma inmediata en lugar de esperar a que la solicitud se complete antes de volver, es decir, actúa de forma asíncrona en lugar de sincrónica.

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
+2

Reza preguntó algo más – popas

+2

¿Por qué esta respuesta todavía tiene 2 puntos? –

+0

Al establecer CURLOPT_RETURNTRANSFER en true, me aseguré de obtener inmediatamente un valor de retorno en lugar de tener que esperar a que se completara la solicitud. ¿No es eso lo que pidió el OP? – ljelewis

Cuestiones relacionadas