2012-02-05 22 views
5

tôi tạo động đồ họa trong bộ điều khiển của tôi:Symfony - hình ảnh trong phản ứng - tốc độ, tối ưu hóa

  1. nếu không nộp tồn tại (tên tập tin duy nhất) sau đó tạo ra đồ họa và lưu nó

  2. trở RedirectResponse ($ url)

(3. tôi đã thử thêm:

$fp = fopen($url, "rb"); 
    $str = stream_get_contents($fp); 
    fclose($fp); 

    $response = new Response($str, 200); 
    $response->headers->set('Content-Type', 'image/png'); 
    return $response; 

)

Tôi cần nó để tạo các thanh tác động động cho người dùng [trên đồ họa này một số văn bản sẽ tự động cập nhật nếu một số thay đổi sẽ được thực hiện trên trang web của tôi].

Vì vậy, điều quan trọng đối với tôi là tập lệnh này hoạt động nhanh và không giết máy chủ/bandwitch của tôi. Để đạt được điều đó tôi đã tạo bộ nhớ cache, nơi tất cả các đồ họa được tạo ra được lưu trữ. Nhưng tôi đã có một vấn đề với tốc độ, giải pháp mà tôi đã mô tả ở trên là khá chậm, khi tôi đã thử nghiệm nó trong chrome với công cụ phát triển (F12) sau đó nó cho tôi thấy rằng cả hai giải pháp (2. và 3.) mất khoảng ~ 1s (khi cùng một đồ họa [không có bộ điều khiển, vv chỉ url trực tiếp đến .png] tải 44ms).

Vì vậy, nếu chỉ cho tôi, nó mất khoảng ~ 1s cho mỗi đồ họa sau đó, nếu ví dụ 1000 người dùng sẽ tạo ra cùng một lúc đồ họa này nó có thể làm chậm trang web của tôi tôi nghĩ.

Vui lòng trợ giúp, bạn có biết cách nào để thực hiện điều đó nhanh hơn không?

PS. Chuyển hướng không phải là điều mong muốn nhất đối với tôi, bởi vì tôi muốn để lại url như nó, ví dụ smth/username/userbar/insted của smth/img/userbars/cache/blabla.png. Nhưng nếu nó sẽ nhanh hơn nhiều thì tôi có thể chịu đựng được :).

EDIT: Để rõ ràng: Tôi không tìm giải pháp cho hình ảnh bộ nhớ cache, sự cố của tôi là trả về hình ảnh qua bộ điều khiển (hình ảnh đã tạo, chỉ từ ftp) mất khoảng 1 giây, khi bình thường nếu bạn làm ví dụ

  <img src="direct_url_to_png"> 

phải mất khoảng 44ms.

Trả lời

3

Bạn có thể sử dụng Varnish để lưu hình ảnh, Varnish là một proxy HTTP nằm ở phía trước máy chủ web. Phải mất một khoảng thời gian & kiến ​​thức để định cấu hình, nhưng nó là rất phần mềm tốt.

Hoặc, bạn có thể lưu hình ảnh trong bộ nhớ bằng cách sử dụng shared memory, memcache hoặc redis. Điều này có lẽ sẽ ít hiệu quả hơn Varnish, nhưng nó sẽ tiết kiệm IO hệ thống tập tin.

Bạn nên kiểm tra nơi nhiều thời gian nhất, tôi hy vọng đó là một sự kết hợp của tập tin I/O và PHP thời gian phân tích, nhưng như chúng ta nói bằng tiếng Hà Lan, "đo là biết";)

Dưới đây là một cách đơn giản ví dụ sẽ cung cấp cho bạn ý tưởng chung về cách thực hiện điều đó:

<?php 
class MyClass 
{ 
    function __construct() 
    { 
    $this->timer = array(
     'start' => microtime(True); 
    ); 
    } 

    function myAction() 
    { 
    $this->timer['startaction'] = microtime(True); 

    $fp = fopen($url, "rb"); 
    $this->timer['startstream'] = microtime(True); 
    $str = stream_get_contents($fp); 
    fclose($fp); 
    $this->timer['endstream'] = microtime(True); 

    $response = new Response($str, 200); 
    $response->headers->set('Content-Type', 'image/png'); 

    $this->timer['endaction'] = microtime(True); 
    print_r($this->timer) 
    return $response; 
    } 
} 

Một điều khác có thể là tùy chọn sử dụng HTML/CSS để hiển thị biểu đồ. Điều này có thể hoặc có thể không hoạt động tùy thuộc vào đồ thị của bạn trông như thế nào nhưng tôi đã sử dụng nó trong quá khứ và nó hoạt động khá tốt.

+0

"là sử dụng HTML/CSS để hiển thị biểu đồ" ý của bạn là gì? Tôi không nhìn thấy nó bởi vì tôi cần đầu tiên để có được một số số liệu thống kê từ cơ sở dữ liệu, vì vậy tôi sẽ prefere để vượt qua nó bằng điều khiển. Tôi nghĩ rằng một vấn đề là trả lại hình ảnh này (sử dụng stream_get_contents hoặc chuyển hướng mất khoảng 800ms). Nhân tiện, có lẽ tôi sai hoàn toàn và giải pháp của tôi không quá tệ? Nếu nó chỉ ảnh hưởng đến tải hình ảnh cho người dùng và nó sẽ không làm chậm máy chủ hơn tôi nghĩ rằng nó có thể được như nó được? Như tôi thấy bạn tập trung vào lưu trữ hình ảnh được tạo ra, nhưng một vấn đề thực sự là trả lại hình ảnh này :). –

+0

Lần này tôi đã viết ở trên đề cập đến việc tải hình ảnh từ bộ nhớ cache. Tải hình ảnh đã tạo từ ftp qua bộ điều khiển mất khoảng 1 giây và tôi muốn cải thiện nó. –

+0

Cảm ơn lời khuyên, tôi đã thử nghiệm nó và nói chung nó không phải là quá xấu. Khi tôi tạo ra đồ họa riêng biệt sau đó nó tải chỉ khoảng 150ms (không quan trọng nếu chuyển hướng hoặc stream_get_contents) vì vậy nó không phải là xấu như vậy tôi nghĩ. Tải nó trực tiếp mất khoảng 32ms, nhưng tôi kiểm tra xem tập tin tồn tại, lấy thông tin từ cơ sở dữ liệu và lấy đồ họa, do đó, nó có vẻ là tốt. –

Các vấn đề liên quan