2017-09-04 24 views
-2

我正在使用郵件列表。對多個數組執行多次的Foreach函數

我的郵件列表中有超過400個郵件,現在,所以我用foreach

我的問題是:我能否限制的foreach僅100封郵件?

EG - 發送電子郵件至第100封郵件,突破,然後從那裏開始停止。因此,例如,對於400封電子郵件,被稱爲4次的電子郵件發送到所有電子郵件。

foreach ($addresses as $to) { 
    mail($to,$subject,$message,$headers); 
} 

我需要做這樣的說法,因爲如果我立刻發送電子郵件給所有400個電子郵件,我得到503服務不可用。

我試過,但沒有工作...

$emailchunkarray = array_chunk($addresses, 50); 
$arraysize = count ($emailchunkarray); 
$x = 0; 

function chunker() { 
    if ($x <= $arraysize) { 
     foreach ($emailchunkarray[$x] as $to) { 
      mail($to,$subject,$message,$headers); 
     } 
     $x++ 
     $chunker2(); 
    } 
} 
$chunker(); 

function chunker2() { 
    if ($x <= $arraysize) { 
     foreach ($emailchunkarray[$x] as $to){ 
      mail($to,$subject,$message,$headers); 
     } 
     $x++; 
     $chunker(); 
    } 
} 

出於某種原因,我不能回答我的問題......因此,這裏是我是如何做的:

$ChunkAddresses = 10; 
$EmailChunkArray = array_chunk($Addresses, $ChunkAddresses); 
$ArraySize = count ($EmailChunkArray); 
$ChunkSize = 0; 
$ForeachCounter = 0; 
ChunkLoop: { 
    if ($GLOBALS["ChunkSize"] <= $GLOBALS["ArraySize"]) { 
     $EmailChunkArrayLoop = $GLOBALS["EmailChunkArray"]; 
     foreach ($EmailChunkArrayLoop[$GLOBALS["ChunkSize"]] as $ToChunkLoop) { 
      mail($ToChunkLoop,$GLOBALS["Subject"],$GLOBALS["Message"],$GLOBALS["Headers"]); 
      $GLOBALS["ForeachCounter"]++; 
       if ($GLOBALS["ForeachCounter"] == $GLOBALS["ChunkAddresses"]) { 
        echo "This is the " . $GLOBALS["ChunkSize"] . " chunk."; 
        $GLOBALS["ForeachCounter"] = 0; 
        break 1;} 
     } 
     $GLOBALS["ChunkSize"]++; 
     sleep(3); 
     goto ChunkLoopFollow;} else if ($GLOBALS["ChunkSize"] == $GLOBALS["ArraySize"]){ 
     exit();} 
} 
ChunkLoopFollow: { 
    if ($GLOBALS["ChunkSize"] <= $GLOBALS["ArraySize"]) { 
     $EmailChunkArrayLoopFollow = $GLOBALS["EmailChunkArray"]; 
     foreach ($EmailChunkArrayLoopFollow[$GLOBALS["ChunkSize"]] as $ToChunkLoopFollow) { 
      mail($ToChunkLoopFollow,$GLOBALS["Subject"],$GLOBALS["Message"],$GLOBALS["Headers"]); 
      $GLOBALS["ForeachCounter"]++; 
       if ($GLOBALS["ForeachCounter"] == $GLOBALS["ChunkAddresses"]) { 
        echo "This is the " . $GLOBALS["ChunkSize"] . " chunk."; 
        $GLOBALS["ForeachCounter"] = 0; 
        break 1;} 
     } 
     $GLOBALS["ChunkSize"]++; 
     sleep(3); 
     goto ChunkLoop;} else if ($GLOBALS["ChunkSize"] == $GLOBALS["ArraySize"]){ 
     exit();} 
} 
echo "Finished!"; 
+3

化妝使用一個數據庫來跟蹤郵件已發送或需要發送。 –

+3

在這種情況下使用'for'循環開始也許會更有意義? (但遞增foreach循環裏面一個櫃檯,檢查計數器,如果適用打破循環,當然不是火箭科學無論是。) – CBroe

+1

使用任務調度和隊列,大塊的陣列等,大量的可能性。 – jeroen

回答

4

array_chunk()拆分你的數組,然後用另一個foreach包裝你的foreach。

array_chunk($input_array, 100); 

這應該給你4個數組的數組,每個100個元素(電子郵件)裏面的。

作爲該回答您的問題可能不是幫你一個問題。您必須以某種方式暫停您的代碼,爲此我建議您使用AJAX,因爲您可以輕鬆地指定定時事件。例如,您可以創建在PHP中很小的API,將發送電子郵件x開始,y指數,其中xy從POST請求的值,然後控制它與AJAX調用你的小API。

另一個解決辦法是使用Cron jobs How to create cron job using PHP?

PHP array_chunk()

+2

雖然這會像OP請求那樣分裂陣列,但它不會幫助他解決他真正的問題。迭代新的分塊數組仍然會太快而且出錯。 – ishegg

+0

@ishegg。我嘗試了 'foreach(array_chunk($ addresses,100)as $ to){mail($ to,$ subject,$ message,$ headers);}'但它是一樣的。 我需要以某種方式查找有多少塊100封電子郵件,併爲每個塊執行多次foreach然後我不會因爲php_max_execution_time而得到超時 –

+0

好點,我已經給我的答案添加了一個註釋 – Melcma