Не совсем уверен, если это возможно, но я пытаюсь вызвать несколько API, но я не хочу, чтобы пользователь дождался завершения вызова. Как только они отправят форму, я хотел бы, чтобы они перешли на следующую страницу (Следующая функция в контроллере) и сделали асинхронный вызов API. К вашему сведению, я использую рамки codeigniter.
Сценарии PHP сами по себе являются однопоточными. Есть способы «разветвить» дочерние процессы в PHP, используя pcntl_fork функция. насколько я знаю, это действительно хорошо работает только с сапи CLI.
Формирование процесса приведет к клонированию запроса в точную копию, хотя и с собственным адресным пространством. И родительский, и дочерний (разветвленный) процессы будут одинаковыми вплоть до момента разветвления, например: любые переменные до этой точки будут одинаковыми в обоих процессах. После разветвления изменение значения переменной в одном процессе не влияет на другой процесс
Вы также можете попробовать curl_multi_init. это позволяет асинхронно обрабатывать несколько дескрипторов cURL.
другое решение может быть Pthreads. после завершения потока обработайте результат второго потока в исходном потоке. Потоки действительно получают преимущество над многопроцессорностью, если необходимо передавать данные между потоками или синхронизировать выполнение нескольких шагов в обоих потоках через synchronized (), notify () и wait ().
Я думаю, что решение было бы сделать несколько вызовов Ajax на следующей странице.
Эти вызовы должны идти не напрямую к API, а к нескольким прокси-скриптам PHP на вашем сервере, которые вызывают API.
Нечто подобное должно работать.
В основном вы хотите вызвать 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
}
}