小编Swa*_*der的帖子

在PHP中创建集合类的目的是什么?

我一直在这里阅读Alejandro Gervasio的优秀服务层系列:http://www.devshed.com/cp/bio/Alejandro-Gervasio/我注意到他也是喜欢PHP Collections的开发人员之一,如http: //www.devshed.com/c/a/PHP/PHP-Service-Layers-Handling-Entity-Collections/1/

这是为什么?为什么要创建一个通过使用数组本身来模拟简单关联数组的类?

php collections

9
推荐指数
1
解决办法
2388
查看次数

在PHP中定义多个函数参数类型

是否可以将函数参数定义为多种可能的类型?例如,函数可以使用字符串或整数来完成某些操作.有可能以某种方式定义它吗?

    function something(int|string $token) {}
Run Code Online (Sandbox Code Playgroud)

或者每个参数只支持一种类型?

(请注意,我知道我以后可以过滤输入,我只想输入我的参数)

php arguments declaration function

8
推荐指数
2
解决办法
5712
查看次数

PHP发送的电子邮件有= 0A = 0A而不是新行

一段时间以来,我遇到了一些问题,我的一些用户得到= 0A = 0A而不是我通过PHP发送给他们的电子邮件中的新行.通过电子邮件客户端进行的通信效果很好,但PHP生成的电子邮件总是与某些用户(少数)一样.谷歌搜索没有显示出不错的结果,所有的搜索结果似乎都与某种情况有关 - 并且认为所有Outlook用户都会遇到这个问题是不可接受的.有没有人知道处理这个问题的正确方法并避免这些新的线路编码问题?

编辑:仅供参考我正在使用Zend的Mailer类.

谢谢

编辑2:

更改编码类型不起作用.我将标题编码为base64,将主体编码为64,出现乱码.然后我尝试使用base64头文件,并在主体上执行了base64_decode(base64_decode($ body)),这对于用户的"CNR服务器但不在收件箱中"没什么意义.当我尝试mb_convert_encoding到base64时,我再次得到了编码的字符串而不是正文,所以没用.

我还能尝试什么?Zend Mailer仅支持Quoted Printable和Base64头编码.不知道如何处理它以匹配引用的可打印编码...

php email encoding zend-framework quoted-printable

7
推荐指数
1
解决办法
6624
查看次数

PHP,sendmail和传输 - 如何加快邮件发送速度

我刚刚编写了一组批量电子邮件类,用于处理大量电子邮件并根据传递的参数解析其内容.如果我在我的数据库中测试1000个随机收件人和1000个随机发件人的电子邮件,直到脚本点击send()部分(我现在评论它),我获得大约2秒的性能和20 MB峰值内存,这很棒.

但是,如果我取消注释发送部分,则发送需要30秒.这是不可接受的,我想以某种方式加快速度.从测试中可以明显看出,延迟是由$ mail-> send()调用引起的,就好像它在等待它返回一些东西然后继续循环并发送下一封电子邮件一样.

我想知道的是:如何加快send()调用?我该怎么做才能让它更快?我尝试使用两种发送方法:

  1. Zend SMTP传输,直接连接到服务器,只是发送.每1000封电子邮件需要30秒.
  2. Sendmail通过Zend_Mail.在准备好每封电子邮件后,只需调用Zend_Mail的发送功能即可.这需要60秒.

请注意,排队绝对是一个选项,我已经将它构建到我的课程中.所需要的只是激活一个cron,它就像一个魅力.但我想知道实际发送以及如何加快速度.所以,实际的send()调用.

php email zend-framework sendmail zend-mail

6
推荐指数
1
解决办法
2056
查看次数

自定义电子邮件标头可以触发垃

我们做了很多邮件,我们使用Sendgrid为它提供独特的参数和类别.但是对于存储,存档,过滤和搜索功能,我想给他们一些其他的自定义标题,就像这个数组的json格式

array('user' => 300, 'item' => 8842, 'country' => 'Croatia');
Run Code Online (Sandbox Code Playgroud)

现在,这样的自定义标头是否有可能损害我们电子邮件的直通率?换句话说,由于拥有此类自定义标头,我们的电子邮件是否有可能触发垃圾邮件过滤器?

email header email-spam spam sendgrid

6
推荐指数
1
解决办法
3853
查看次数

从Zend Framework 2中的路由获取$ _GET参数

Zend Framework 1有一种非常简单的方法来解析URL路由并在$ _GET超全局中设置找到的params以便于访问.当然,你可以在控制器中使用 - > getParam($ something),但是如果在URL中找到了param,它可以通过$ _GET访问.

url的示例 mypage.com/mymodule/mycontroller/myaction/someparam/5:

ZF1

$this->getParam('someparam'); // 5
$_GET['someparam']; // 5
Run Code Online (Sandbox Code Playgroud)

ZF2

$this->getEvent()->getRouteMatch()->getParam('someparam'); // 5
$_GET['someparam'] // undefined index someparam
Run Code Online (Sandbox Code Playgroud)

显然,区别在于ZF2不会将路径参数放入$ _GET超全局.

我如何将解析后的参数放入$ _GET超全局,因为扩展控制器只是定义一个构造函数,这是不可能的(因为RouteMatch还不是一个对象,不能从控制器的构造函数调用)?

调用$_GET = $this->getEvent()->getRouteMatch()->getParam('someparam');我的每个控制器都可以,但我不希望这样.

换句话说,按照上面的示例URL,我希望能够执行$ _GET ['someparam']并仍然在应用程序的任何组件中获得值"5".

