Lưu vào bộ nhớ cache, PHP tạo hình thu nhỏ tải chậm


179

Câu hỏi Phần A (100 tiền thưởng, được trao)
Câu hỏi chính là làm thế nào để tạo trang web này, tải nhanh hơn. Đầu tiên chúng ta cần đọc những thác nước này. Cảm ơn tất cả các đề xuất của bạn về phân tích đọc thác nước. Bằng chứng từ các biểu đồ thác nước khác nhau được hiển thị ở đây là nút cổ chai chính: hình thu nhỏ do PHP tạo. Việc tải dữ liệu không cần giao thức từ CDN do David khuyên dùng đã mang lại tiền thưởng cho tôi, mặc dù làm cho trang web của tôi chỉ nhanh hơn 3% về tổng thể, và trong khi không trả lời nút thắt chính của trang web. Thời gian để làm rõ câu hỏi của tôi, và, một tiền thưởng khác:

Câu hỏi Phần B (100 tiền thưởng, được trao)
Trọng tâm mới bây giờ là giải quyết vấn đề mà 6 hình ảnh jpg gặp phải, điều này gây ra phần lớn sự chậm trễ tải. 6 hình ảnh này là hình thu nhỏ do PHP tạo, nhỏ và chỉ 3 ~ 5 kb, nhưng tải tương đối rất chậm. Lưu ý " thời gian đến byte đầu tiên " trên các biểu đồ khác nhau. Vấn đề vẫn chưa được giải quyết, nhưng một khoản tiền thưởng đã thuộc về James, người đã sửa lỗi tiêu đề mà RedBot đã nhấn mạnh : "Yêu cầu có điều kiện-Nếu điều chỉnh-trả lại toàn bộ nội dung không thay đổi." .

Câu hỏi Phần C (tiền thưởng cuối cùng của tôi: 250 điểm)
Thật không may, sau khi ngay cả lỗi tiêu đề REdbot.org đã được sửa, độ trễ gây ra bởi các hình ảnh do PHP tạo ra vẫn chưa được xử lý. Những gì trên trái đất là những hình thu nhỏ 3 ~ 5Kb nhỏ đang suy nghĩ? Tất cả thông tin tiêu đề đó có thể gửi một tên lửa lên mặt trăng và trở lại. Bất kỳ đề xuất nào về nút cổ chai này đều được đánh giá cao và được coi là câu trả lời có thể, vì tôi bị mắc kẹt trong vấn đề thắt cổ chai này trong bảy tháng nay. Tôi cảm ơn trước.

[Một số thông tin cơ bản trên trang web của tôi: CSS ở trên cùng. JS ở phía dưới (Jquery, JQuery UI, đã mua menu awm / menu.js engine, tab js engine, video swfobject.js) Các dòng màu đen trên hình ảnh thứ hai hiển thị những gì bắt đầu tải. Robot giận dữ là thú cưng của tôi "ZAM". Anh ấy vô hại và thường hạnh phúc hơn.]


Tải thác: Thời gian | http://webpagetest.org nhập mô tả hình ảnh ở đây


Tên miền song song được nhóm | http://webpagetest.org nhập mô tả hình ảnh ở đây


Site-Perf Waterfall | http://site-perf.com nhập mô tả hình ảnh ở đây


Công cụ Pingdom Thác nước | http://tools.pingdom.com

nhập mô tả hình ảnh ở đây


Thác nước GTmetrix | http://gtmetrix.com

nhập mô tả hình ảnh ở đây



11
Tôi nghĩ rằng hầu hết các trình duyệt chỉ thực hiện 20 kết nối cùng một lúc nên sau 20 kết nối đầu tiên phải kết thúc trước khi bắt đầu tiếp theo, do đó, sự chậm lại sau 20

1
Tôi nghĩ rằng bạn đã quên làm lại phiên bản đầu tiên của tên miền của bạn. Ít nhất bạn đã có phần còn lại của họ mặc dù: D
ba mươi

2
Bạn không thể kết hợp một số hình ảnh đó thành các họa tiết?
Marcel Korpel

1
@Dagon, lưu ý rằng HTTP 1.1 RFC yêu cầu ( SHOULD) cho các máy khách HTTP 1.1 sử dụng tối đa 2 kết nối đến máy chủ HTTP 1.1; Tất nhiên HTTP 1.0 mở hơn nhiều.
đăng

1
Các trình duyệt @Dagon cũng sẽ chỉ thực hiện 2 kết nối đồng thời với bất kỳ miền nào.
Bảo vệ

Câu trả lời:


61

Đầu tiên, sử dụng nhiều tên miền đó yêu cầu một số tra cứu DNS. Bạn nên kết hợp nhiều hình ảnh đó thành một sprite thay vì truyền bá các yêu cầu.

Thứ hai, khi tôi tải trang của bạn, tôi thấy hầu hết các chặn (~ 1.25s) trên all.js. Tôi thấy điều đó bắt đầu với (một phiên bản cũ của) jQuery. Bạn nên tham khảo từ Google CDN, để không chỉ giảm thời gian tải mà còn có thể tránh hoàn toàn yêu cầu HTTP cho nó .

Cụ thể, các thư viện jQuery và jQuery UI mới nhất có thể được tham chiếu tại các URL này (xem bài đăng này nếu bạn quan tâm tại sao tôi bỏ qua http:):

//ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js

//ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/jquery-ui.min.js

Nếu bạn đang sử dụng một trong các chủ đề UI UI mặc định, bạn cũng có thể lấy CSS và hình ảnh của nó ra khỏi Google CDN .

Với việc lưu trữ jQuery được tối ưu hóa, bạn cũng nên kết hợp awmlib2.jstooltiplib.jsthành một tệp duy nhất.

Nếu bạn giải quyết những điều đó, bạn sẽ thấy một sự cải thiện đáng kể.


