【问题标题】:fork doesn't work although I checked it's installed and running on my server尽管我检查了它已在我的服务器上安装并运行,但 fork 不起作用
【发布时间】:2016-04-19 12:04:15
【问题描述】:

我在我的 Ubuntu 服务器上安装了 fork(使用 PHP-Apache-Codeigniter),并使用 var_dump (extension_loaded('pcntl')); 检查它是否正常工作,并得到“真实”输出 (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 个或多个关键字、一个国家/地区变量和一个产品 ID,并在外部慢速 API 上运行查询以获取变量(从同一控制器内运行其他函数),并将它们添加到数据库中.

问题:运行这个函数时,如果我插入很多关键字,页面加载,加载,加载,很长一段时间,直到完成,只有 然后 - 我可以继续浏览我的网站。所以我被告知要分叉它,因为它只是发送一个在后台处理它的请求,所以每当点击提交按钮时,我都会被重定向到“main/kas”。

目前:我没有被重定向,但函数运行时没有任何错误。

有人告诉我它应该可以工作,但事实并非如此 - 所以我猜我在代码中做错了什么(?),或者其他东西在服务器中没有工作(???)。这是我第一次使用 fork,所以我不太了解如何使用 in(在语法中或从服务器内部)。

您能帮我调试一下问题吗?

【问题讨论】:

  • 它会进入孩子吗?
  • 是的!它完成了所有过程,但只是不重定向并跳转到父级。我仍然让表单卡住,直到它完成加载所有内容,并且它不会重定向到 main/kas 并在代码中声明:X
  • 我看到了一些 fork 的例子,我认为几乎所有这些例子都在 for 循环内而不是在它之外,这有什么关系吗?或者我可以在 fork 任务中运行一个整体来查找?
  • 您正在等待子进程完成重定向。这就是你想要的吗?
  • 不,每当提交表单时,我希望它立即重定向并启用在后台运行进程时浏览网站。

标签: php codeigniter fork ubuntu-server


【解决方案1】:

http://www.electrictoolbox.com/mysql-connection-php-fork/

错误原因父子进程都共享同一个 数据库连接。当第一个子进程退出时,它将 从数据库断开,这意味着相同的连接全部 正在使用的进程将断开连接,导致任何进一步的查询 失败。

解决方法 解决方法是先断开与数据库的连接 分叉子进程,然后在每个子进程中建立一个新的连接 过程。第四个参数也应该传递给 mysql_connect 函数为“true”以确保建立新链接; 默认是共享一个现有的连接是登录详细信息 是一样的。

问题是!

连接到子服务器的效率高吗?是否有任何其他替代方法可以更好地做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    相关资源
    最近更新 更多