使用php快速发送大量API请求?

时间:2013-07-18 17:42:03

标签: php curl curl-multi

我希望尽快做出一堆REST api调用。我目前有大约1,000个请求。

任何处理或类似的事情都不需要这些调用的结果。我只是需要将所有这些内容发布到api url。

我当然在我的循环中尝试过很慢。我也尝试过使用curl_multi_exec,但速度差不多。这是代码。

foreach($users as $user){
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_USERAGENT, 'Mandrill-PHP/1.0.36');
                curl_setopt($ch, CURLOPT_POST, true);
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
                curl_setopt($ch, CURLOPT_HEADER, false);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
                curl_setopt($ch, CURLOPT_TIMEOUT, 600);
                curl_setopt($ch, CURLOPT_URL, 'https://mandrillapp.com/api/1.0/messages/send.json');
                curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
                curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
                curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($mandril_message));

                curl_multi_add_handle($mh,$ch);
}
        $active = null;
        //execute the handles
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);

        while ($active && $mrc == CURLM_OK) {
            if (curl_multi_select($mh) != -1) {
            do {
                $mrc = curl_multi_exec($mh, $active);
            } while ($mrc == CURLM_CALL_MULTI_PERFORM);
            }
        }

有关如何快速完成此任务的任何想法。我的代码的其余部分只需要一秒钟左右即可完成,而不需要卷曲代码。

2 个答案:

答案 0 :(得分:2)

好的,所以我终于找到了一些时间来使用mandril api正常工作。我从大约2000 api请求到1.处理时间从10分钟到6.8秒。

所以基本上你只需要确保你在那里使用合并变量并为每组合并变量指定一个收件人。

以下是如何执行此操作的示例。

"to": [
        {
            "email": "recipient1.email@example.com"
        },
        {
            "email": "recipient2.email@example.com"
        }
    ],
"merge_vars": [
        {
            "rcpt": "recipient1.email@example.com",
            "vars": [
                {
                    "name": "FNAME",
                    "content": "John"
                },
                {
                    "name": "FEED",
                    "content": "Your personalized feed content here"
                }
            ],
            "rcpt": "recipient2.email@example.com",
            "vars": [
                {
                    "name": "FNAME",
                    "content": "Jane"
                },
                {
                    "name": "FEED",
                    "content": "Your personalized feed content here"
                }
            ]
        }
    ]

答案 1 :(得分:0)

一千个REST请求将变慢。这里的技巧是异步运行作业,以便用户不受影响。你可以向有问题的PHP脚本发送一个AJAX请求,并增强PHP脚本以在某处写入进度数据($ _SESSION,平面文件,数据库,等等。)然后你可以发送单独的AJAX调用来获取作业的进度并显示作业运行时对用户的更新。

这是假设这是我们在这里讨论的网页,而不是shell脚本。