1
Nhận xét tuyệt vời Dave! JQuery 1.3 cũ nhỏ hơn nhiều nên tôi nghĩ trong khi nó hoạt động, nó có thể nhanh hơn. Nhưng tôi thích đề xuất của bạn: Bạn liên kết với Google CDN nào trong Liên kết CDN của tôi? Tôi có thể sử dụng cùng một cách javascript UI JQ không? +1 cảm ơn rất nhiều
Sam

2
Tôi chắc chắn khuyên bạn nên sử dụng phiên bản mới nhất của jQuery (1.4.4 hiện tại). Khi được thu nhỏ và nén, chỉ có một vài byte khác nhau giữa chúng. Tôi đã cập nhật câu trả lời với một vài liên kết đến các phiên bản jQuery và jQuery UI mới nhất trên Google CDN, mà tôi khuyên bạn nên sử dụng.
Dave Ward

1
Mẹo hay với sprite, điều đó sẽ làm giảm số lượng kết nối mở tới máy chủ
JamesHalsall

hiện đang làm việc để giảm các kết nối mở (từ 40 đến nay 30 phút ... lần đẩy cuối cùng là khó khăn nhất vì một số hình ảnh được trộn lại nền và không thể đi vào sprite (hoặc ???)
Sam

Cập nhật cấp tốc độ trang: (96%) Lớp YSlow: (90%) ... và các hình thu nhỏ vẫn chậm như mọi khi!
Sam

17

Tôi đã có một vấn đề tương tự cách đây vài ngày và tôi tìm thấy head.js . Đó là một Plugin Javascript cho phép bạn tải tất cả các tệp JS song song. Mong rằng sẽ giúp.


Đáng kinh ngạc! Làm thế nào tôi có thể bỏ qua điều đó? +1 Tôi sẽ kiểm tra cái này ngay bây giờ. Mùi như một đêm đầy trái cây. Cảm ơn Schattenbaum!
Sam

1
Tôi có thể hỏi bạn có phải là Schattenbaum từ schattenbaum.net không?
Pekka

12

Tôi xa một chuyên gia nhưng ...

Liên quan đến vấn đề này: "Yêu cầu có điều kiện If-Modified-Because trả về toàn bộ nội dung không thay đổi." và ý kiến ​​của tôi.

Mã được sử dụng để tạo Thumbnails nên được kiểm tra như sau:

  1. Có một phiên bản lưu trữ của hình thu nhỏ.
  2. Là phiên bản lưu trữ mới hơn hình ảnh gốc.

Nếu một trong hai điều này là sai, hình thu nhỏ sẽ được tạo và trả lại bất kể điều gì. Nếu cả hai đều đúng thì nên thực hiện kiểm tra sau:

  1. Có tiêu đề HTTP_IF_MODIFIED_SINCE không
  2. Thời gian sửa đổi lần cuối của phiên bản được lưu trong bộ nhớ cache có giống với HTTP_IF_MODIFIED_SINCE không

Nếu một trong hai là sai, hình thu nhỏ được lưu trong bộ nhớ cache sẽ được trả về.

Nếu cả hai điều này đều đúng thì phải trả lại trạng thái 304 http. Tôi không chắc chắn nếu nó được yêu cầu nhưng cá nhân tôi cũng trả lại các tiêu đề Kiểm soát bộ đệm, Hết hạn và Sửa đổi lần cuối cùng với 304.

Liên quan đến GZipping, tôi đã được thông báo rằng không cần phải có hình ảnh GZip nên bỏ qua phần bình luận đó.

Chỉnh sửa: Tôi đã không nhận thấy sự bổ sung của bạn vào bài viết của bạn.

session_cache_limiter('public');
header("Content-type: " . $this->_mime);
header("Expires: " . gmdate("D, d M Y H:i:s", time() + 2419200) . " GMT");
// I'm sure Last-Modified should be a static value. not dynamic as you have it here.
header("Last-Modified: " . gmdate("D, d M Y H:i:s",time() - 404800000) . " GMT");

Tôi cũng chắc chắn rằng mã của bạn cần kiểm tra tiêu đề HTTP_IF_MODIFIED_SINCE và phản ứng với nó. Chỉ cần đặt các tiêu đề này và tệp .htaccess của bạn sẽ không cung cấp kết quả được yêu cầu.

Tôi nghĩ bạn cần một cái gì đó như thế này:

$date = 'D, d M Y H:i:s T'; // DATE_RFC850
$modified = filemtime($filename);
$expires = strtotime('1 year'); // 1 Year

header(sprintf('Cache-Control: %s, max-age=%s', 'public', $expires - time()));
header(sprintf('Expires: %s', date($date, $expires)));
header(sprintf('Last-Modified: %s', date($date, $modified)));
header(sprintf('Content-Type: %s', $mime));

if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
    if(strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) === $modified) {
        header('HTTP/1.1 304 Not Modified', true, 304);
        // Should have been an exit not a return. After sending the not modified http
        // code, the script should end and return no content.
        exit();
    }
}
// Render image data

James bạn đóng đinh bản chất của vấn đề sau khi chỉnh sửa trong câu trả lời của bạn! các If Modified Sincevấn đề dường như làm việc bây giờ! Tuy nhiên, tiêu đề dài / thời gian chờ đợi cho ngón tay cái nhỏ bé vẫn chưa được giải quyết ...
Sam

@James PS REdbot.org nói rằng tiêu đề Hết hạn của bạn là giá trị không chính xác. Tôi nghĩ nó phải là GMT chứ không phải CET?
Sam

@Sam Xin lỗi, máy chủ của tôi ở Vương quốc Anh nên nó tự động tạo ngày GMT. Chỉ cần sử dụng hàm gmdate PHP thay vì ngày. Điều này sẽ tạo ra một ngày GMT liên quan đến thời gian máy chủ của bạn.
James

