如何使用 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)
- 优先考虑服务器稳定性而不是最高效率(您甚至可能想要限制您的请求)
我正在做一个项目,我必须开发一个简单的基于 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)
- 优先考虑服务器稳定性而不是最高效率(您甚至可能想要限制您的请求)