php输出进度,显示长时间运行的PHP脚本的进度

本文探讨了如何使用作业架构处理大量数据上传,通过细化为上传、处理和进度更新步骤,并利用WebSocket实现服务器推送,确保任务可靠性及恢复能力。作者分享了Python示例,展示了如何将上传图片、对象识别和SSE整合到高效任务流程中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2ad4be46ca11f593786bfd36029ae688.png

30秒到达战场

如果您的任务是上传大量数据集或在服务器上处理它,同时更新服务器的进度,您应该考虑使用某种类型的作业架构,在那里启动作业并使用其他一些脚本运行服务器(例如缩放/处理图像等)。在这种情况下,您一次只做一件事,从而形成一个任务管道,其中有一个输入和一个最终处理的输出。在管道的每个步骤中,任务的状态在数据库内更新,然后可以通过目前存在的任何服务器推送机制发送给用户。运行一个处理上传和更新的脚本会在您的服务器上加载并限制您(如果浏览器关闭会发生什么,如果发生其他错误会怎样)。当进程分为多个步骤时,您可以从最后成功的位置恢复失败的任务。有很多方法可以做到这一点。但整个流程流程看起来像这样以下方法是我为个人项目所做的,这个脚本适合上传和处理数千个高分辨率图像到我的服务器,然后被缩小为多个版本并上传到amazon s3,同时识别其中的对象。(我的原始代码是在python中)第1步 :启动传输或任务首先上传您的内容,然后通过简单的POST请求立即返回此事务的事务ID或uuid。如果您在任务中执行多个文件或多个操作,则可能还需要在此步骤中处理该逻辑第2步:做好工作并返回进度。一旦弄清楚事务是如何发生的,您就可以使用任何服务器端推送技术来发送更新数据包。我会选择WebSocket或Server Sent Events,以适用于不支持的浏览器上的Long Polling。一个简单的SSE方法看起来像这样。function TrackProgress(upload_id){    var progress = document.getElementById(upload_id);    var source = new EventSource('/status/task/' + upload_id );    source.onmessage = function (event) {        var data = getData(event); // your custom method to get data, i am just using json here        progress.setAttribute('value', data.filesDone );        progress.setAttribute('max', data.filesTotal );        progress.setAttribute('min', 0);    };}request.post("/me/photos",{    files: files}).then(function(data){     return data.upload_id;}).then(TrackProgress);在服务器端,您需要创建一些可以跟踪任务的内容,一个带有job_id的简单Jobs架构和发送到db的进度就足够了。我会把作业调度留给你和路由,但在那之后概念代码(对于最简单的SSE就足够了上面的代码)如下。<?phpheader ('Content-Type: text/event-stream');header('Cache-Control: no-cache');/* Other code to take care of how do you find how many files are left    this is really not required */function sendStatusViaSSE($task_id){    $status = getStatus($task_id);    $json_payload = array('filesDone' => $status.files_done,                          'filesTotal' => $status.files_total);    echo 'data: ' . json_encode( $json_payload ) . '\n\n';    ob_flush();    flush();    // End of the game    if( $status.done ){        die();    }}while( True ){     sendStatusViaSSE( $request.$task_id );     sleep(4);}?>关于SSE的好教程可以在这里找到http://html5doctor.com/server-sent-events/并且您可以阅读有关在此问题上从服务器推送更新的更多信息从服务器推送更新以上是一个概念性的解释,还有其他方法可以实现这一点,但这是解决方案,在我的情况下负责一项相当大的任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值