1
@Sam, Thời gian chờ của bạn là thời gian thực thi tập lệnh. Phải mất một thời gian dài để vượt qua mã của bạn đến điểm bạn gửi tiêu đề của bạn hoặc bạn không thoát sau khi bạn đã gửi tiêu đề của mình.
James

@ dường như không bị tắc nghẽn chút nào ... điều đó có dẫn vấn đề sau đó đến trình tạo hình thu nhỏ php CHỈ không?
Sam

6

Ồ, thật khó để giải thích mọi thứ bằng hình ảnh đó .. Nhưng ở đây, một số cố gắng:

  • các tệp 33-36 tải muộn, vì chúng được tải động trong swf và swf (25) được tải hoàn toàn trước khi tải bất kỳ nội dung bổ sung nào
  • các tệp 20 & 21 có thể (tôi không biết, vì tôi không biết mã của bạn) các thư viện được tải bởi all.js (11), nhưng để 11 thực thi, nó chờ toàn bộ trang (và tài sản) để tải (bạn nên thay đổi nó thành dom rồi)
  • hai tệp 22-32 được tải bởi hai thư viện đó, một lần nữa sau khi chúng được tải hoàn toàn

Điểm thú vị. Tôi đoán là không có gì xung quanh swf ... Làm thế nào tôi có thể thay đổi những gì để sẵn sàng? Tôi có một linh cảm những gì bạn có ý nghĩa. Đó là khi javascript đã sẵn sàng và nói trên tài liệu đã sẵn sàng thế này hay thế kia? tài liệu đó có nên được thay thế bởi dom. yet?
Sam

@Sam nếu bạn đang sử dụng bộ nhớ đệm phía máy khách (và bạn nên như vậy), bạn có thể tải các tài nguyên được sử dụng bởi swf trong js hoặc div ẩn trên trang của bạn để khi swf yêu cầu họ đã ở máy khách.
Bảo vệ

4

Chỉ là một phỏng đoán đơn giản vì loại phân tích này đòi hỏi rất nhiều thử nghiệm A / B: tên miền .ch của bạn dường như khó tiếp cận (các dải màu xanh lục dài trước khi byte đầu tiên xuất hiện).

Điều này có nghĩa là trang web .ch được lưu trữ kém hoặc ISP của bạn không có tuyến đường tốt đến họ.

Với các sơ đồ, điều này có thể giải thích một hit hiệu suất lớn.

Trên một mặt lưu ý, đó là mát mẻ này cụ cuzillion mà có thể giúp bạn sắp xếp ra những thứ phụ thuộc vào đặt hàng của bạn của ressource tải.


4

Hãy thử chạy các bài kiểm tra Y! Slow và Tốc độ trang trên trang web / trang của bạn và làm theo các hướng dẫn để loại bỏ các tắc nghẽn hiệu suất có thể có. Bạn sẽ nhận được hiệu suất rất lớn khi bạn đạt điểm cao hơn ở Y! Slow hoặc Tốc độ trang.

Những xét nghiệm này sẽ cho bạn biết những gì sai và những gì cần thay đổi.


Cảm ơn! điểm số là: 92 trên Tốc độ trang và 93 trên Ylow. Điều còn thiếu là: KEEP ALIVE = tắt và không sử dụng CDN.
Sam

CẬP NHẬT: 96 và 90 tương ứng hiện tại
Sam

4

Vì vậy, tập lệnh PHP của bạn đang tạo hình thu nhỏ trên mỗi lần tải trang? Trước hết, nếu hình ảnh được thu nhỏ không thay đổi thường xuyên, bạn có thể thiết lập bộ đệm sao cho chúng không phải được phân tích cú pháp mỗi khi tải trang không? Thứ hai, tập lệnh PHP của bạn có sử dụng cái gì đó như imagecopyresampled()để tạo hình thu nhỏ không? Đó là một nhược điểm không tầm thường và tập lệnh PHP sẽ không trả lại bất cứ điều gì cho đến khi hoàn thành mọi thứ. Sử dụng imagecopymerged()thay thế sẽ làm giảm chất lượng của hình ảnh, nhưng tăng tốc quá trình. Và bạn đang giảm bao nhiêu? Những hình thu nhỏ này có kích thước 5% so với ảnh gốc hay 50%? Một kích thước lớn hơn của hình ảnh gốc có thể dẫn đến sự chậm lại do tập lệnh PHP phải lấy hình ảnh gốc trong bộ nhớ trước khi nó có thể thu nhỏ nó và tạo ra một hình thu nhỏ nhỏ hơn.


Cảm ơn MidnightLightning! Có một thư mục bộ đệm trong đó các hình thu nhỏ JPG được tạo và sử dụng lại, mặc dù tôi có cảm giác ở đây là vấn đề của tập lệnh mà tôi đã mua (và dường như hoạt động tốt cho những người khác)
Sam

2
Nếu các hình thu nhỏ được lưu trong bộ nhớ cache, hãy đảm bảo rằng tập lệnh kéo chúng từ bộ đệm đang sử dụng readfile()thay vì file_get_contents()theo sau là tiếng vang, nó sẽ chờ xuất bất cứ thứ gì cho đến khi toàn bộ tập tin được chuyển vào bộ nhớ của tập lệnh PHP.
Nửa đêm

Tốt hơn nữa - nếu các tệp được lưu trong bộ nhớ cache, hãy tạo HTML theo cách trực tiếp lấy hình ảnh được lưu trong bộ nhớ cache từ đĩa mà không cần thông qua PHP. Đó là những gì tôi làm trong các kịch bản của mình cho videodb.net
andig

