curl - PHP迴圈中發送郵件、網路請求問題

來源:互聯網
上載者:User

問題一

以前在別的項目中遇到過一個問題: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方法邏輯有沒有出錯?

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.