2011-01-14 115 views
0

我试图通过php创建一个异步请求,这将允许我检查状态(完成或仍在运行),请求将花费大约6 -20分钟即可完成。 我需要的代码是系统无关的,并维护请求标头代理ID(因为这用于验证我的用户),所以我想我可以按照this问题的第二个答案的方式做一些事情。php打开一个异步请求,并允许客户端检查请求是否已完成

问题是,我没有看到与服务器进行通信的方式,以验证在请求被触发后操作已完成。有没有一些简单的方法来做到这一点? (我无法预测事件的影响,又名值可能会或可能不会因为它而改变)

回答

0

所以基督教Davénpost上this页激发了我解决我自己的问题,就是如下:

if(array_key_exists('async', $_GET)){ 
    //short-task spawns the child(fakeLongTask()) 
    testing::curl_request_async(); 
}else{ 
    //short task, aka child task 
    testing::fakeLongTask(); 
} 

class testing{ 
    /** 
    * asynch trigger a event(parent/short Task) 
    */ 
    public static function curl_request_async(){ 
     //set file path to a unique file name for you...maybe consider using tmp type functionality 
      $file = 'C:\\filepath\\logFile.txt'; 
     $fp = curl_init('http://localhost/testing.php?file='.$file); 
      //send the request off 
     curl_exec($fp); 
      //because I am not sure that the socket is closed when it interperets the header, and because its a best practice 
     curl_close($fp); 

     while(file_exists($file)){ 
      echo 'we are waiting because the process is still going and the lock is still imposed.<br />'.PHP_EOL; 
      sleep(3); 
     } 
    } 

    /** 
    * this is to mimic a long task that we might be running. 
    * basic setup is clear the buffer, set the raw header to the close value to let the browser 
    * know that the request has 'finished' so it can return to the calling function after the output is sent. 
    * specify the size of the information being sent as this is required for the header. Then send the buffer and start 
    * processing asynchronously 
    * 
    * child/long/orphaned Task 
    */ 
    public static function fakeLongTask(){ 
     //clear the buffer 
     while(ob_get_level()){ 
      ob_end_clean(); 
     } 
     //specify that this is a non-persistant connection 
     header('Connection: close'); 
     //if the user kills the script ignore there request and keep on, nice feature to avoid early termination 
     ignore_user_abort(true); 
     ob_start(); 
     //if you need to send any information to the user specify that here 
     $size = ob_get_length(); 
     header("Content-Length: $size"); 
     //since flush might not get everything we must do a 'power flush' 
     ob_end_flush(); 
     flush(); 
     //from this point on the original function that had the curl op in it will continue and this will also continue on asynchronously 
     //create the new file(this is our only way to communicate to the parent script as this function is now running rouge. 
     $file = $_GET['file']; 
     $fileHandle = fopen($file, 'w') or die(''); 
     fclose($fileHandle); 
     //now that we have our file lets do our process, or in this case just stall for 10 seconds 
     sleep(10); 
     //we are done with our task delete the file 
     unlink($file); 
    } 
}