PHP CodeIgniter:如何在后台运行进程而不使整个网站陷入困境
我在Ubuntu LAMP服务器上有一个网站,它有一个表单,可以获取变量,然后将变量提交给处理变量的函数。该函数调用控制器中的其他函数,这些函数“分解”变量,在数组中对它们进行排序,并对每个变量运行“for”循环,从慢速API获取新数据,并将新数据插入数据库中的相关表中 每当我提交表单时,整个网站都会被卡住(仅针对我的IP,在其他桌面上,网站会继续正常工作),我会被重定向,直到到达请求的“重定向”(new/url);“ 我研究这个问题已经有一段时间了,我发现这篇文章就是一个例子: 在研究了这在服务器端的工作原理之后,这在本视频中得到了很好的解释: 我想开始学习如何编写它的语法,并发现这只在CLI上有效,而不是在APACHE上,但我不确定 几天前我打开了这篇文章: 在服务器端完成所有工作后,安装fork并找出服务器中php.ini文件的不同之处(我编辑了apache2 php.ini,不要弄错),我停止了获取用于“fork”的错误,但进程不会在后台运行,也没有重定向 这是添加fork后的控制器:PHP CodeIgniter:如何在后台运行进程而不使整个网站陷入困境,php,asynchronous,process,Php,Asynchronous,Process,我在Ubuntu LAMP服务器上有一个网站,它有一个表单,可以获取变量,然后将变量提交给处理变量的函数。该函数调用控制器中的其他函数,这些函数“分解”变量,在数组中对它们进行排序,并对每个变量运行“for”循环,从慢速API获取新数据,并将新数据插入数据库中的相关表中 每当我提交表单时,整个网站都会被卡住(仅针对我的IP,在其他桌面上,网站会继续正常工作),我会被重定向,直到到达请求的“重定向”(new/url);“ 我研究这个问题已经有一段时间了,我发现这篇文章就是一个例子: 在研究了这在
<?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');
}