Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Супер Долгое выполнение скрипта (https://javascript.ru/forum/jquery/84966-super-dolgoe-vypolnenie-skripta.html)

BorisJe 18.02.2023 12:48

Супер Долгое выполнение скрипта
 
Всем привет ребята. Скрипт

(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

voraa 18.02.2023 13:57

Ну так "размораживай", когда придет ответ от сервера.
Пока не ответил, показывай какой нибудь значок загрузки, что бы пользовал спокойней был.

BorisJe 18.02.2023 15:05

Цитата:

Сообщение от voraa (Сообщение 550738)
Ну так "размораживай", когда придет ответ от сервера.
Пока не ответил, показывай какой нибудь значок загрузки, что бы пользовал спокойней был.

Да поставил уже, Он крутится и крутится. Долго
Может конечно не в скрипте дело. Cms Joomla

BorisJe 18.02.2023 15:13

А Мне бы хотелось, чтобы пользователь увидел типа ну все ок, страницу редиректа. А потом уже все там делалось

voraa 18.02.2023 17:46

Не получится. Нельзя послать запрос с одной страницы, а ответ получить на другой.
Тогда сначала делай редирект, и с той страницы посылай запрос.
Данные для запроса можно через localStorage передать.

Nexus 18.02.2023 17:53

Такие операции по-хорошему асинхронно выполнять нужно.
Самое простое - складируйте письма, которые нужно отправить в табличку в БД и по крону отправляйте небольшие порции раз в минуту.
Для пользователя такие запросы к серверу моментальными должны стать.

BorisJe 19.02.2023 03:09

Ну смотрите пользователю просто рыба отправляется. И все. Уведомление что получили, а админу уже форма. То есть админ должен получить форму а пользователю ответ что все хорошо.
Можно не редирект делать, а просто форму или сообщение что все ок.
Но Я что то вообще заглох. Даже понять не могу кому дольше отправляется, пользователю или админу

BorisJe 19.02.2023 06:46

Мне кажется через базу данных не получится. Плюс ещё надо будет какой то признак ставить что отправилось или удалять вообще.
А можно как нибудь асинхронно запустить. Пользователю показать страницу что все ок. А дальше все просто само отрабатывает. Результат успеха не важен.
Пользователь заполнил форму, ему сразу же страница типа все ок. А дальше идёт уже отправка. Не важен в общем успешный результат или нет

BorisJe 19.02.2023 08:50

Если не ок то пользователь вообще ничего не видет. А так пока для личного спокойствия, сразу показать пользователю страницу редиректа и не ждать ответа от сервера. Так можно сделать?

voraa 19.02.2023 10:34

Ну попробуй после отправки не ждать ответа, а просто через полсекунды делать редирект.


Часовой пояс GMT +3, время: 18:20.