我在CodeIgniter-Ubuntu Server上运行代码.
我一直在研究运行功能的异步方式.
这是我的功能:
<?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');
}
“ foreach”使用具有慢速API的变量,并更新数据库.
我看到了一些使用fork的教程,但还不太了解它的语法部分.我发现的大部分内容只是对其工作方式的解释(2个过程:parent-child ect’),但没有很好地说明如何将此应用到代码上.
有人可以解释我如何使用fork()语法吗?
Continue PHP execution after sending HTTP response
http://www.onlinetechtutorials.com/2014/06/how-to-run-php-code-asynchronously.html
http://php.net/manual/en/function.pcntl-fork.php(更一般)
从服务器端:https://www.youtube.com/watch?v=xVSPv-9x3gk
编辑:
我说对了吗?
<?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');
}
?>
这样在循环内使用不会造成任何问题?是否知道要堆叠每个进程?
解决方法:
您必须提及所用的操作系统是什么,因为pcntl扩展名在Windows平台上不可用
另外,您还必须知道,在Web服务器上的Linux / Unix上激活进程控制会给您带来意想不到的结果,因此建议仅使用CLI / CGI模式才能使用PCNTL
请仔细阅读此PCNTL Introduction
现在,您的代码似乎是正确的并且实现良好,但是您必须使用此选项–enable-pcntl编译PHP以启用pcntl函数(如int pcntl_fork(void)),否则您将获得
Fatal error: Call to undefined function pcntl_fork()
对我来说,以异步方式运行函数/方法的最佳解决方案是使用pthreads,如果您对此建议感兴趣,我可以通过添加示例以及如何在Windows或Linux平台上安装它来编辑我的响应.
阅读this article知道如何编译PHP