"Có một thư mục bộ đệm trong đó ..." và chúng được hủy đăng ký nhanh như thế nào? URL của bạn trỏ trực tiếp vào tệp được lưu trong bộ nhớ cache hay tập lệnh PHP? Bạn có chuyển hướng hoặc sử dụng readfile () không? Liệu tập lệnh PHP tương tự có chứa mã tạo hình thu nhỏ - hoặc bạn trì hoãn tải phần lớn mã bằng cách sử dụng bao gồm / erquire?
symcbean

4

Tôi đã tìm thấy URL của trang web của bạn và kiểm tra một tệp jpg riêng lẻ từ trang chủ. Mặc dù thời gian tải là hợp lý bây giờ (161ms), nhưng nó đang chờ 126ms, quá nhiều.

Tất cả các tiêu đề được sửa đổi lần cuối của bạn đều được đặt thành Sat, ngày 1 tháng 1 năm 2011 12:00:00 GMT, có vẻ quá "tròn" để trở thành ngày thực sự của thế hệ ;-)

Vì Kiểm soát bộ đệm là "công khai, tuổi tối đa = 14515200", các tiêu đề được sửa đổi lần cuối tùy ý sẽ có thể gây ra sự cố sau 168 ngày.

Dù sao, đây không phải là lý do thực sự cho sự chậm trễ.

Bạn phải kiểm tra xem trình tạo hình thu nhỏ của bạn làm gì khi hình thu nhỏ đã tồn tại và những gì có thể tiêu tốn rất nhiều thời gian để kiểm tra và phân phối hình ảnh.

Bạn có thể cài đặt xdebug để cấu hình tập lệnh và xem các nút thắt cổ chai ở đâu.

Có thể toàn bộ điều sử dụng một khung hoặc kết nối với một số cơ sở dữ liệu không có gì. Tôi đã thấy mysql_connect () rất chậm trên một số máy chủ, chủ yếu là do họ đang kết nối bằng TCP và không phải socket, đôi khi có một số vấn đề về DNS.

Tôi hiểu rằng bạn không thể đăng máy phát điện trả tiền của mình ở đây nhưng tôi sợ có quá nhiều vấn đề có thể xảy ra ...


Cảm ơn các thám tử của bạn và phát hiện ra manh mối Capsule! Điều đầu tiên trước tiên: không có cơ sở dữ liệu. Phát hiện của bạn giống như của tôi: nó chờ 90% thời gian cho? Ngón tay cái nhỏ điên. Những suy nghĩ thú vị về các tiêu đề được sửa đổi lần cuối, bởi vì theo bài đăng của James ở đây, tôi đã phải đặt các tiêu đề được sửa đổi lần cuối đó thành thời gian STATIC (cố định), không phải thời gian động / luôn thay đổi được đặt bởi các trình tạo php gmdate. Hoặc có lẽ bạn có ý gì khác ở đây? (Được đề cử tiền thưởng)
Sam

1
Để hoàn hảo, nó phải phản ánh ngày thế hệ thực, ví dụ bằng cách lấy thời gian quay phim () của hình thu nhỏ được lưu trong bộ nhớ cache. Điều thú vị để kiểm tra là truy cập vào một tệp PHP trống hoặc một tệp PHP chỉ lặp lại "kiểm tra" và xem bạn đã chờ đợi bao nhiêu trên cái này. Có thể toàn bộ máy chủ chỉ chậm và tác động đến mọi tập lệnh PHP, bất kể nó làm gì.
Capsule

1
Tôi cũng thấy độ trễ tương đối dài trên các tệp tĩnh thuần (ví dụ: hình ảnh được liên kết với ngón tay cái), như 36ms. Trên một trong những máy chủ mà tôi đang quản trị (không phải là quái thú ... lõi kép với 2Gb RAL), tôi nhận được gần một nửa số này, như 20ms trên các tệp tĩnh.
Viên nang

Thú vị ... bạn sử dụng phần mềm / công cụ trực tuyến nào để đo lường? 2. các phép đo 20 ms nhanh hơn của bạn có nhất quán (bao nhiêu ± xx%) bạn có thấy kết quả của mình thay đổi không? Trong trường hợp của tôi, nó thực sự thay đổi rất nhiều tùy thuộc vào công cụ kiểm tra nào tôi sử dụng. một số rất phù hợp ( gtmetrix.com ) một số rất khác nhau ( pingdom.com ) và rất khó để đưa ra thời gian trong XX ms vì chúng thay đổi mỗi lần ...
Sam

Tôi đang sử dụng tab NET của Fireorms. 20ms là thời gian nhanh nhất tôi nhận được. Nó thay đổi trong khoảng từ 20 đến 28. Tất nhiên 36ms tôi đo được trên máy chủ của bạn cũng nhanh nhất.
Capsule

4

Nếu không có lý do thực sự tốt (thường là không có) thì hình ảnh của bạn không nên gọi trình thông dịch PHP.

Tạo quy tắc viết lại cho máy chủ web của bạn lưu trữ hình ảnh trực tiếp nếu nó được tìm thấy trên hệ thống tệp. Nếu không, hãy chuyển hướng đến tập lệnh PHP của bạn để tạo hình ảnh. Khi bạn chỉnh sửa hình ảnh, thay đổi tên tệp hình ảnh để buộc người dùng có phiên bản được lưu trong bộ nhớ cache để tìm nạp hình ảnh mới được chỉnh sửa.

Nếu nó không hoạt động thì ít nhất bây giờ bạn sẽ không liên quan gì đến cách tạo và kiểm tra hình ảnh.


Cảm ơn Goran, tuy nhiên đây không phải là giải pháp tao nhã mà tôi mong muốn: Tôi nghĩ rằng có một cái gì đó tanh tanh trong trường hợp của tôi, và thông thường nó thực sự không mất nhiều thời gian để một kịch bản php biết được thông qua tiêu đề 304 hoặc để nướng hình ảnh, vv dù sao cũng cảm ơn đề xuất của bạn vì nó chỉ đạo vấn đề từ một quan điểm hoàn toàn mới! Giá trị của chính nó +1
Sam

