如何使用 php 高效发送大量 get 请求

How to efficiently send tons of get request with php

我正在做一个项目,我必须开发一个简单的基于 PHP 的 Web 模块,用户(管理员)可以从中 给学生发短信(跟进),为了广告等需要。

短信API非常简单,我只需要发送一个GET请求Cross Origin Domain 以及 phone 号码和消息。 我用 file_get_contents("sms_api_url?credentials"); 测试了它,它工作正常。

让我担心的是 SMS 将发送到 TONS 个号码 所以我必须使用循环多次发送请求,这会花费很多时间而且我认为会消耗太多资源。 PHP 的最大执行时间也设置为 30 秒,我不想更改。

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

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

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

相反,将有关所需消息的信息存储在数据库中。

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

您没有告诉我们您需要处理的实际量、processing/connection 时间的指标,也没有告诉我们实施上有什么限制。

就目前而言,方式过于宽泛,无法回答。但您可能会考虑的一些方法是:

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

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

I thought to use the Client side JavaScript for sending cross origin request in a loop so that it wont affect my server but that wouldn't be secure as it would reveal the API credentials.

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

使用 cron 有一定的优势 - 但您真的不想从 crond 生成任务来发送一条 SMS 消息 - 它需要 运行 分批处理,并且您需要管理并发性。

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

无论采用何种方法,您都需要一种存储 messages/phone 数字的方法和一种围绕检索处理的锁定机制。

就我个人而言,我很想考虑为此使用 MTA 或什至 Kannel - 但这更像是一种每天处理超过 300,000 卷的方法。

在不到 30 秒内发送尽可能多的网络请求是两个自相矛盾的要求。此外,raw "efficiency" 可能只是意味着挤压服务器中的每一个资源,这可能是不可取的。

这么说,我觉得重点是:

  • 我可能错了,但据我所知,只有两种方法可以防止 non-authorised 方使用 Web 服务:私有凭证和 IP 过滤。 None 可以在 browser-based JavaScript.

  • 在完成此类任务之前,不要让一个人盯着电脑前看。完全没有必要,甚至会导致任务中止。

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

总之你需要:

  • 命令行脚本
  • 任务调度程序(例如 cron)
  • 优先考虑服务器稳定性而不是最高效率(您甚至可能想要限制您的请求)