Задать вопрос
@gccDenys

Как запустить хранимую процедуру MySQL в PHP, и не дожидаться ответа?

Есть хранимая процедура, он достает селектом большую выборку юзеров, и делает по ним инсерты. Иногда везет и время выполнения 0,0010, но чаще всего это 4-5 секунд. Эта процедура будет всегда выполнена, и я не нуждаюсь в ожидании ответа. Как можно запустить функцию в /dev/null? Или что нужно изменить в храненке что бы она поставила все в очередь и не томила ожиданием.
  • Вопрос задан
  • 307 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@gccDenys Автор вопроса
Естественно после написания вопроса пришел и ответ.
Сделал так:
Код вызывающий процедуру в отдельный файл и вызвал его
exec("bigProcedure.php $user_id $amount $orderId >/dev/null 2>&1 &");

Теперь все летает
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@stcmd04236
А нельзя ли использовать триггеры?
Ответ написан
Комментировать
Urvin
@Urvin
Запускать по крону или из очереди событий (beanstalkd ...)
Ответ написан
Комментировать
akubintsev
@akubintsev
Опытный backend разработчик
Помимо вариантов с кроном, триггерами и менеджерами очередей можно попробовать еще mysqlnd, но не факт, что всё заработает сразу гладко:
$link = new mysqli('localhost', 'root', 'password', 'my_db');
$link->query("CALL my_stored_proc();", MYSQLI_ASYNC);

$links = $errors = $reject = array($link);
if ($link->poll($links, $errors, $reject, 0)) {
    foreach ($links as $resultLink) {
        if ($result = $resultLink->reap_async_query()) {
            if (is_object($result)) {
                $result->free();
            }
        }
    }
}
Ответ написан
Комментировать
bagiroff777
@bagiroff777
Веб-разработчик
php.net/manual/ru/function.pcntl-fork.php
Возможно, поможет. Делаю так отправку всяких подтверждений по email и прочее.
Но: выполнение задачи лучше выделять в отдельную функцию, затем exit();
Например:
$pid = pcntl_fork();
if ($pid == -1) {
     die('Нельзя создавать дочерние процессы');
} else if ($pid) {
     pcntl_wait($status);
} else {
    // Наш код
    $this->sendEmail();
    exit(0);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы