php打开异步请求并允许客户端检查请求是否已完成

时间:2011-01-14 06:06:02

标签: php asynchronous

我正在尝试通过php创建一个异步请求,这将允许我检查状态(完成或仍在运行),请求大约需要6-20分钟才能完成。 我需要代码与系统无关并维护请求头代理ID(因为这用于验证我的用户),所以我想我可以对this问题的第二个答案做一些事情。

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

1 个答案:

答案 0 :(得分:0)

所以ChristianDavé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);
    }
}