如何用php有效地发送大量的get请求

时间:2018-04-06 10:54:24

标签: javascript php get request file-get-contents

我正在开展一个项目,我必须开发一个基于 PHP 的简单网络模块,用户(管理员)可以发送短信(跟进广告和其他需要的学生。

SMS API 非常简单,我只需要将 GET请求发送到跨域域以及电话号码,信息。 我用file_get_contents("sms_api_url?credentials");进行了测试,效果很好。

让我担心的是,短信将被发送到 TONS of numbers ,因此我必须使用循环多次发送请求,这将花费大量时间,我认为将是资源消耗过多。 此外,PHP的最长执行时间设置为30秒,我不想更改。

我想使用客户端 JavaScript 来循环发送交叉来源请求,这样它就不会影响我的服务器,但这不会是安全的,因为它会显示 API凭据

我应该使用什么技术来实现目标?并有效地发送大量的获取请求?

3 个答案:

答案 0 :(得分:2)

您没有告诉我们您需要处理的实际数量,处理/连接时间的指标以及实施的限制因素。

目前看来方式太宽泛而无法回答。但您可能会考虑的一些方法是:

1)运行concurrent requests - 但请注意,就像域分片一样,如果过度使用会破坏您的带宽

2)您可以让PHP脚本无限期地外部运行Web服务器(使用CLI SAPI),这些脚本可以是launched from a web session

  

我认为使用客户端JavaScript在循环中发送交叉源请求,这样它就不会影响我的服务器,但这不会是安全的,因为它会泄露API凭据。

如果您直接发送到端点,那么是的,您需要浏览器中的凭据。但是,如果您实现了一个代理脚本,该代码脚本会在您的Web服务器上注入凭据,那么您可以使用浏览器中的自己的凭据。

使用cron具有certian优势 - 但你真的不想从crond产生任务发送一条短信 - 它需要分批运行,你需要管理并发。

您可能需要考虑切换到可以提供批量处理的其他聚合器。

无论如何,您都需要一种方法来存储消息/电话号码以及围绕检索处理的锁定机制。

就个人而言,我很想看看使用MTA来实现这个甚至是Kannel - 但这更像是一种处理每天超过300,000卷的方法。

答案 1 :(得分:0)

从服务器发送请求,但不要在生成页面的PHP脚本中执行此操作。

而是将有关所需消息的信息存储在数据库中。

编写另一个程序,定期检查数据库中是否有未发送的消息,并调用API。你可以用cron运行它。

答案 2 :(得分:0)

在不到30秒的时间内根据需要发送尽可能多的网络请求是两种自相矛盾的要求。此外,原始"效率"只是意味着挤压服务器中的每一个资源,这可能是不可取的。

说,我认为关键点是:

  • 我可能错了,但据我所知,只有两种方法可以阻止非授权方使用网络服务:私人凭证和IP过滤。基于浏览器的JavaScript无法实现。

  • 不要让人类盯着电脑前,直到这种任务完成。完全没有必要,它甚至可以导致任务中止。

  • 如果您需要将相同的文本发送给不同的收件人,请确定SMS提供商是否具有允许在单个API请求中执行此操作的API。当此功能不可用时,大批量交付会增加一到两个数量级。

简而言之,你需要:

  • 命令行脚本
  • 任务调度程序(例如cron)
  • 希望服务器稳定性达到最高效率(您甚至可能希望限制请求)