编辑:看起来我不够清楚,所以我会尝试澄清一些.我希望我通过/ key/value格式在URL中输入的任何参数立即在$ _GET中可用.获取参数时我真的没有问题,我知道如何获取它并且我扩展了Zend的控制器,所以我可以像ZF1一样再次调用$ this-> getParams,现在所有控制器都扩展了那个,我只是想要URL中的params自动也在$ _GET中,因此我可以在本地使用$ _GET的第三方组件中轻松访问它们.

编辑2:更新后对Samuel Herzog的回答作出了反应:在这种情况下,我真的不介意使SRP无效,因为库的构建方式需要他们直接访问$ _GET - 他们自己进行过滤并直接依赖在这个超全球.他们还直接获取$ _FILES和$ _POST进行处理,这就是他们的代码工作方式.

我在抽象控制器中创建了以下方法:$ this-> mergeGet(); 这基本上使$ _GET吸收所有路由匹配的参数,一切都按预期工作,但看到每个控制器/动作都需要库,每次调用该方法可能会很繁琐.如果只有控制器有一个像ZF1那样的init()方法......

php routing zend-framework superglobals zend-framework2

6
推荐指数
2
解决办法
2万
查看次数

应该使用哪个数据库来跟踪和归档通过PHP发送的电子邮件

这个问题有两个方面.

  1. 我们托管了很多静态文件供公众下载.PDF,Zips,图像,人们每天下载数千个.我们跟踪MySQL数据库中的计数器,并在MongoDB中跟踪详细信息(详细信息如下载来自何时).

  2. 我们通过PHP发送了很多电子邮件.我们的应用程序往往每月发送数十万封电子邮件,其中许多是新闻通讯,通知和项目邀请.这些发送的电子邮件被保存到MySQL数据库中,其关键数据被序列化(从不是正文或实际的电子邮件内容,只是标题,收件人,发送时间等)

MySQL是一个不错的选择吗?是Mongo吗?我们应该使用其他东西吗?现在,我们的电子邮件归档表和下载统计表都快速接近2GB.

注意:我们存储的数据是定期访问的,所以要存储它并忘记它是不可能的.我们使用下载统计信息通知作者其下载数量已达到X的内容,并使用电子邮件存档检查交付状态等,并将其显示给定期跟踪此情况的员工.(我们使用Sendgrid进行交付指标)

php mysql statistics archive mongodb

5
推荐指数
1
解决办法
602
查看次数

有没有办法只使用xdebug记录比X慢的执行?

我希望xdebug只追踪超过X ms或超过Y KB RAM的"跳跃",例如,每次执行时间超过100毫秒或增加内存使用量超过100KB.这样我就可以忽略数千条我不需要查看的跟踪线,并且可以使优化变得更加容易 - 因为在ZF2中,膨胀的框架需要1秒才能开始使用我们企业项目中的composer autoloader,结果在成千上万行中我真的没用.沿着这条线的某个地方,我确实发现了执行时间的较大跳跃,但不是经过长时间的滚动.

是否有一个默认选项来禁用"比X更快"执行的日志记录,或者如果没有,你知道一个帮助shell/python脚本可以只是慢速的那些吗?

为了澄清,我正在讨论通过在我的应用程序中运行xdebug_start_trace()获得的.xt文件的内容.

php debugging performance xdebug php-extension

5
推荐指数
0
解决办法
182
查看次数

如何使模型在Phalcon PHP Framework中使用默认值?

如果某个表在某些字段上有默认值并且不允许NULL,则可以期望插入脚本使用这些默认值,就像MariaDB/MySQL通常那样.例如,如果表产品具有AI字段"id",必填字段"name"和两个必填字段"active"和"featured"都默认为1,则查询

INSERT INTO products (name) VALUES ('someName');
Run Code Online (Sandbox Code Playgroud)

自动插入1作为活动和特色的值.但是,当使用Phalcon的模型时:

$product = new Products();
$product->setName('someName');
$product->save();
Run Code Online (Sandbox Code Playgroud)

返回验证错误,说"active"和"featured"是必需的.

我是否应该在模型生成期间提供一个标志,以便Phalcon工具收集并将默认值输入到模型类中,或者使Phalcon自动使用默认值的另一种方法?我认为最好的方法就是忽略未设置的字段.我可以让模型这样做吗?

php frameworks phalcon

5
推荐指数
1
解决办法
5808
查看次数

如何创建用于PHP的ICU资源文件?

我按照BryanH的回答说明:在Intl库中等效的gettext()?并试图用php-intl实现本地化(翻译),但我一直遇到这个人有同样的问题:ResourceBundle返回NULL而没有引发任何错误

他提到他使用工具创建了dat文件(我无法弄清楚如何工作),而前一个回答中的人似乎只是使用扩展名为.res的txt文件.

如何使用php-intl和ResourceBundle正确实现本地化,我做错了什么?

目标是拥有不同语言的各种数据文件,以便我可以做类似的事情

$t = new Translator();
$t->setResource(new \ResourceBundle('es', 'locales_folder/'));
$t->echo("somestring"); // "el stringo"
Run Code Online (Sandbox Code Playgroud)

..就像第一个回答中的那个人一样.此外,目标是拥有易于编辑的文件,因此我可以将它们提供给翻译人员以进行修复,更新等.我意识到我可以通过一个简单的文本文件轻松地使用自定义解决方案来实现这一点,该文件在第一次请求时被解析并保存到memcache中,然后它可以持久存储并从中获取服务而无需重新读取.dat文件,但我宁愿在这里采取建议的路线.

编辑:只是为了得到它 - 我成功地用gettext实现了同样的东西并且它很容易 - 除了一个在linux系统中持续存在的bug(http://www.php.net/manual/en/book.gettext) .php#91187) - 但如果可能的话,我想依靠更现代和包罗万象的国际扩展.

php localization gettext internationalization icu

5
推荐指数
1
解决办法
2889
查看次数