考虑下图:
思念
>用户可以执行单个文件/批量上传(我知道HTTP规范),批量我的意思是有人在视觉上能够一次发送多个文件.
>图像上传服务旨在为每个发送的文件创建(图像处理器)子进程.
问题
>那么客户端 – 服务器通信的哪种方法最适合从这些子进程发送回客户端的通知?
>创建子进程的最佳方法是什么?我读过有关proc_open,curl方法的内容.我没有得到如何使用消息队列(如果它适用的话).
笔记
用户上传图像.完成此步骤后,您可以创建一个任务. One Taks是数据库中任务表的一行.
原文链接:https://www.f2er.com/php/131771.htmlclass Task { const STATUS_PENDING = 'pending' const STATUS_ERROR = 'error' const STATUS_FINISHED = 'finished' private $userid; private $taskData = array(); public function run() { // create process } public function update() { // update the status an other changes you need to the database // or any other storage you use. } public function getStatus(); } class TaskManager { const MAX_TASKS = 5; private $tasks = array(); public function addTaks(); public function start() { foreach ($tasks as $task) { $task->run(); } } }
在服务器端,您需要考虑如何工作/组织您的任务.这取决于您的需求.借助TaskManager的强大功能,您可以
控制你的过程.这非常重要,不是100个进程并行运行.
客户端现在可以轻松地向用户ID询问任务表以检查待处理任务.如果状态完成或错误,您可以给用户
一个很好的反馈.您可以每五秒轮询一次此信息.间隔取决于您的需要.五秒钟的投票对你来说可能很奇怪
浏览器.一个好主意是客户端将获取状态而不是服务器将状态发送到客户端.如果服务器发送状态非常重要,那么您将使用Web套接字.后端可以是相同的.
这是一个简单的轮询示例.
setInterval(function(){ $.ajax({ url: "server",success: function(data){ //Update your dashboard gauge salesGauge.setValue(data.value); },dataType: "json"}); },30000);
proc_open只有在你有一些高级选项时才有用.具有proc_open的功能(关注管道)并与stream_set_blocking结合使用.
您可以编写异步任务处理.如果你不需要一些特殊的exec就足够了.
这是一个非阻塞的例子.
class Task { private $process = null; private $pipes = array(); private $status = 'pending' public function run() { $descriptor = array ( 0 => array("pipe","r"),1 => array("pipe","w"),2 => array("pipe","w") ); $cmd = "/path/to/progam --with --some-arguments" $this->process = proc_open($command,$descriptor,$this->pipes); stream_set_blocking($this->pipes[1],0); } public function close() { foreach($this->pipes as $pipe) { fclose($pipe); } $exitStatus = proc_close($this->process); $this->process = NULL; return $exitStatus; } }
我希望这会给你一些解决问题的灵感.
对于真正的消息队列,您可以使用您想要的.我是http://kr.github.io/beanstalkd/的粉丝我现在停止提供解决方案和想法,因为这个问题更复杂,我可以再写100页.如果你有konkrete问题,你可以放弃一条线.