PHP+;fork():如何在PHP代码中运行fork
我正在CodeIgniter-Ubuntu服务器上运行我的代码 我一直在研究运行函数的异步方法 这是我的职责: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
<?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();