在我的控制器中,我使用视图加载HTML。现在,在加载视图之前,我需要再调用两个函数。所以,它等待函数1完成(5-6秒),然后等待第二个函数完成(5-6秒),然后加载视图。是否可以同时运行这两个函数以使视图运行得更快?
公共函数索引(){ $empid = "12345";//运行函数/步骤/进程/一个$this->function2 1($empid);//运行函数/ step / process /两个$this->function2 2($empid);$this->load->视图(“欢迎”,$data);
发布于 2016-09-16 15:44:48
答案是使用PHP的exec()函数。(exec()和这里有更多的信息.)这可以通过以下几种方式实现:
选项1可以非常轻,因为您只需要创建一个php文件与您想要运行的代码。但它无法访问Codeigniter库。如果您确实需要/希望在“流程”中使用CI,那么选项2就是您想要的。
我将展示如何实现选项2,这利用了Codeigniter从命令行(CLI)运行的能力。(在这里读到这件事。)我们将通过使用exec()来模拟该功能。
这是用来证明函数被调用和工作的设置。它们基本上会运行一些耗时的任务很多次,所以我们实际上可以看到浏览器在执行时被阻塞了。
创建一个带有要通过exec()调用的方法的控制器,并将其放入application/controllers中。
Tools.php
class Tools extends CI_Controller
{
public function proc1($param = 1)
{
$time_start = microtime(true);
for($i = 1; $i < $param ; $i++)
{
sqrt($i);
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$iters = number_format($param);
echo "Proc1 calculated $iters square roots in $time seconds\n";
}
public function proc2($param = 1)
{
$time_start = microtime(true);
for($i = 1; $i < $param; $i++)
{
log10 ($i);
}
$time_end = microtime(true);
$time = $time_end - $time_start;
$iters = number_format($param);
echo "Proc2 calculated $iters Base-10 logarithms in $time seconds\n";
}
}下面是调用exec()的控制器。
class Proc_test extends CI_Controller
{
public function __construct()
{
parent::__construct();
}
public function index()
{
echo "Index is running<br>";
$param = 5000000;
$command = "php ".FCPATH."index.php tools proc1 $param";
$out = [];
exec($command, $out);
var_dump($out);
$command = "php ".FCPATH."index.php tools proc2 $param";
$out = [];
exec($command, $out);
var_dump($out);
echo "Procs have been called";
}
}调用新控制器,例如`测试‘
当$param设置为500万时,我的系统需要超过8秒才能显示结果。尝试几次更改$param的值以查看不同的结果。
显然,我们不想让浏览器阻塞。这是通过Proc_test.php中的简单更改来修正的。
更改为$command赋值的两行。
$command = "php ".FCPATH."index.php tools proc1 $param > /dev/null &";和
$command = "php ".FCPATH."index.php tools proc2 $param > /dev/null &";> /dev/null &本质上告诉php将返回到黑洞。这意味着没有人需要等待这一过程的完成。
刷新页面。嗯!没有阻挡!
因为我们不关心这些procs返回任何东西,所以我的示例中的代码行可以删除。所以proc1()看起来像这样
public function proc1($param = 1)
{
for($i = 1; $i < $param; $i++)
{
sqrt($i);
}
}所以。对于您的特殊情况:在问题的index()方法中,替换以下行
$this->function1($empid);
$this->function2($empid);带着这些
$command = "php ".FCPATH."index.php tools function1 $empid > /dev/null &";
exec($command);
$command = "php ".FCPATH."index.php tools function1 $empid > /dev/null &";
exec($command);显然,必须在Tools.php中更改函数名,以匹配您向$command提供的内容。
这已经足够长了,但是如果您想了解如何在不涉及代码点火器的情况下实现这一点,请告诉我。
https://stackoverflow.com/questions/39490160
复制相似问题