3

I've got a registration list, which I need to send out a PDF to each person on the list. Each email needs to contain a PDF, which has a base version on the server, but each person's needs to be personalized via name/company etc over the top. This needs to be emailed to each person, which at the moment adds up to be 2,500, but can easily be much higher in the future.

I've only just started working on this project, but the problem I've encountered continuously since last week are that the server doesn't seem to be able to handle doing this. Currently the script is using Zend, which then allows it to use Zend_Pdf and Zend_Mail to create and email the PDFs. Zend_mail connects to an smtp server from smtp.com to do the actual emailing.

Since we have quite a few sites running on the server, we can't afford it to be going down, and when I run it in batches it can start to go down. The best solution I have thus far is running curl from my local machine to the script, which then does one person. The curl script then calls it again, over and over in batches. Even this runs into problems at times, and seems to some how hog memory even after it should be complete (I'm really not sure how).

So what I'm looking for is information on doing this, from libraries, code, information on server setups, anything that can make this much less painful, and much quicker for us to run. I've run out of ideas, and this is something I've not really had to do before (especially at a bulk level).

Thank you.

Edit:

I also forgot to mention that it's using zend_barcode::factory for creating a barcode on the PDF.

4

4 回答 4

1

我建议的第一步是尽可能找出问题所在。是PDF生成吗?是发邮件吗?“服务器似乎无法处理这个问题”并没有说明“服务器宕机”的实际故障 - 您需要确定内存/磁盘空间/时间是否不足或其他原因. 这将帮助您确定是否需要对您的一代进行调整或新方法。因为您说即使是单个手动调用也可能失败,您应该能够将问题缩小到确切的失败原因。

如果您在某个资源限制附近运行(可能是多个站点运行的情况),您可能需要将此功能卸载到另一台机器上。您的选择包括:

  1. 在新主机上运行相同的设置并调整您的应用程序以使用新系统
  2. 在新主机上运行新设置
  3. 使用外部系统(例如提到的 PDFCrowd 或Docmosis

从问题的细节开始。我希望这会有所帮助。请注意,我为创建 Docmosis 的公司工作。

于 2012-10-03T00:28:38.173 回答
0

如果您尝试通过 HTTP 调用脚本,脚本将根据 php.ini 中指定的 max_execution_time 超时。

您需要编写一个可以从命令行运行的 php 脚本,然后通过 cron 作业对其进行调度。该脚本一次可以读取一个用户,将他的 pdf 文件放在一起,然后通过电子邮件发送给他。之后,您可能必须运行一些性能检查以查看服务器是否可以处理该过程。

于 2012-10-03T02:57:37.133 回答
0

根据我的经验 - 两种选择:

使用一个或多个 PDF 库动态生成 PDF(这可能非常慢)。

或者

使用wkhtmltopdf 之类的东西,这是一个简单的 shell 实用程序,可以使用 webkit 渲染引擎和 qt 将 html 转换为 pdf。

基本上,您可以遍历n 个HTML 页面并生成 PDF,而无需产生纯动态 PDF 生成的开销!

我们每天使用它来分发数千个个性化的 PDF,因为它可以将 HTML 页面快速转换为 PDF。存在依赖关系,但它可以工作并且比单独“创建” PDF 的密集度(计算)要小。

希望这可以帮助。

于 2012-10-02T23:24:30.297 回答
0

这里有一些想法:

  1. 是否有特殊原因必须在 Web 服务器上运行?为什么不从不同的机器上运行框架,但使用相同的设置?您可能必须创建一个不同的控制器来处理请求的命令行版本,但没有根本原因它不能工作。
  2. 如果以编程方式创建 PDF 让您头疼,您可以改用服务。
    过去,我使用PDFCrowd 取得了不错的效果,他们提供了一个有用的 PHP 库。您可以给他们一个 HTML 的 blob,使用任何样式表和图像的完整 URL,他们会为您创建一个 PDF。

    每份文件的费用从每份文件 0.5-4.5 美分不等,具体取决于您的费率计划。

    还有其他服务做同样的事情。

  3. 如果这种批处理作业对您的公司来说很重要,您可以考虑使用像beanstalk这样的异步作业队列。您可以将数千个这样的请求排队,并且工作脚本可以以您认为合理的任何速度处理请求。
于 2012-10-02T23:24:49.640 回答