3

Điều tra việc sử dụng dữ liệu phiên của PHP. Có lẽ (chỉ có thể), tập lệnh PHP tạo hình ảnh đang chờ để khóa dữ liệu phiên, bị khóa bởi trang chính vẫn hiển thị hoặc các tập lệnh kết xuất hình ảnh khác. Điều này sẽ làm cho tất cả các tối ưu hóa JavaScript / trình duyệt gần như không liên quan, vì trình duyệt đang chờ máy chủ.

PHP khóa dữ liệu phiên cho mọi tập lệnh đang chạy, từ khi bắt đầu xử lý phiên, đến khi tập lệnh kết thúc hoặc khi session_write_close () được gọi. Điều này có hiệu quả nối tiếp mọi thứ. Kiểm tra trang PHP trên các phiên, đặc biệt là các bình luận, như trang này .


Cảm ơn vì lời đề nghị! Có vẻ như Alix đang đề xuất giống như bạn (phải không?). Trong điều kiện thực tế, bạn đề nghị tôi đặt / xóa mã gì, sau đó kiểm tra lại các biểu đồ sau đó báo cáo lại? Nhiều đánh giá cao.
Sam

1
Vâng tôi cũng nghĩ thế. Tôi khuyên bạn nên thay đổi các tập lệnh tạo hình ảnh để chúng không phụ thuộc vào dữ liệu $ _SESSION hoặc tương tự (có thể chúng không, đã có). Sau đó, sử dụng session_write_close () càng sớm càng tốt , hoặc, thậm chí tốt hơn, tránh sử dụng tất cả các phiên trên các tập lệnh đó. Kiểm tra php.net/manual/en/feft.session-write-close.php
Ricardo Pardini

3

Đây chỉ là một phỏng đoán hoang dã vì tôi đã không xem mã của bạn nhưng tôi nghi ngờ các phiên có thể đóng vai trò ở đây, sau đây là từ mục Hướng dẫn sử dụng PHP trên session_write_close():

Dữ liệu phiên thường được lưu trữ sau khi tập lệnh của bạn kết thúc mà không cần gọi session_write_c Đóng (), nhưng vì dữ liệu phiên bị khóa để ngăn việc ghi đồng thời, chỉ một tập lệnh có thể hoạt động trên phiên bất cứ lúc nào. Khi sử dụng bộ khung cùng với phiên, bạn sẽ trải nghiệm các khung tải từng cái một do khóa này. Bạn có thể giảm thời gian cần thiết để tải tất cả các khung bằng cách kết thúc phiên ngay khi tất cả các thay đổi đối với các biến của phiên được thực hiện.

Như tôi đã nói, tôi không biết mã của bạn đang làm gì nhưng những biểu đồ đó có vẻ đáng ngờ. Tôi gặp vấn đề tương tự khi tôi mã hóa chức năng phục vụ tập tin nhiều phần và tôi gặp vấn đề tương tự. Khi phục vụ một tệp lớn, tôi không thể làm cho chức năng nhiều phần hoạt động và tôi không thể mở một trang khác cho đến khi quá trình tải xuống hoàn tất. Gọi session_write_close()cố định cả hai vấn đề của tôi.


