热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

curl-PHP循环中发送邮件、网络请求问题

问题一以前在别的项目中遇到过一个问题:PHP使用foreach循环发送邮件时,会产生如下错误:{代码...}看代码执行结果应该是:3个邮箱各收到一封邮件,然而事实是:第一个邮箱收到1邮件;第二个邮箱收...

问题一

以前在别的项目中遇到过一个问题: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方法逻辑有没有出错?

推荐阅读
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了《中秋夜作》的翻译及原文赏析,以及诗人当代钱钟书的背景和特点。通过对诗歌的解读,揭示了其中蕴含的情感和意境。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 关羽败走麦城时路过马超封地 马超为何没有出手救人
    对当年关羽败走麦城,恰好路过马超的封地,为啥马超不救他?很感兴趣的小伙伴们,趣历史小编带来详细的文章供大家参考。说到英雄好汉,便要提到一本名著了,没错,那就是《三国演义》。书中虽 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 橱窗设计的表现手法及其应用
    本文介绍了橱窗设计的表现手法,包括直接展示、寓意与联想、夸张与幽默等。通过对商品的折、拉、叠、挂、堆等陈列技巧,橱窗设计能够充分展现商品的形态、质地、色彩、样式等特性。同时,寓意与联想可以通过象形形式或抽象几何道具来唤起消费者的联想与共鸣,创造出强烈的时代气息和视觉空间。合理的夸张和贴切的幽默能够明显夸大商品的美的因素,给人以新颖奇特的心理感受,引起人们的笑声和思考。通过这些表现手法,橱窗设计能够有效地传达商品的个性内涵,吸引消费者的注意力。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • faceu激萌变老特效的使用方法详解
    本文介绍了faceu激萌变老特效的使用方法,包括打开faceu激萌app、点击贴纸、选择热门贴纸中的变老特效,然后对准人脸进行拍摄,即可给照片添加变老特效。操作简单,适合新用户使用。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 大连微软技术社区举办《.net core始于足下》活动,获得微软赛百味和易迪斯的赞助
    九月十五日,大连微软技术社区举办了《.net core始于足下》活动,共有51人报名参加,实际到场人数为43人,还有一位专程从北京赶来的同学。活动得到了微软赛百味和易迪斯的赞助,场地也由易迪斯提供。活动中大家积极交流,取得了非常成功的效果。 ... [详细]
author-avatar
一线天24_226
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有