2016-09-11 2 views
7

Пожалуйста оголить меня за длинный вопрос ...Ajax вызова перед неловкое положение

Я должен добавить запись один базы данных для одной основной таблицы скажем test таблицу. После добавления записи в эту таблицу я хочу ее last inserted id, а затем хочу добавить приблизительно 1000 записей в таблицу транзакций (также отправляя EMAILS на эти 1000 записей), скажем, test_transaction.

Но эта вторая операция, добавляющая запись в таблицу транзакций, занимает больше секунды, чтобы добавить записи в базу данных. Я использую MVC клиента и мой код выглядит следующим образом ...

public function addtotest() 
{ 
    $strSql = "INSERT INTO test ..."; 
    $intId = $this->db->execute($strSql); 

    foreach($arrTransaction $transact) 
    { 
     $strSql = "INSERT INTO test_transaction ..."; 
     $this->db->execute($strSql); 
    } 

    echo $intId; 
} 

Так я хочу поставить test_transaction записей таблицы в другую в action, как показано ниже

public function testtrancation() 
{ 
    $id = $_REQUEST['id']; //It's understood that I am doing proper validation here 
    foreach($arrTransaction $transact) 
    { 
     $strSql = "INSERT INTO test_transaction ..."; 
     $this->db->execute($strSql); 
    } 
} 

Так главный вопрос, я звоню addtotest действие от a AJAX, и когда он даст id в ответ, я хочу позвонить другому AJAX, который добавит приблизительно 1000 записей в базу данных.

НО Я не хочу нарушать опыт пользователей, позволяя им ждать еще несколько минут за 1000 записей.

  1. Так что я перезагружаю страницу после того, как запись была добавлена ​​addtotest `AJAX '.
  2. Звонок другой AJAX звонок в success из addtotest.
  3. И после звонка testtransactionAJAX звонок, я перезагружаю свою страницу.

    $.ajax(
    { 
        url: SERVER_PATH + 'addtotest', 
        type: 'post', 
        async: true, 
        data: { required_data: required_date }, 
        success:function(data) 
        { 
         alert('Record added successfully.'); 
    
         //I DO NOT WANT USERS TO WAIT FOR THIS AJAX CALL 
         $.ajax(
         { 
          url: SERVER_PATH + 'testtransaction', 
          type: 'post', 
          async: true, 
          data: { intId: data.id }, 
          success:function(data) 
          { 
          //DO NOTHING 
         }, 
         }); 
         //I DO NOT WANT USERS TO WAIT FOR THIS AJAX CALL 
    
         location.reload(); 
        }, 
    });  
    

Но страницы перезагружаются мой AJAX вызов также получить исчезли без завершения AJAX запроса.

Так может быть сделано в этом случае? Я хочу получить более подробную информацию, пожалуйста, дайте мне знать.

Я не хочу, чтобы пользователи подождали еще одну запись 1000 (плюс отправка EMAILS этим 1000 записям), которые были внесены в базу данных.

+1

@NeilA, спасибо большое за улучшение вопроса. – NullPointer

+0

Просто рад помочь –

+0

Я никогда не использовал их, но как насчет использования вызова Ajax для [начала cronjob] (http://stackoverflow.com/questions/4421020/use-php-to-create-edit-and- удалить-CRONTAB-заданий)? – Terminus

ответ

1

Это просто!

После одной вставки вы можете позвонить в отдельный фоновый процесс:

public function addtotest() 
{ 
    $strSql = "INSERT INTO test ..."; 
    $intId = $this->db->execute($strSql); 
    exec('php /your/php/cli/script.php param1 param2 paramN 1>> /dev/null 2>> /dev/null &'); 
    echo $intId; 
} 

С «&» процесс запускается в фоновом режиме, так что вы можете продолжать и не должны ждать, пока сценарий не будет завершен.

Или вы можете добавить эту работу в «отложенные задачи» и запустить эти задачи с помощью cron.

+0

будет ли мой MVC-url работать с 'exec'? Как у меня есть url 'SERVER_PATH. «controller/addtotest/id/1' – NullPointer

+0

Не знаю о вашей структуре, но многие фреймворки поддерживают режим CLI. Например:/usr/bin/php /path/do/cli-index.php -q controller/addtest/id/1 – Deep

+0

@NullPointer или ... вы можете позвонить на свой сайт с помощью curl или wget: exec ('wget http: //domain.tld/controller/addtotest/id/1 1 >>/dev/null 2 ​​>>/dev/null & '), но это небезопасно, потому что, возможно, для этого действия требуется auth/login. – Deep

1

Не используйте для этого AJAX. Вам нужен CRONJOB с базовым разбиением на страницы.

В одном файле извлечения файла php и после этой последовательности списка на 500 запросов для каждой последовательности. И с header() перенаправление на следующий 500, пока вы не достигнете конца.Это не повлияет на пользовательский опыт, и ypu будет иметь хорошие результаты.

1

Вы можете вставить все строки одним запросом sql.

INSERT INTO test_transaction (col1, col2) 
VALUES (value11, value12), 
(value21, value22), 
(value31, value32), 
... 
(value10001, value10002); 
+0

Да. Я уже делал то же самое для этого. – NullPointer

3

Просто создайте триггер базы данных. Итак, когда запись вставляется в первую таблицу , она вставляется в таблицу транзакций или SO.

Exampl -

CREATE TRIGGER trg_Table1_INSERT 
ON dbo.Table1 AFTER INSERT 
AS BEGIN 
    INSERT INTO dbo.Table2(SerialNo, Name) 
    SELECT SerialNo, Name 
    FROM Inserted 

    INSERT INTO dbo.Table3(SomeOtherCol) 
    SELECT SomeOtherCol 
    FROM Inserted 
END 
+0

Я думаю, мы не можем получить информацию о запросе в триггерах. Я прав ? – Nandakumar

+0

Мы не нуждаемся в запросе информации, я думаю. Нам нужен только идентификатор вставки. Обновлено. – Steve

+1

Добавление «триггера» было бы хорошей идеей, что мне не нужно ждать его на Front-End. – NullPointer

Смежные вопросы