Codeigniter: сделать вызовы API независимыми от контроллера

Не совсем уверен, если это возможно, но я пытаюсь вызвать несколько API, но я не хочу, чтобы пользователь дождался завершения вызова. Как только они отправят форму, я хотел бы, чтобы они перешли на следующую страницу (Следующая функция в контроллере) и сделали асинхронный вызов API. К вашему сведению, я использую рамки codeigniter.

0

Решение

Сценарии PHP сами по себе являются однопоточными. Есть способы «разветвить» дочерние процессы в PHP, используя pcntl_fork функция. насколько я знаю, это действительно хорошо работает только с сапи CLI.

Формирование процесса приведет к клонированию запроса в точную копию, хотя и с собственным адресным пространством. И родительский, и дочерний (разветвленный) процессы будут одинаковыми вплоть до момента разветвления, например: любые переменные до этой точки будут одинаковыми в обоих процессах. После разветвления изменение значения переменной в одном процессе не влияет на другой процесс

Вы также можете попробовать curl_multi_init. это позволяет асинхронно обрабатывать несколько дескрипторов cURL.

другое решение может быть Pthreads. после завершения потока обработайте результат второго потока в исходном потоке. Потоки действительно получают преимущество над многопроцессорностью, если необходимо передавать данные между потоками или синхронизировать выполнение нескольких шагов в обоих потоках через synchronized (), notify () и wait ().

1

Другие решения

Я думаю, что решение было бы сделать несколько вызовов Ajax на следующей странице.
Эти вызовы должны идти не напрямую к API, а к нескольким прокси-скриптам PHP на вашем сервере, которые вызывают API.

0

Нечто подобное должно работать.

В основном вы хотите вызвать API при отправке.

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

JQuery AJAX

$('form').on('submit', function(){
// call the API
$.get('www.yoursite.com/api_caller/callApi');
});

API Call

class Api_caller extends CI_Controller {

public function __construct(){
// Even if you navigate away from page then
// this script will finish
ini_set('ignore_user_abort', '1');
}

public function callApi ($name = '') {
// Call your API(s) with CURL
}

}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector