2011-01-14 68 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); 
    } 
}