Codeigniter:使api调用独立于控制器

时间:2015-02-05 16:10:35

标签: php codeigniter curl asynchronous

不确定这是否可行,但我正在尝试拨打多个api,但我不希望用户等待呼叫完成。一旦他们提交了表单,我希望他们转到下一页(控制器中的Next函数)并对apis进行异步调用。仅供参考我使用的是codeigniter框架。

3 个答案:

答案 0 :(得分:1)

PHP脚本本身是单线程的。有方法可以" fork" PHP中的子进程使用pcntl_fork函数。到目前为止,我知道,这只适用于CLI sapi。

分叉进程将导致请求被克隆到精确的副本中,尽管它具有自己的地址空间。直到fork的那一刻,父和子(forked)进程都将完全相同,例如:到那时为止的任何变量在两个进程中都是完全相同的。分叉后,在一个过程中更改变量的值不会影响另一个过程

你也可以尝试curl_multi_init。它允许异步处理多个cURL句柄。

另一个解决方案可能是pthreads。在线程完成时,在原始线程中处理第二个线程的结果。如果在线程之间传输数据或通过synchronized(),notify()和wait()保持两个线程中的多个步骤的执行同步,则线程确实优于多处理。

答案 1 :(得分:0)

这样的事情应该有效。

基本上你想在提交时调用API。

API调用将具有代码,该代码可确保即使客户端不再侦听响应,脚本也会完成执行。

jQuery AJAX

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

API致电

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
    }

}

答案 2 :(得分:0)

我认为解决方案是在下一页上进行几次Ajax调用。 这些调用不需要直接转到API,而是转到服务器上调用API的多个代理PHP脚本。