Длинная задержка для генерации PDF и отправки электронной почты.Поставить изображение, пока сервер анализирует скрипты? - PullRequest
2 голосов
/ 19 июля 2011

Я работаю над формой, в которой вы можете заказать курьерскую службу.Основная идея заключается в том, чтобы сгенерировать файл PDF, содержащий проверенные данные, а затем прикрепить его к электронному письму клиенту + копия для курьерской компании.

Это создание PDF (TCPDF) и отправка электронной почтыSwiftmail) занимает заметно больше времени.

Я бы хотел, чтобы нетерпеливый пользователь нажимал «подтверждать» снова и снова.Идеальным решением было бы показать какое-нибудь изображение «загрузки» или около того.Я посмотрел на функцию jquery .load (), и это похоже на хорошую проблему для этой проблемы, но как насчет пользователей без js?

Можете ли вы указать мне правильное направление?

Ответы [ 3 ]

1 голос
/ 19 июля 2011

Я бы использовал ajax в этом случае. но если отсутствие JS вызывает у вас серьезную озабоченность, есть несколько способов сделать это без JS. Сначала вы можете отобразить что-то для пользователя перед началом работы с PDF. например,

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

Функция flush () заставит веб-сервер отправлять данные в браузер, поэтому они будут отображаться, пока загружена остальная часть страницы. Однако некоторые браузеры кешируют эту вещь внутренне. Есть способы преодолеть это (посмотрите комментарии в 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, что и оригинальный скрипт. но будет выполняться в фоновом режиме, не прерывая исходную страницу.

1 голос
/ 19 июля 2011

Более 98% пользователей имеют активированный JavaScript.Оставшиеся 2% составляют:

  • Совершенно придурковатые люди, которые знают, как отключить это и хотят это сделать: они, вероятно, не будут нажимать кнопку отправки, как если бы она выходила из моды, поскольку они заметят стандартные индикаторы загрузки браузера;
  • Люди с проблемами зрения, которые используют программы чтения с экрана и в любом случае не получат много пользы от изображения.

Jsв основном само собой разумеющееся в наши дни, и это веб-стандартЯ бы сказал, не волнуйся и сделай это - другого способа сделать нет.Тем не менее, для слепых было бы неплохо иметь тег <noscript> с такой информацией, как «Операция может занять несколько секунд».

0 голосов
/ 19 июля 2011

Другой подход заключается в выполнении обработки (создание PDF и отправка электронного письма) в фоновом режиме.Поэтому, когда вы нажимаете «Подтвердить», это фоновое задание запускается с ввода из формы, и пользователю показывается сообщение о том, что его задание обрабатывается, и он или она вскоре получит подтверждение по электронной почте.Таким образом, вы не будете полностью полагаться на Javascript.

Для этого вы можете использовать что-то вроде Beanstalkd .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...