首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Php代码点火器中的多线程/异步

Php代码点火器中的多线程/异步
EN

Stack Overflow用户
提问于 2016-09-14 12:12:34
回答 1查看 2.9K关注 0票数 0

在我的控制器中,我使用视图加载HTML。现在,在加载视图之前,我需要再调用两个函数。所以,它等待函数1完成(5-6秒),然后等待第二个函数完成(5-6秒),然后加载视图。是否可以同时运行这两个函数以使视图运行得更快?

公共函数索引(){ $empid = "12345";//运行函数/步骤/进程/一个$this->function2 1($empid);//运行函数/ step / process /两个$this->function2 2($empid);$this->load->视图(“欢迎”,$data);

EN

回答 1

Stack Overflow用户

发布于 2016-09-16 15:44:48

答案是使用PHP的exec()函数。(exec()这里有更多的信息.)这可以通过以下几种方式实现:

  1. 创建将被执行的独立php文件。
  2. 创建一个将被执行的控制器。

选项1可以非常轻,因为您只需要创建一个php文件与您想要运行的代码。但它无法访问Codeigniter库。如果您确实需要/希望在“流程”中使用CI,那么选项2就是您想要的。

我将展示如何实现选项2,这利用了Codeigniter从命令行(CLI)运行的能力。(在这里读到这件事。)我们将通过使用exec()来模拟该功能。

这是用来证明函数被调用和工作的设置。它们基本上会运行一些耗时的任务很多次,所以我们实际上可以看到浏览器在执行时被阻塞了。

创建一个带有要通过exec()调用的方法的控制器,并将其放入application/controllers中。

Tools.php

代码语言:javascript
复制
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()的控制器。

代码语言:javascript
复制
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赋值的两行。

代码语言:javascript
复制
$command = "php ".FCPATH."index.php tools proc1 $param > /dev/null &";

代码语言:javascript
复制
$command = "php ".FCPATH."index.php tools proc2 $param > /dev/null &";

> /dev/null &本质上告诉php将返回到黑洞。这意味着没有人需要等待这一过程的完成。

刷新页面。嗯!没有阻挡!

因为我们不关心这些procs返回任何东西,所以我的示例中的代码行可以删除。所以proc1()看起来像这样

代码语言:javascript
复制
public function proc1($param = 1)
{
    for($i = 1; $i < $param; $i++)
    {
        sqrt($i);
    }
}

所以。对于您的特殊情况:在问题的index()方法中,替换以下行

代码语言:javascript
复制
$this->function1($empid);
$this->function2($empid);

带着这些

代码语言:javascript
复制
$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提供的内容。

这已经足够长了,但是如果您想了解如何在不涉及代码点火器的情况下实现这一点,请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39490160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档