我正在尝试通过php创建一个异步请求,这将允许我检查状态(完成或仍在运行),请求大约需要6-20分钟才能完成。 我需要代码与系统无关并维护请求头代理ID(因为这用于验证我的用户),所以我想我可以对this问题的第二个答案做一些事情。
问题是我没有看到与服务器通信的方式,以便在请求被触发后验证操作是否已完成。有一些简单的方法来做到这一点? (我无法预测事件的影响,因为它可能会或可能不会改变值)
答案 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);
}
}