PHP CodeIgniter:如何在后台运行进程而不使整个网站陷入困境

PHP CodeIgniter:如何在后台运行进程而不使整个网站陷入困境,php,asynchronous,process,Php,Asynchronous,Process,我在Ubuntu LAMP服务器上有一个网站,它有一个表单,可以获取变量,然后将变量提交给处理变量的函数。该函数调用控制器中的其他函数,这些函数“分解”变量,在数组中对它们进行排序,并对每个变量运行“for”循环,从慢速API获取新数据,并将新数据插入数据库中的相关表中 每当我提交表单时,整个网站都会被卡住(仅针对我的IP,在其他桌面上,网站会继续正常工作),我会被重定向,直到到达请求的“重定向”(new/url);“ 我研究这个问题已经有一段时间了,我发现这篇文章就是一个例子: 在研究了这在

我在Ubuntu LAMP服务器上有一个网站,它有一个表单,可以获取变量,然后将变量提交给处理变量的函数。该函数调用控制器中的其他函数,这些函数“分解”变量,在数组中对它们进行排序,并对每个变量运行“for”循环,从慢速API获取新数据,并将新数据插入数据库中的相关表中

每当我提交表单时,整个网站都会被卡住(仅针对我的IP,在其他桌面上,网站会继续正常工作),我会被重定向,直到到达请求的“重定向”(new/url);“

我研究这个问题已经有一段时间了,我发现这篇文章就是一个例子:

在研究了这在服务器端的工作原理之后,这在本视频中得到了很好的解释:

我想开始学习如何编写它的语法,并发现这只在CLI上有效,而不是在APACHE上,但我不确定

几天前我打开了这篇文章:

在服务器端完成所有工作后,安装fork并找出服务器中php.ini文件的不同之处(我编辑了apache2 php.ini,不要弄错),我停止了获取用于“fork”的错误,但进程不会在后台运行,也没有重定向

这是添加fork后的控制器:

<?php   

// Registers a new keyword for prod to the DB. 
public function add_keyword() {

    $keyword_p = $this->input->post('key_word');

    $prod      = $this->input->post('prod_name');
    $prod      = $this->kas_model->search_prod_name($prod);
    $prod      = $prod[0]->prod_id;

    $country   = $this->input->post('key_country');

    $keyword = explode(", ", $keyword_p);
    var_dump($keyword); 
    $keyword_count = count($keyword);
    echo "the keyword count: $keyword_count";

    for ($i=0; $i < $keyword_count ; $i++) { 
        // create your next fork
        $pid = pcntl_fork();

        if(!$pid){
            //*** get new vars from $keyword_count
            //*** run API functions to get new data_arrays
            //*** inserts new data for each $keyword_count to the DB 
            print "In child $i\n";
            exit($i);
            // end child
        }
    }

    // we are the parent (main), check child's (optional)
    while(pcntl_waitpid(0, $status) != -1){
        $status = pcntl_wexitstatus($status);
         echo "Child $status completed\n";
    }

    // your other main code: Redirect to main page. 
    redirect('banana/kas'); 

}
?>

您真正想要的是一个队列或作业系统。有一个脚本一直在运行,等待执行某些操作。一旦您的原始PHP脚本运行,它只会将一个作业添加到列表中,并可以像正常情况一样继续它的过程

这里有一些这样的实现——看看下面的例子

// Registers a new keyword for prod to the DB. 
public function add_keyword() {

    $keyword_p = $this->input->post('key_word');

    $prod      = $this->input->post('prod_name');
    $prod      = $this->kas_model->search_prod_name($prod);
    $prod      = $prod[0]->prod_id;

    $country   = $this->input->post('key_country');

    $keyword = explode(", ", $keyword_p);
    var_dump($keyword); 
    $keyword_count = count($keyword);
    echo "the keyword count: $keyword_count";

    // problematic part that needs forking
    for ($i=0; $i < $keyword_count ; $i++) { 

        // get new vars from $keyword_count
        // run API functions to get new data_arrays
        // inserts new data for each $keyword_count to the DB 

    }

    // Redirect to main page. 
    redirect('banana/kas'); 

}