PHP AJAX,在for循环中实时返回多个值

时间:2017-01-25 20:50:22

标签: php jquery ajax symfony

我有什么:

    foreach ($contacts as $contact) {
        $this->StocklistMailer($contact, $weekOrDay, $data, $content, $itemGroup);
    }

    return new Response('completed', 204);

我想要的是:

    foreach ($contacts as $contact) {
        $this->StocklistMailer($contact, $weekOrDay, $data, $content, $itemGroup);
        return new Response($contact->getEmail, 204);
    }

    return new Response('completed', 204);

它返回到页面上的AJAX调用,我想要完成此操作的原因是因为我希望向其发送电子邮件的实时反馈。

3 个答案:

答案 0 :(得分:0)

您无法从应用程序发送多个回复,整个想法是您只生成一个回复。

但是,您可以在一个回复中提供所需的所有信息。

$emails = [];
foreach ($contacts as $contact) {
    $this->StocklistMailer($contact, $weekOrDay, $data, $content, $itemGroup);
    $emails[] = $contact->getEmail;
}

return new Response(json_encode($emails), 200);

请注意,我将204(无内容)更改为200(确定)。

答案 1 :(得分:0)

你必须把它分成多个电话;

第一次调用将返回您将存储在JavaScript数组中的联系人数组。 (假设您使用Client Side JS / Ajax来调用此php文件)。

然后循环遍历数组并对php进行尽可能多的调用,同时将每个联系人一次传递给php。

当你循环遍历数组时,你可以显示花哨的进度条:)

答案 2 :(得分:0)

你可以这样做,但不是来自Symfony。研究ReactPHP,Ratchet及相关技术。

您可以创建一个websockets服务器,该服务器将在localhost上侦听来自Symfony应用程序的消息,并将使用websockets将它们重定向到浏览器。

cliend将打开与websockets服务器的websocket连接,并将请求发送到您的应用程序。在应用程序正在处理时,它使用本地计算机上的套接字将进度发送到websocket服务器。客户端应该从websocket实时获取进度,并且应该显示它。

通过这种方式,您可以获得实时交互式界面,并且具有长时间运行的过程。

更好的是创建一个rabbitmq worker,即发送电子邮件并将进度报告给websockets服务器。您可以从Symfony应用程序为worker创建任务,因此您不会受到php请求的执行时间限制。与rabbitmq工作者的另一个胜利是你只能拥有一个(或者你喜欢的数量),因此任务将排队,你不会通过50个进程一次生成和发送电子邮件来刻录服务器资源。