Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP+;fork():如何在PHP代码中运行fork_Php_Codeigniter_Asynchronous_Fork - Fatal编程技术网

PHP+;fork():如何在PHP代码中运行fork

PHP+;fork():如何在PHP代码中运行fork,php,codeigniter,asynchronous,fork,Php,Codeigniter,Asynchronous,Fork,我正在CodeIgniter-Ubuntu服务器上运行我的代码 我一直在研究运行函数的异步方法 这是我的职责: <?php // Registers a new keyword for prod to the DB. public function add_keyword() { $keyword_p = $this->input->post('key_word'); $prod = $this->i

我正在CodeIgniter-Ubuntu服务器上运行我的代码

我一直在研究运行函数的异步方法

这是我的职责:

<?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'); 

    }

您的pcntl_fork()后面有一个fork,请选中$pid,然后您就可以使用它了。重复以上步骤以获得更多叉子

<?php
    for($i = 1; $i <= 3; ++$i){
        // create your next fork
        $pid = pcntl_fork();

        if(!$pid){
            // begin child, your execution code
            sleep(1);
            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
?>

您必须提及您正在使用的操作系统,因为Windows平台上没有pcntl扩展
您还必须知道,在web服务器中的Linux/Unix上激活进程控制可能会产生意外的结果,因此建议仅使用CLI/CGI模式来使用PCNTL
请仔细阅读这个

现在,您的代码似乎是正确的,并且实现得很好,但是您必须使用以下选项编译PHP
——enable pcntl
以启用像
int pcntl\u fork(void)
这样的pcntl函数,否则您将得到

致命错误:调用未定义的函数pcntl_fork()

对我来说,以异步方式运行函数/方法的最佳解决方案是使用,如果您对这个建议感兴趣,我可以通过添加示例以及如何在Windows或Linux平台上安装来编辑我的响应


阅读了解如何编译PHP据我所知,您可以通过两种方式实现这一点

使用:
  • Pthreads是一个并行处理库,而amp是一个纯异步框架

    因此,使用pthreads的方法是首先下载/启用pthreads扩展,并在php.ini文件中添加
    extension=/path/to/pthread.So

    然后创建一个类,它扩展
    线程
    类并重写方法运行,并将所有内容放入其中,这是您希望并行执行的

    因此,出于您的特定目的,课程可以是这样的:

    <?php
    class Inserter extends Thread {
        public $db_con = null;
        public $data;
    
        public function __construct($db_connection, $data) {
            $this->db_con = $db_connection;
            $this->data = data;
        }
    
        private function run() {
            // use your logic to insert the data...
        }
    }
    
    其中,
    $dbConn
    存储数据库连接,
    $data
    存储必要的数据


    就这样……

    Hi@thecoder,谢谢您的快速回复:)!我按照你的例子编辑了我的主代码,你能看一下并告诉我我是否正确吗?我想是的,但如果没有完整的源代码作为例子,我就无法测试它。这不管用。。我得到了同样的错误
    致命错误:调用未定义的函数pcntl_fork()
    我再次阅读了您的评论并看到了多URL。我想这就是我所需要的。问题是-当点击提交按钮时,这是否会在后台运行进程,并立即将我重定向到另一个请求页面,而数据库正在获取更多数据。谢谢您的关注!:)我编辑:
    root@MYserver:/etc/php5/apache2#nano/etc/php5/apache2/php.ini
    并添加了
    disable\u functions=pcntl\u报警,pcntl\u fork,,,,,,,,
    重新启动服务器之前,我仍然收到相同的错误:SOh,那么你是说我不能在我的PHP代码中实际使用它/我不明白我需要用
    做什么——启用pcntl
    @RickSanchez你需要做的是在你的机器上编译PHP,以便能够使用pcntl:)你可以按照这个教程来做哦,我根据你之前的评论编辑了我的主要帖子,我使用的是Ubuntu服务器。我对它有点陌生,只是不理解
    --启用pcntl
    的概念,以及我应该如何使用它(通过终端/油灰?)。我不认为在您的情况下使用fork是最好的解决方案。我宁愿使用在cron中调度的简单队列和工作者脚本
    <?php
    class Inserter extends Thread {
        public $db_con = null;
        public $data;
    
        public function __construct($db_connection, $data) {
            $this->db_con = $db_connection;
            $this->data = data;
        }
    
        private function run() {
            // use your logic to insert the data...
        }
    }
    
    $inserter = new Inserter($dbConn, $data);
    $inserter->start();