关于 php:Codeigniter: 逐步加载 Views

Codeigniter: load Views progressively

我最近将我的抓取/解析 PHP 代码移至 Codeigniter。它使用 cURL 和 SimpleHtmlDom 类从目标 URL 检索数据,这些数据随后由模型函数几个其他库处理。

有几个对外部 Web 和 API 的请求,所以原始 PHP 脚本需要 20 秒才能加载完整的页面,但没关系,因为 PHP 被分成几个块,而下面的进程正在运行页面已经在渲染 HTML,用户可以在处理和显示其余数据时读取 HTML。

切换到 Codeigniter 的问题是,在完全执行 Controller 脚本之前不会呈现 HTML,即使数据进程被拆分为块并由单独的 Views 加载。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class HomePage extends CI_Controller {

public function index()
{
    $this->load->library('simple_html_dom');
    $this->load->library('library1');
    $this->load->library('library2');
    $this->load->library('library3');

    $this->load->model('HomePage_model');
    $this->load->view('templates/header');

    $targeturl = 'http://www.example.com';

      $variable1 = library1::method1($targeturl);
      $variable2 = $this->HomePage_model->method2($targeturl);
      $data1 = array('variable1' => $variable1, 'variable2' => $variable2);

    $this->load->view('first_set_of_data', $data1);

      $variable3 = library2::method2($targeturl);
      $variable4 = $this->HomePage_model->method3($targeturl);
      $data2 = array('variable3' => $variable3, 'variable4' => $variable4);

    $this->load->view('second_set_of_data', $data2);

      $curlinfo = $this->HomePage_model->cURLmethod($targeturl);
      $data3 = array('curlinfo' => $curlinfo);

    $this->load->view('third_set_of_data', $data3);

    $this->load->view('sidebar');
    $this->load->view('templates/footer');
    }
}

/* End of file homepage.php */
/* Location: ./application/controllers/homepage.php */

我并没有试图优化我的代码以使其运行得更快,它已经被修改了好几次......我正在尝试做的是逐步加载视图作为每个视图对应的数据已准备就绪,而其他视图的数据正在处理中。


听起来像是一个不雅的解决方案的问题。我想你被迫砍掉所有视图,以便在另一个视图中不调用任何视图,并根据请求加载每个相关视图。

所以不是 views/index.php 有:

1
2
3
4
5
<html>
<body>
<? $this->load->view('content') ?>
</body>
</html>

你会有 view/index_start.php:

1
2
<html>
<body>

view/index_end.php:

1
2
</body>
</html>

在它们之间,在每个请求之后加载单独的视图。从控制器加载所有视图。同样,不推荐这种设计。

1
echo $this->load->view('file', array(), TRUE)