【发布时间】:2018-12-18 18:50:41
【问题描述】:
我有一个临时上传 CSV 的 PHP 脚本。一页重载CSV数据来自$_FILES并转换为JSON数组。
然后我使用 $.each 遍历 CSV 行。
对于每一行,我都在对 PHP 函数进行 AJAX 调用,该函数设置一些订单跟踪数据并发送电子邮件。
由于电子邮件限制,我想在每次循环迭代之间添加延迟。但是,我尝试在 JavaScript 中使用设置的超时来执行此操作,但它不起作用,并且还尝试在发送电子邮件之前添加 PHP 睡眠功能。
两者都不起作用,电子邮件仍然可以同时发送,没有延迟。
无论我添加的延迟如何,我发出的所有请求都会被立即处理。
如何确保邮件发送延迟?
jQuery($csv_rows 是刚刚上传的 CSV 数据)
<script>
// Get CSV Rows into JSON array
var csvRows = '<?php echo json_encode( $csv_rows ); ?>';
var csvRows = ( jQuery.parseJSON( csvRows ) );
// Loop through each row
$.each( csvRows, function( key, value ) {
// Split row into array exploded by comma
row = value.toString().split( ',' );
// Get column values
order = row[0];
courier = row[1];
tracking = row[2];
// AJAX
var data = {
'action': 'shd_tracking_import',
'order': order,
'courier': courier,
'tracking': tracking,
};
// Do the ajax
$.ajax({
url: ajaxurl,
type: 'POST',
data: data,
success: function( response ) {
$( '#shd-import-results p' ).hide();
if( response !== '0' ) {
$( '#shd-import-results ul' ).append( response );
importedCount = parseInt( $( '#shd-import-progress span' ).text() );
$( '#shd-import-progress span' ).text( importedCount + 1 );
} else {
$( '<p>Error importing. Please ensure CSV meets requirements.</p>' ).appendTo( '#shd-import-results' );
}
}
});
});
</script>
PHP(这是 AJAX 中引用的 shd_tracking_import 操作)
if( isset( $_POST['order'] ) && isset( $_POST['courier'] ) && isset( $_POST['tracking'] ) ) {
// Delay (due to their Office 365 limits)
usleep( 4000000 ); // 4 Seconds (usleep used as sleep cannot contain fractions, usleep is microseconds, this was 2.5 seconds hence using usleep)
// My mailing function is here (which works just not delayed)
echo 'Done';
} else {
echo '0';
}
exit;
【问题讨论】:
-
这是一种非常奇怪的做法,处理 CSV 文件服务器端并在那里循环会不会更容易,只需在 js/frontend 中有一个按钮来激活它吗?此外,我了解您如何受到 Office 365 的限制,但我不认为它们是 ESP(电子邮件服务提供商),请研究适合群发电子邮件的 ESP(可以访问 API 等)
-
更好地实现一个在指定时间后处理作业的作业队列
-
这应该会延迟电子邮件。尝试延迟 4 秒以上注意延迟,60 秒可能有利于测试。接收邮件服务器可能会将电子邮件排队,因此您认为它们是同时到达的
-
@Accountantمsort of,js 是异步的,所以它不会等待 php 的回复来调用下一行,所以它们之间偏移了 4 秒,而不是 4 秒
-
@DarkMukke 是的,你是对的,我认为 php 中的延迟是在发送电子邮件的循环内