Cảm ơn Alix cho đề nghị của bạn. Một câu hỏi: là exit();hàm trong các dòng tương tự như session_write_close();? Hiện tại, người viết mã ban đầu đang điều tra vấn đề, nhưng helas có vẻ như anh ta cũng có một chút trong bóng tối, vì anh ta đã cập nhật mã một cách hào phóng với việc xử lý If-Modified-tốt hơn vì có sự chậm trễ tương tự (thác mới các biểu đồ tạo ra các biểu đồ giống nhau, mặc dù các kết quả thực tế có vẻ như được tải / cảm nhận tải nhanh hơn! Đó là một vấn đề rất kỳ lạ ...
Sam

1
@Sam: Tôi không thể cung cấp cho bạn bất kỳ nguồn nào ngay bây giờ, nhưng tôi tin rằng exit () trước tiên gọi bất kỳ hàm hủy và / hoặc các chức năng nào được đăng ký để tắt máy và chỉ sau đó phiên được đóng lại. Nhưng dù sao, tôi cá là vấn đề của bạn có lẽ nằm trước cuộc gọi exit () của bạn. Xem thêm: stackoverflow.com/questions/1674314/
Mạnh

2

Bạn đã thử thay thế các trang được tạo bởi php bằng các hình ảnh thông thường để xem có sự khác biệt nào không? Vấn đề có thể xảy ra - một lỗi trong mã php của bạn dẫn đến việc tái tạo hình thu nhỏ theo mỗi lần gọi máy chủ - sự chậm trễ trong mã của bạn (ngủ ()?) Liên quan đến sự cố đồng hồ - một vấn đề khó khăn gây ra tình trạng chủng tộc rất xấu vì tất cả các hình thu nhỏ được tải / tạo cùng một lúc.


Một cái gì đó mà tôi lúc nào đó nghĩ rằng hãy thử +1 để đọc suy nghĩ của tôi và tiết lộ giải pháp đầu tiên tôi đã làm. Những gì tôi đã HOPING, là phát hiện ra rằng những hình ảnh bình thường cũng sẽ tải chậm, nó có thể là tốc độ băng thông tải xuống hoặc một cái gì đó hạn chế về mặt vật lý, nhưng tôi đã tìm thấy những hình ảnh kết xuất tĩnh bình thường (tôi đã lưu ngón tay cái được tạo ra và tải lên dưới dạng tĩnh) TUYỆT VỜI nhanh chóng. Vì vậy, nó phải làm gì với những gì trình tạo hình thu nhỏ php!
Sam

2

Tôi nghĩ thay vì sử dụng tập lệnh tạo hình thu nhỏ đó, bạn phải thử TinySRC để tạo nhanh hình thu nhỏ được lưu trữ nhanh và được lưu trữ trên đám mây. Nó có API rất đơn giản và dễ sử dụng, bạn có thể sử dụng như: -

http://i.tinysrc.mobi/ [chiều cao] / [chiều rộng] /http://domain.tld/path_to_img.jpg

[width] (tùy chọn): - Đây là chiều rộng tính bằng pixel (ghi đè kích thước thích ứng hoặc kích thước gia đình). Nếu có tiền tố là '-' hoặc 'x', nó sẽ trừ đi hoặc thu nhỏ lại theo tỷ lệ phần trăm, kích thước được xác định.

[height] (tùy chọn): - Đây là chiều cao tính bằng pixel, nếu chiều rộng cũng có mặt. Nó cũng ghi đè kích thước thích ứng hoặc kích thước gia đình và có thể được thêm tiền tố với '-' hoặc 'x'.

Bạn có thể kiểm tra tóm tắt API tại đây


Câu hỏi thường gặp

TinySrc có giá bao nhiêu?

Không có gì.

Khi nào tôi có thể bắt đầu sử dụng tinySrc?

Hiện nay.

Làm thế nào đáng tin cậy là dịch vụ?

Chúng tôi không đảm bảo về dịch vụ tinySrc. Tuy nhiên, nó chạy trên một cơ sở hạ tầng đám mây phân tán lớn , do đó nó cung cấp tính sẵn sàng cao trên toàn thế giới. Nó nên đủ cho tất cả các nhu cầu của bạn.

Nó nhanh như thế nào

tinySrc lưu trữ hình ảnh đã thay đổi kích thước trong bộ nhớ và trong kho dữ liệu của chúng tôi trong tối đa 24 giờ và nó sẽ không tải hình ảnh gốc của bạn mỗi lần. Điều này làm cho các dịch vụ nhanh chóng từ quan điểm của người dùng. (Và giảm tải máy chủ của bạn như một hiệu ứng phụ đẹp.)


Chúc may mắn. Chỉ là một gợi ý, vì bạn không cho chúng tôi xem mã: p


2

Vì một số trình duyệt chỉ tải xuống 2 lượt tải xuống tương đương cho mỗi tên miền, bạn không thể thêm các tên miền bổ sung để loại bỏ các yêu cầu qua hai đến ba tên máy chủ khác nhau. ví dụ: 1.imagecdn.com 2.imagecdn.com


+1 cho đề xuất của bạn: cảm ơn bạn, nhưng nếu bạn nhìn kỹ hơn vào bản vẽ của tôi (thừa nhận: rất hỗn loạn), bạn sẽ thấy rằng một số mặt hàng đến từ ....... es một số đến từ ........ com .......... de NHƯNG, có lẽ điều đó không thực hiện được mẹo cũng như đề xuất của bạn không? (Tôi thấy bạn đề xuất các tên miền phụ, thay vì chỉ các tên miền khác nhau.)
Sam

1

Trước hết, bạn cần xử lý If-Modified-Sincecác yêu cầu và một cách thích hợp, như James nói. Lỗi đó nói rằng: "Khi tôi hỏi máy chủ của bạn nếu hình ảnh đó được sửa đổi từ lần trước, nó sẽ gửi toàn bộ hình ảnh thay vì có / không đơn giản".

Thời gian giữa kết nối và byte đầu tiên thường là thời gian tập lệnh PHP của bạn chạy. Rõ ràng là một cái gì đó đang xảy ra khi kịch bản đó bắt đầu chạy.

  1. Bạn đã xem xét hồ sơ nó? Nó có thể có một số vấn đề.
  2. Kết hợp với vấn đề trên, tập lệnh của bạn có thể chạy nhiều lần hơn mức cần thiết. Lý tưởng nhất là chỉ tạo ngón tay cái nếu hình ảnh gốc được sửa đổi và gửi ngón tay cái được lưu trong bộ nhớ cache cho mọi yêu cầu khác. Bạn đã kiểm tra xem tập lệnh có tạo ra các hình ảnh không cần thiết không (ví dụ cho mỗi yêu cầu)?

Tạo tiêu đề thích hợp thông qua ứng dụng là một chút khó khăn, cộng với việc chúng có thể bị ghi đè bởi máy chủ. Và bạn có thể bị lạm dụng vì bất kỳ ai gửi một số tiêu đề yêu cầu không có bộ đệm sẽ khiến trình tạo hình thu nhỏ của bạn chạy liên tục (và tăng tải). Vì vậy, nếu có thể, hãy cố gắng lưu những ngón tay cái được tạo ra đó, gọi hình ảnh đã lưu trực tiếp từ các trang của bạn và quản lý các tiêu đề từ đó .htaccess. Trong trường hợp này, bạn thậm chí sẽ không cần bất cứ thứ gì trong .htaccessmáy chủ của mình nếu máy chủ của bạn được cấu hình đúng.

Ngoài những điều này, bạn có thể áp dụng một số ý tưởng tối ưu hóa sáng từ các phần hiệu suất của câu hỏi SO đẹp tổng thể này về cách làm trang web đúng cách , như chia tài nguyên của bạn thành tên miền phụ không cần nấu, v.v. Nhưng dù sao, hình ảnh 3k không nên mất một giây để tải, điều này là rõ ràng khi so sánh với các mục khác trong biểu đồ. Bạn nên cố gắng phát hiện vấn đề trước khi tối ưu hóa.


-1: Trả lời yêu cầu có điều kiện với 'Không sửa đổi' và không có thời gian hết hạn được sửa đổi sẽ khiến trang web của bạn chậm hơn trong 99,9% trường hợp (BTW, AFAIK, không có cách nào để Apache đưa ra thông tin bộ nhớ cache đã sửa đổi với phản hồi 304)
symcbean

Và, những gì có liên quan đến câu trả lời của tôi?
Halil Özgür

1

Bạn đã thử thiết lập một số tên miền phụ trong máy chủ web NGINX đặc biệt để phục vụ dữ liệu tĩnh như hình ảnh và biểu định kiểu chưa? Một cái gì đó hữu ích có thể đã được tìm thấy trong chủ đề này .


Cảm ơn! Tuy nhiên, sau một số nghiên cứu, có vẻ như việc thiết lập tên miền phụ cho cookie tĩnh của máy chủ chỉ làm cho trang web nhanh hơn, khi có nhiều hình ảnh, với chi phí phải trả thêm một chút. Trong trường hợp của tôi, tôi cá rằng 6 hình ảnh sẽ không được tải nhanh hơn chi phí của tên miền phụ / phụ. Đúng?
Sam

1
NGinx hỗ trợ tòa nhà sendfile, có thể gửi tệp trực tiếp từ hdd. vui lòng xem tài liệu wiki.nginx.org/HttpCoreModule sau đây về các chỉ thị 'sendfile', 'aio'. Máy chủ web này phục vụ các tệp tĩnh như hình ảnh nhanh hơn nhiều so với apache.
nefo_x

thú vị ... tôi không biết có thể có gì tốt hơn Apache. Bằng cách này, những gì bạn có ý nghĩa bởi straight from hdd. ý bạn là thay vào đó straight from DDR3 RAM/ straight from Solid State DiskTôi thực sự biết rằng các đĩa cứng, không giống như ram DDR3 hoặc Đĩa trạng thái rắn, có thời gian truy cập rất chậm. Nhưng tôi cảm thấy đây không phải là nút cổ chai ở đây ...
Sam

1
điểm quan trọng là nginx không đệm đầu ra dữ liệu tĩnh, như apache.
nefo_x

1

Về hình thu nhỏ bị trì hoãn, hãy thử đặt một cuộc gọi để tuôn ra () ngay sau cuộc gọi cuối cùng đến tiêu đề () trong tập lệnh tạo hình thu nhỏ của bạn. Sau khi hoàn thành, hãy tạo lại biểu đồ thác nước của bạn và xem liệu độ trễ hiện có trên cơ thể thay vì các tiêu đề. Nếu vậy, bạn cần xem xét logic để tạo và / hoặc xuất dữ liệu hình ảnh.

Kịch bản xử lý các hình thu nhỏ hy vọng sẽ sử dụng một số loại bộ đệm để bất kỳ hành động nào xảy ra đối với hình ảnh bạn đang phục vụ sẽ chỉ xảy ra khi thực sự cần thiết. Có vẻ như một số hoạt động đắt tiền đang diễn ra mỗi khi bạn phục vụ các hình thu nhỏ đang trì hoãn bất kỳ đầu ra nào (bao gồm các tiêu đề) từ tập lệnh.


+1 đoán thú vị sẽ thử ngay bây giờ! sẽ báo cáo lại khi tôi có thác nước mới chảy ...
Sam

Thật không may, sau khi thêm flush();ngay sau tiêu đề, dường như không có thay đổi nào cả! Điều đó có nghĩa là gì?
Sam

Không chắc. Có cách nào bạn có thể liên kết chúng tôi với tập lệnh PHP đang đề cập không? Tôi biết bạn đã trả tiền cho nó, nhưng thật khó để nói điều gì có thể gây ra hành vi mà không thể thấy những gì nó đang làm.
AR Younce

Các hình thu nhỏ đang được tham chiếu trong CSS hoặc trong thẻ <img>?
AR Younce

Bạn có ý nghĩa gì khi được tham chiếu trong css? họ ở bên cạnh cơ thể html và như sau: <img src="thumbprocessor.php?src=/folder/image.jpg&w=100&h=200" id="thumbnail"/>
Sam

1

Phần lớn vấn đề chậm là TTFB (Thời gian đến byte đầu tiên) của bạn quá cao. Đây là một vấn đề khó giải quyết mà không thân mật với các tệp cấu hình máy chủ, mã và phần cứng cơ bản của bạn, nhưng tôi có thể thấy nó tràn lan theo mọi yêu cầu. Bạn có quá nhiều thanh màu xanh lá cây (xấu) và rất ít thanh màu xanh lam (tốt). Bạn có thể muốn ngừng tối ưu hóa frontend một chút, vì tôi tin rằng bạn đã làm được nhiều việc trong lĩnh vực đó. Bất chấp câu ngạn ngữ rằng " 80% -90% thời gian phản hồi của người dùng cuối được dành cho lối vào ", tôi tin rằng bạn đang xảy ra trong phần phụ trợ.

TTFB là công cụ phụ trợ, công cụ máy chủ, xử lý trước khi xuất và bắt tay.

Thời gian thực thi mã của bạn để tìm nội dung chậm như truy vấn cơ sở dữ liệu chậm, thời gian nhập và thoát hàm / phương thức để tìm hàm chậm. Nếu bạn sử dụng php, hãy thử Firephp . Đôi khi, một hoặc hai truy vấn chậm được chạy trong khi khởi động hoặc khởi tạo như kéo thông tin phiên hoặc kiểm tra xác thực và những gì không. Tối ưu hóa các truy vấn có thể dẫn đến một số lợi ích hoàn hảo tốt. Đôi khi mã được chạy bằng cách sử dụng php preend hoặc spl autoload để chúng chạy trên mọi thứ. Những lần khác, nó có thể được cấu hình bởi apache conf và điều chỉnh để tiết kiệm trong ngày.

Hãy tìm những vòng lặp không hiệu quả. Tìm kiếm các cuộc gọi tìm nạp chậm của bộ nhớ cache hoặc các hoạt động i / o chậm gây ra bởi các ổ đĩa bị lỗi hoặc sử dụng không gian đĩa cao. Tìm kiếm tập quán bộ nhớ và những gì đang được sử dụng và ở đâu. Chạy thử nghiệm lặp lại 10 lần trên webpagetest trên một hình ảnh hoặc tệp chỉ sử dụng chế độ xem đầu tiên từ các vị trí khác nhau trên thế giới và không phải cùng một vị trí. Và đọc nhật ký truy cập và lỗi của bạn, quá nhiều nhà phát triển bỏ qua chúng và chỉ dựa vào các lỗi xuất hiện trên màn hình. Nếu máy chủ web của bạn có hỗ trợ, hãy yêu cầu họ giúp đỡ, nếu họ không thể lịch sự yêu cầu họ giúp đỡ, điều đó sẽ không gây hại.

Bạn có thể thử Tìm nạp trước DNS để chống lại nhiều tên miền và tài nguyên, http://html5boilerplate.com/docs/DNS-Prefetching/

Là máy chủ của riêng bạn một máy chủ tốt / tốt? Đôi khi một máy chủ tốt hơn có thể giải quyết rất nhiều vấn đề. Tôi là một fan hâm mộ của ' phần cứng là rẻ, lập trình viên là đắt tiền ', nếu bạn có cơ hội và tiền nâng cấp một máy chủ. Và / Hoặc sử dụng CDN như maxcdn hoặc cloudflare hoặc tương tự.

Chúc may mắn!

(ps tôi không làm việc cho bất kỳ công ty nào trong số này. Ngoài ra, liên kết đám mây ở trên sẽ lập luận rằng TTFB không quan trọng, tôi đã ném nó vào đó để bạn có thể nhận thêm một lần nữa.)


Anthony thân mến, cảm ơn rất nhiều vì kiến ​​thức "nền tảng" sâu sắc này. Tôi đồng ý rằng đôi khi phần cứng là nút cổ chai và điều đó ít rõ ràng hơn để đo lường đặc biệt là khi công ty lưu trữ đang lưu trữ phần máy chủ trong môi trường lưu trữ được chia sẻ. Tôi nghĩ rằng cloudflare là một lựa chọn tốt để thử kết hợp với tối ưu hóa cấu hình apache. Lời chào hỏi!
Sam

-1

Xin lỗi để nói, bạn cung cấp cho một vài dữ liệu. Và bạn đã có một số gợi ý tốt.

Làm thế nào bạn phục vụ những hình ảnh? Nếu bạn phát trực tuyến những thứ đó qua PHP thì bạn đang làm một việc rất tệ, ngay cả khi chúng đã được tạo.

KHÔNG BAO GIỜ HÌNH ẢNH STREAM VỚI PHP. Nó sẽ làm chậm máy chủ của bạn, bất kể bạn sử dụng nó như thế nào.

Đặt chúng trong một thư mục có thể truy cập, với một URI có ý nghĩa. Sau đó gọi họ trực tiếp với URI thực sự của họ. Nếu bạn cần trên thế hệ bay, bạn nên đặt một .htaccess trong thư mục hình ảnh chuyển hướng đến tập lệnh php của trình tạo chỉ khi thiếu hình ảnh yêu cầu. (đây được gọi là chiến lược cache theo yêu cầu).

Làm như vậy sẽ sửa phiên php, proxy trình duyệt, bộ nhớ đệm, ETAGS, bất cứ thứ gì cùng một lúc.

WP-Supercache sử dụng chiến lược này, nếu được cấu hình đúng.

Tôi đã viết cái này cách đây một thời gian ( http://code.google.com.vn/p/cache-on-request/source/detail?r=8 ), bản sửa đổi cuối cùng đã bị hỏng, nhưng tôi đoán 8 hoặc ít hơn sẽ hoạt động và bạn có thể lấy .htaccess làm ví dụ chỉ để kiểm tra mọi thứ (mặc dù có nhiều cách tốt hơn để định cấu hình .htaccess so với cách tôi đã sử dụng).

Tôi đã mô tả chiến lược đó trong bài đăng trên blog này ( http://www.stefanoforenza.com/need-for-cache/ ). Nó có thể được viết xấu nhưng nó có thể giúp làm rõ mọi thứ.

Đọc thêm: http://meta.wikidia.org/wiki/404_handler_caching


Xin lưu ý, ErrorDocument không thực sự là điều tốt nhất bạn có thể làm, vì nó tạo ra các mục trong nhật ký lỗi của apache, chuyển hướng -f sẽ tốt hơn.
tacone

Cảm ơn cho tacone đầu vào của bạn. Bạn có nói rằng cho dù tập lệnh php sẽ tốt đến đâu, nó sẽ làm chậm máy chủ, hoặc như bạn đã nói trong bài đăng của mình "Nó sẽ giết chết máy chủ của bạn, bất kể là gì."
Sam

nó sẽ làm chậm máy chủ cho dù kịch bản có tốt đến đâu. Đối với mỗi hình ảnh, máy chủ sẽ phải tải php và truyền phát byte hình ảnh trên mỗi byte. Hãy để apache thực hiện công việc mà không cần thông qua trình thông dịch php. Do đó, nhiều lỗi khác có thể sẽ tự động tránh được, chẳng hạn như phiên, chiều dài nội dung, bộ nhớ đệm, mime / loại, vv KHI hiệu suất là rất quan trọng, bạn thậm chí không nên tải php (nhưng vào thời gian thế hệ).
tacone

Bỏ phiếu, bạn có thể giải thích tại sao?
tacone
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.