我在我的Ubuntu服务器上安装了fork(使用PHP-Apache-Codeigniter),并检查它是否正在使用var_dump (extension_loaded('pcntl'));
并且得到了一个" true"输出(How to check PCNTL module exists)。
我有这段代码:
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";
// Create fork
$pid = pcntl_fork();
if(!$pid){
for ($i=0; $i < $keyword_count ; $i++) {
// Inserts the inputs to the "keywords" table
$this->kas_model->insert_keyword($keyword[$i], $prod, $country);
// Gets relevant IDs for the inserted prod and keyword
$last_inserted_key = $this->kas_model->get_last_rec('keywords');
$keyword_id = $last_inserted_key[0]->key_id;
$prod_id = $last_inserted_key[0]->key_prod;
$prod_id_query = $this->kas_model->get_prod_row_by_id($prod_id);
$prod_id_a = $prod_id_query[0]->prod_a_id;
$prod_id_b = $prod_id_query[0]->prod_b_id;
// Run the keyword query (on API) for today on each one of the keys and insert to DB aslong that the ID isn't 0.
if ( ($prod_id_a != 0) || ( !empty($prod_id_a) ) ) {
$a_tdr = $this->get_var1_a_by_id_and_kw( $prod_id_a, $keyword[$i], $country);
} else {
$a_tdr['var1'] = 0;
$a_tdr['var2'] = 0;
$a_tdr['var3'] = 0;
}
if ( ($prod_id_b != 0) || ( !empty($prod_id_b) ) ) {
$b_tdr = $this->get_var1_b_by_id_and_kw($prod_id_b, $keyword[$i], $country);
} else {
$b_tdr['var1'] = 0;
$b_tdr['var2'] = 0;
$b_tdr['var3'] = 0;
}
$this->kas_model->insert_new_key_to_db($keyword_id, $a_tdr['var1'], $b_tdr['var1'], $a_tdr['var2'], $b_tdr['var2'], $a_tdr['var3'], $b_tdr['var3']);
}
exit($i);
}
// we are the parent (main), check child's (optional)
while(pcntl_waitpid(0, $status) != -1){
$status = pcntl_wexitstatus($status);
// echo "Child $status completed\n";
redirect('main/kas');
}
redirect('main/kas');
}
该功能的作用是什么?
此函数获取1个或多个关键字/ s,国家/地区变量和产品ID,并对外部慢速API获取变量运行查询(从同一个控制器中运行其他函数),并将它们添加到数据库中。
问题:运行此功能时,如果我插入大量关键字,页面会长时间加载,加载和加载,直到完成为止,只有然后 - 我可以继续浏览我的网站。所以我被告知要分叉,因为它只是发送请求在后台处理它,所以每当点击提交按钮时,我都会被重定向到&#34; main / kas&#34;。
目前:我没有被重定向,但该功能运行没有任何错误。
有人告诉我它假设工作但不是 - 所以我猜测我在代码中做错了什么(?),或者其他什么东西都没有在服务器(???)。这是我第一次使用fork,所以我不知道如何使用fork(在语法中或在服务器内)。
你能帮我调试一下这个问题吗?
答案 0 :(得分:0)
http://www.electrictoolbox.com/mysql-connection-php-fork/
错误原因父级和子级进程共享相同的内容 数据库连接。当第一个子进程退出时它会 断开与数据库的连接,这意味着所有连接都是相同的 进程正在使用将被断开,导致任何进一步的查询 失败。
解决方案解决方案是先断开与数据库的连接 分叉子进程,然后在每个进程中建立新连接 处理。第四个参数也应该传递给 mysql_connect函数为“true”以确保建立新链接; 默认是共享现有连接是登录详细信息 是一样的。
问题是!
连接到孩子的服务器是否有效,如果有其他替代方法可以更好地做到这一点。