問題一
以前在別的項目中遇到過一個問題:PHP使用 foreach 迴圈發送郵件時,會產生如下錯誤:
範例程式碼:$emails = [ '123@qq.com', '456@qq.com', '789@qq.com',];// $Email 為郵件發送類foreach ($emails as $email) { $Email->send($email, 'subject', 'test');}
看代碼執行結果應該是 : 3個郵箱各收到一封郵件,然而事實是:
第一個
郵箱收到 1
郵件;
第二個
郵箱收到 2
郵件;
第三個
郵箱收到 3
郵件;
當時很不理解為什嗎?後來該項目的郵件換成了亞馬遜的郵件服務
,也就沒去細想。
問題二
最近在項目中遇到一個類似的問題:定時指令碼批量擷取遠程URL內容,代碼大致如下:
$sites = [ 'www.site1.com', 'www.site2.com', 'www.site2.com',];// $CURL 大家腦補foreach ($sites as $site) { $result = $CURL->get($site); var_dump($result);}
本以為應該是列印出3個網站的傳回值,可是時間情況並非如此,在審查資料庫日誌時,發現很多資料不太對。
比較疑惑的是:在迴圈中使用 CURL
時,要考慮並發啊什麼這些東西嗎?菜鳥求解。
回複內容:
問題一
以前在別的項目中遇到過一個問題:PHP使用 foreach 迴圈發送郵件時,會產生如下錯誤:
範例程式碼:$emails = [ '123@qq.com', '456@qq.com', '789@qq.com',];// $Email 為郵件發送類foreach ($emails as $email) { $Email->send($email, 'subject', 'test');}
看代碼執行結果應該是 : 3個郵箱各收到一封郵件,然而事實是:
第一個
郵箱收到 1
郵件;
第二個
郵箱收到 2
郵件;
第三個
郵箱收到 3
郵件;
當時很不理解為什嗎?後來該項目的郵件換成了亞馬遜的郵件服務
,也就沒去細想。
問題二
最近在項目中遇到一個類似的問題:定時指令碼批量擷取遠程URL內容,代碼大致如下:
$sites = [ 'www.site1.com', 'www.site2.com', 'www.site2.com',];// $CURL 大家腦補foreach ($sites as $site) { $result = $CURL->get($site); var_dump($result);}
本以為應該是列印出3個網站的傳回值,可是時間情況並非如此,在審查資料庫日誌時,發現很多資料不太對。
比較疑惑的是:在迴圈中使用 CURL
時,要考慮並發啊什麼這些東西嗎?菜鳥求解。
貼出完整的代碼看看
對於問題一 不清楚你使用的什麼郵件類庫 一般情況下
$Mailer->send($emails,...) 這裡$emails是可以傳入數組的
而至於為何收到郵件的數目不對 可能與內部指標有關係,這個又與PHP版本有關係,同樣的解釋適用於問題二
你可以看一下PHP官方文檔對foreach的說明
In PHP 5, when foreach first starts executing, the internal array pointer is automatically reset to the first element of the array. This means that you do not need to call reset() before a foreach loop.
As foreach relies on the internal array pointer in PHP 5, changing it within the loop may lead to unexpected behavior.
In PHP 7, foreach does not use the internal array pointer.
問題一:產生的原因我猜想,是send的時候儲存了發送的主題和內容,第二次調用send,在儲存一個,如此累加。
解決:你可以換一個郵件庫。或者在foreach裡new一個郵件對象,這樣每次的郵件對象就不同了。
問題二:curl是同步請求,簡單的拉取可以換成file_get_contents函數代替。
暫時發現的問題:
你的問題一$Email類與迴圈變數$email算是重名了吧?
你的問題二get方法邏輯有沒有出錯?