pdf生成的长时间延迟&发送电子邮件。在服务器解析脚本时放置图像?

时间:2011-07-19 11:53:25

标签: php javascript forms pdf-generation

我正在制作一份可以订购快递服务的表格。它的主要思想是生成包含经过验证的数据的PDF文件,然后将其附加到发送给客户+ cc的电子邮件中,用于快递公司。

事情是pdf生成(TCPDF)和电子邮件发送(Swiftmail)需要相当长的时间。

我想防止不耐烦的用户一遍又一遍地点击'确认'。理想的解决方案是显示一些gif'loading'图像左右。我已经研究过jquery .load()函数,对于这个问题来说它看起来是件好事,但是对于没有js的用户呢?

你能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:1)

超过98%的用户已激活javascript。剩下的2%是由:

  • 知道如何禁用它并且想要这样做的那些讨厌的人:他们可能不会点击提交按钮,好像它已经过时了,因为他们会注意到默认的浏览器加载指标;
  • 有视力问题的人,使用屏幕阅读器,无论如何都不会从图像中获益。

Js现在被认为是理所当然的,它是一个网络标准。我会说不要担心并为此而努力 - 没有其他办法可以做到。不过,对于盲人来说,拥有一个<noscript>标签,其中包含“操作可能需要几秒钟”的信息会很好。

答案 1 :(得分:1)

在这种情况下我会使用ajax。但如果缺少JS是你真正关心的问题,那么没有JS就有几种方法可以做到这一点。 首先,您可以在开始使用pdf之前向用户显示内容。例如

<?php
echo "<html><head></head><body> Please Wait..";
flush();
// process pdf here
?>

function flush()将强制Web服务器将数据发送到浏览器,因此在加载页面的其余部分时将显示该数据。但是有些浏览器会在内部缓存这个东西。有办法克服这个问题(在php.net中查看flush()函数的注释),但它可能会变得混乱。

另一种方法是异步处理PDF。在这种情况下,目标脚本只显示即将发送电子邮件的消息。然后发射实际发送它的剧本女巫。例如:

<?php
  echo "<html><head></head><body> Email will be send out shortly </body></html>";

  $params='';
  foreach ($_POST as $name => $value) {
    $params.=$name.'='.$value.'&';
  }
  if ($params!='')
    $params=urldecode(substr($params,0,-1));
  $parts=parse_url('process_pdf.php'.'?'.$params);
  $fp = fsockopen('process_pdf.php',80, $errno, $errstr, 30);
  $out = "POST ".$parts['path']." HTTP/1.1\r\n";
  $out.= "Host: ".$parts['host']."\r\n";
  $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
  $out.= "Content-Length: ".strlen($parts['query'])."\r\n";
  $out.= "Connection: Close\r\n\r\n";
  $out.= $parts['query'];
  fwrite($fp, $out);
  fclose($fp);
?>

在此示例中,“process_pdf.php”将获得与原始脚本相同的POST参数。但会在后台执行而不会中断原始页面。

答案 2 :(得分:0)

另一种方法是在后台作业中进行处理(创建PDF和发送电子邮件)。因此,当您使用单击“确认”时,将使用表单中的输入启动此后台作业,并向用户显示正在处理其作业的消息,并且他或她将很快通过电子邮件收到确认。这样,您就可以避免依赖Javascript。

您可以使用类似Beanstalkd的内容。