Супер Долгое выполнение скрипта
Всем привет ребята. Скрипт
(function($) {
$(function() {
jQuery('#quote_form').on('submit', function(e){
e.preventDefault();
jQuery('.btn ').attr('disabled','disabled');
jQuery('#quote_form').addClass('form_sending');
var request = {
option : 'com_ajax',
module : 'c_form',
method : 'sendMail',
format : 'row',
data: jQuery('#quote_form').serialize(),
src: window.location.href,
};
jQuery.ajax({
method: 'POST',
data: request,
})
.success(function(response){
console.log(response);
//jQuery(location).attr('href', window.location.origin + '/thanks-you-for-contacting');
});
});
});
})(jQuery);
<?php
require_once '../../configuration.php';
$jconfig = new JConfig();
$host = $jconfig->host;
$dbname = $jconfig->db;
$username = $jconfig->user;
$password = $jconfig->password;
$dbprefix = $jconfig->dbprefix;
$db = mysqli_connect($host, $username, $password, $dbname);
if (!$db) {
die('Ошибка соединения: ' . mysqli_error());
}
$stmt = $db->prepare('SELECT params FROM ' . $dbprefix .'template_styles WHERE template = "easy_moving"');
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$params = json_decode($row['params']);
mysqli_close($db);
$to = $params->email;
$subject = $_POST['subject'];
$mailheaders = "Content-type:text/html;charset=utf-8rn";
$mailheaders .= "From: SiteRobot <noreply@easy-moving.ca/>rn";
$mailheaders .= "Reply-To: [email]noreply@easy-moving.ca[/email]/";
if ($subject == 'Free Quote') {
$message =
'<table>
<tbody>
<tr>
<td>Moving From</td>
<td>'. $_POST['movingfrom'] .'</td>
</tr>
<tr>
<td>Moving To</td>
<td>'. $_POST['movingto'] .'</td>
</tr>
<tr>
<td>Contact Phone</td>
<td>'. $_POST['phone'] .'</td>
</tr>
<tr>
<td>Full Name</td>
<td>'. $_POST['fullname'] .'</td>
</tr>
<tr>
<td>Email Address</td>
<td>'. $_POST['email'] .'</td>
</tr>
<tr>
<td>Moving Date</td>
<td>'. $_POST['movingdate'] .'</td>
</tr>
<tr>
<td>What Size?</td>
<td>'. $_POST['whatsize'] .'</td>
</tr>
<tr>
<td>How did you hear about us?</td>
<td>'. $_POST['howdid'] .'</td>
</tr>
</tbody>
</table>';
}
elseif ($subject == 'Free Estimate Online') {
$message =
'<table>
<tbody>
<tr>
<td>Full Name</td>
<td>'. $_POST['fullname'] .'</td>
</tr>
<tr>
<td>Email Address</td>
<td>'. $_POST['email'] .'</td>
</tr>
<tr>
<td>Contact Phone</td>
<td>'. $_POST['phone'] .'</td>
</tr>
<tr>
<td>Moving From</td>
<td>'. $_POST['movingfrom'] .'</td>
</tr>
<tr>
<td>Moving To</td>
<td>'. $_POST['movingto'] .'</td>
</tr>
<tr>
<td>Moving Date</td>
<td>'. $_POST['movingdate'] .'</td>
</tr>
<tr>
<td>Move Size</td>
<td>'. $_POST['movesize'] .'</td>
</tr>
<tr>
<td>Truck Size</td>
<td>'. $_POST['trucksize'] .'</td>
</tr>
<tr>
<td>Сomments</td>
<td>'. $_POST['comments'] .'</td>
</tr>
</tbody>
</table>';
} else {
die('error');
}
$res = mail($to, $subject, $message, $mailheaders);
echo $res;
?>zz
Супер долго выполняется, Я уже не знаю что с ним делать. А проблема в том что пока он выполняется пользователь еще раз 15 жмет на кнопку, думаю что не работает и по итогу приходит 9999 сообщений от пользователя, в зависимость от агрессии. Вышел пока из положения тупо ее заморозить, но при этом и редирект страдает. Друзья подскажите пожалуйста что может быть и как оптимизировать бы это можно? Может как то асинхронно можно? Ссылка https://easy-moving.ca/get-free-quote |
Ну так "размораживай", когда придет ответ от сервера.
Пока не ответил, показывай какой нибудь значок загрузки, что бы пользовал спокойней был. |
Цитата:
Может конечно не в скрипте дело. Cms Joomla |
А Мне бы хотелось, чтобы пользователь увидел типа ну все ок, страницу редиректа. А потом уже все там делалось
|
Не получится. Нельзя послать запрос с одной страницы, а ответ получить на другой.
Тогда сначала делай редирект, и с той страницы посылай запрос. Данные для запроса можно через localStorage передать. |
Такие операции по-хорошему асинхронно выполнять нужно.
Самое простое - складируйте письма, которые нужно отправить в табличку в БД и по крону отправляйте небольшие порции раз в минуту. Для пользователя такие запросы к серверу моментальными должны стать. |
Ну смотрите пользователю просто рыба отправляется. И все. Уведомление что получили, а админу уже форма. То есть админ должен получить форму а пользователю ответ что все хорошо.
Можно не редирект делать, а просто форму или сообщение что все ок. Но Я что то вообще заглох. Даже понять не могу кому дольше отправляется, пользователю или админу |
Мне кажется через базу данных не получится. Плюс ещё надо будет какой то признак ставить что отправилось или удалять вообще.
А можно как нибудь асинхронно запустить. Пользователю показать страницу что все ок. А дальше все просто само отрабатывает. Результат успеха не важен. Пользователь заполнил форму, ему сразу же страница типа все ок. А дальше идёт уже отправка. Не важен в общем успешный результат или нет |
Если не ок то пользователь вообще ничего не видет. А так пока для личного спокойствия, сразу показать пользователю страницу редиректа и не ждать ответа от сервера. Так можно сделать?
|
Ну попробуй после отправки не ждать ответа, а просто через полсекунды делать редирект.
|
Цитата:
В начале скрипта поставить код с этой страницы (первые 20 строк), заменив 7-ю строку на echo "Ok"; И убрать строку echo $res; в конце вашего скрипта. |
Цитата:
Не приходят формы на почту админу, и так и так попробовал |
Цитата:
Значит я вижу три выхода: - либо менять протокол взаимодействия с веб-сервером и/или сам веб-сервер; - либо ставить локально почтовый сервер (для быстрого приёма письма), который будет затем перенаправлять почту куда надо; - либо вариант, который предложил Nexus. |
Цитата:
сейчас в Joomla стоит phpMail, когда настраивал smtp вообще не приходило |
Цитата:
|
А что если: сервак должен получать запрос, запускать в отдельном потоке отправку письма, и отвечать клиенту что всё ок
т.е. фронт отправить запрос и получит ответ за секунду. А письмо отправлять сервер будет уже столько сколько надо т.е. фронт должен дождаться ответа что запрос на сервер отправлен после чего сделать редирект пхп работает с потоками? |
По потокам не подскажу, но можно ещё запустить внешний фоновый процесс через exec и его аналоги:
https://php.ru/forum/threads/zapusk-...9/#post-489196 https://stackoverflow.com/questions/...nswer-14556052 https://ru.stackoverflow.com/questio...BD%D0%B8%D1%8F Тут ключевое слово - фоновый. Иначе основной скрипт будет ждать завершения дочернего процесса. Как вариант, можно так запускать не напрямую консольный php-скрипт, а дёргать УРЛ через curl или wget:
exec("wget -b -o /dev/null 'https://javascript.ru/?s=subject&text=some text для примера'");
^^тут часть >/dev/null & не нужна, т.к. мы указали ключ -b для wget, благодаря чему он сам переходит в фон; а ключом -o мы сказали что и вывод с этой страницы сохранять не нужно. |
Цитата:
Мне кажется для приложения на Joomla это как-то слишком серьезно что ли) Попробуйте просто отправить ответ пользователю, что "все хорошо" и продолжайте выполнять отправку сообщений: https://gist.github.com/bubba-h57/32593b2b970366d24be7 https://stackoverflow.com/questions/...nnection-early Цитата:
|
Цитата:
|
а что если так?
$(document).ready(function(){
$('.quote_form').click(function(){
// get text field value
var userName = $('.myField').val();
var emailAddress = 'myemail@server.com';
// ajax request and response in function
var jqxhr = $.ajax({
url: 'sendMail.php',
type: 'POST',
data: jQuery('#quote_form').serialize(),
src: window.location.href,
success:function(responseAnyNameHere) {
$('.responseArea').html(responseAnyNameHere);
},
statusCode:{
404:function(){
//$('.error').html("Page not found!");
alert( "file not found" );
}
}
}).done(function() {
alert( "success" );
}).fail(function() {
alert( "error" );
}).always(function() {
alert( "complete" );
});
}}));
Только где то ошибка |
$(document).ready(() => {
$('#quote_form').on('submit', function () {
jQuery('#quote_form').addClass('form_sending');
$.ajax({
url: "/templates/easy_moving/sendmail.php",
method: "POST",
data: jQuery('#quote_form').serialize(),
contentType: false,
cache: false,
processData: false,
src: window.location.href,
success: function (data) {
console.log(data);
}
});
});
});
Ошибок нет, и не работает |
$('#quote_form').click(function(){
$.post(
'sendmail.php', // адрес обработчика
$("#quote_form").serialize(), // отправляемые данные
function(msg) { // получен ответ сервера
}
);
});
Тоже не пошло |
BorisJe,
чем это отличается от изначального варианта? |
$.ajax({
url: 'process.php',
type: 'POST',
data: 'passVarOne='+userName+'&passVarTwo='+emailAddress,
success:function(responseAnyNameHere) {
$('.responseArea').html(responseAnyNameHere);
},
statusCode:{
404:function(){
//$('.error').html("Page not found!");
alert( "file not found" );
}
}
}).done(function() {
alert( "success" );
}).fail(function() {
alert( "error" );
}).always(function() {
alert( "complete" );
});
Вот еще нашел код. Идея такая выполнить, прыгнуть в always и сделать редирект. Работает еще до fail |
BorisJe,
Это не поможет. При редиректе произойдёт отключение от серверного скрипта и тот завершится, не успев ничего отправить. Если не можете решить проблему на стороне сервера, то замените крутилку на прогресс-бар, рассчитанный на 15 секунд, плюс текст с извинениями и просьбой подождать это время. В идеале - ещё занять/развлечь чем-нибудь на это время: текстом, картинкой, и т.д. |
Цитата:
На 3.6 Делается по другому, но и быстрее работает. что сделал
$(document).ready(() => {
$('#quote_form').on('submit', function () {
jQuery('#quote_form').addClass('form_sending');
$.ajax({
url: "/templates/easy_moving/sendmail.php",
method: "POST",
data: jQuery('#quote_form').serialize(),
contentType: false,
cache: false,
processData: false,
src: window.location.href,
success: function (data) {
console.log(data);
}
});
});
});
На отправку не идет. почемуто |
Цитата:
$(document).ready(() => {
$(function() {
$('quote_form').submit(function(e) {
$.ajax({
url: '/templates/easy_moving/sendmail.php',
data: $("#quote_form").serialize(),
}).done(function() {
console.log('success');
}).fail(function() {
console.log('fail');
});
//отмена действия по умолчанию для кнопки submit
e.preventDefault();
});
});
});
Захожу во все кроме Done |
Цитата:
|
Цитата:
fail: error Internal Server Error |
$(document).ready(() => {
$(function() {
$('#quote_form').submit(function(e) {
$.ajax({
url: 'sendmail.php',
type: 'POST',
data: $("#quote_form").serialize(),
success:function(responseAnyNameHere) {
$('.responseArea').html(responseAnyNameHere);
},
statusCode:{
404:function(){
//$('.error').html("Page not found!");
alert( "file not found" );
}
}
}).done(function() {
alert( "success" )
}).fail(function(jqXHR, textStatus, errorThrown) {
console.log('fail: ', textStatus, errorThrown);
})
.always(function() {
alert( "complete" );
});
//отмена действия по умолчанию для кнопки submit
e.preventDefault();
});
});
});
Ошибок нет, везде успех но и не отправилось. Но отработало быстро |
Я уже склоняюсь к тому что дело не в отправки а в самом скрипте JS.
Подскажите пожалуйста ребята, что Я не так делаю? Сейчас и ошибок нет и не отправился |
Цитата:
ПХП скрипт работает правильно. Лучше там уже не сделать А вот Js какой то странный. Последний Мой код отрабатывает, ошибок не вызывается. Но и почту не отправляет, не админу не пользователю |
Цитата:
|
| Часовой пояс GMT +3, время: 04:02. |