我在我的网站上添加了新功能。管理员使用一些图片(租用接收)上传存档,这些图片正在发送给用户。我的网站上有50-100个用户。最大用户为700-1000。
我正在发送带有mail()
功能的电子邮件。这需要时间。通过mail()
发送1条消息大约需要3.5秒。我需要发送至少100条消息。
我有下一个代码结构:
Main script
:
send_rent_receipts.php
。月份和年份作为参数发送 send_rent_receipts.php
(获得月份和年份):
.../$year/$month
.../$year/$month
中的foreach文件执行:此方法使用10个文件工作约35秒。 1个文件~3.5秒。
我的托管服务提供商在max_execution_time 30
中设置php.ini
,因此此脚本失败(因为它的工作时间超过30秒。
我尝试了另一种方法:
main script
:
.../$year/$month
.../$year/$month
中的foreach文件
send_rent_receipts.php
发出ajax请求(文件名,月份,年份正在发送) send_php_script.php
:
.../$year/$month/$filename
发送给此
邮件我认为这种方法是我需要的。服务器不会发出1个ajax请求,而是发出XX ajax请求(取决于文件数量)。每个请求将工作3.5秒。 Ajax请求是异步的(我想。它们必须是)所以所有进程(XX ajax请求)都将工作3.5秒。
但是......我看到了什么?有3个图像,包含不同数量的文件(1,3,10个文件):
发送1封电子邮件:
发送3封电子邮件:
发送10封电子邮件:
为什么ajax请求(async: true
为默认值)不是异步请求。这个图像显示,发送1封电子邮件的10个ajax请求与发送10封电子邮件的脚本的1个请求相同。
为什么会这样?我认为他们必须是异步的,所有订阅都需要3.5秒。
如何减少脚本执行时间?什么方法让它运行得更快
P.S。:文件不相等,所以我不能向10个收件人发送1封电子邮件。
答案 0 :(得分:0)
您可以异步发送请求,但等待在第一条消息完成之前发送下一条消息。
当您一次执行多个请求时,您的请求需要更长时间的原因是因为每个请求都访问磁盘,这是一个原子操作,因此一次只有一个请求可以进行磁盘操作,所以如果你正在进行多个访问磁盘的请求,那么现在不处理磁盘操作的请求需要等待那个请求。
并且您不应该使用sync ajax请求,因为它们将阻止请求进行的javascript线程,因此如果您发送请求,等待回调并发送下一个请求,您将模拟同步请求,不会阻止javascript线程,并且您不会获得请求超时,因为访问磁盘时只有一个请求,因此没有请求等待另一个请求完成磁盘工作。