PHP cURL required only to send and not wait for response

前端 未结 6 1860
被撕碎了的回忆
被撕碎了的回忆 2020-12-09 09:11

I need a PHP cURL configuration so that my script is able to send requests and ignore the answers sent by the API.

curl_setopt($ch,CURLOPT_URL,$url);
curl_se         


        
相关标签:
6条回答
  • 2020-12-09 09:33

    How can you tell if the request succeeded or not? You need to wait for at least the status code from the server to determine that. If latency is the issue, look at the curl multi API to perform multiple requests in parallel. You should be able to set a write callback function to abort reception of returned data once the status code has been returned.

    0 讨论(0)
  • 2020-12-09 09:35

    If possible you can run wget in background (using exec)

    0 讨论(0)
  • 2020-12-09 09:36

    These two solutions work well for me

    ( Of course it has been a long time, but I don't think this question is outdated )

    using file_get_contents:

      //url of php to be called
    
    $url = "example.php/test?id=1";
    
      //this will set the minimum time to wait before proceed to the next line to 1 second
    
    $ctx = stream_context_create(['http'=> ['timeout' => 1]]);
    
    file_get_contents($url,null,$ctx);
    
      //the php will read this after 1 second 
    

    using cURL:

      //url of php to be called
    
    $url = "example.php/test?id=1";
    
    $test = curl_init();
    
      //this will set the minimum time to wait before proceed to the next line to 100 milliseconds
    
    curl_setopt_array($test,[CURLOPT_URL=>$url,CURLOPT_TIMEOUT_MS=>100,CURLOPT_RETURNTRANSFER=>TRUE]);
    
    curl_exec($test);
    
      //this line will be executed after 100 milliseconds
    
    curl_close ($test); 
    

    in both case the called php must set ignore_user_abort(true).

    And the result will not be printed in both case, but be careful with the timeout you will set, it needs to be greater than the time that the called php needs to start yielding results.

    0 讨论(0)
  • 2020-12-09 09:37
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT_MS, 1);
    curl_exec($ch);
    curl_close($ch);
    

    That works well for me.
    Tested on PHP 7.1.14 Windows

    0 讨论(0)
  • 2020-12-09 09:41

    Sender file example ./ajax/sender.php

    Below we trying just make ping to php script without waiting on answer

        $url = 'https://127.0.0.1/ajax/received.php';
        $curl = curl_init();                
        $post['test'] = 'examples daata'; // our data todo in received
        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);
    
        curl_exec($curl);   
    
        curl_close($curl);  
    

    Received file example ./ajax/received.php

    EDIT 2019 if you using fastcgi just finish fastcgi and browser close connection but script still will be working up to end.

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

    Old version:

    ob_end_clean(); //if our framework have turn on ob_start() we don't need bufering respond up to this script will be finish 
        header("Connection: close\r\n"); //send information to curl is close
        header("Content-Encoding: none\r\n"); //extra information 
        header("Content-Length: 1"); //extra information
        ignore_user_abort(true); //script will be exisits up to finish below query even web browser will be close before sender get respond
    
        //we doing here what we would like do
        $this->db->query('UPDATE new_hook_memory SET new=new+1 WHERE id=1');    
    
    0 讨论(0)
  • 2020-12-09 09:41

    A bit late now but the solution to this for anyone interested is that CURLOPT_RETURNTRANSFER needs to be set to TRUE, not false. That way the curl_exec function returns a value immediately rather than waiting for the request to complete before returning - i.e. it acts asynchronously rather than synchronously.

    Example:

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    0 讨论(0)
提交回复
热议问题