2009-02-20 21 views
5

Tôi đang sử dụng PHP với khung công tác Zend và cơ sở dữ liệu kết nối một mình dường như mất nhiều thời gian hơn 0,02 giây mà Google phải thực hiện truy vấn. Điều tuyệt vời hôm nay tôi đã xem một video cho biết Google kết nối với 1000 máy chủ cho một truy vấn. Với độ trễ, tôi sẽ mong đợi một máy chủ cho mọi truy vấn có hiệu quả hơn việc có nhiều máy chủ trong các trung tâm dữ liệu khác nhau xử lý nội dung.Làm thế nào để Google có được tốc độ với php?

Làm cách nào để có được PHP, MySQL và Zend Framework hoạt động cùng nhau và đạt được tốc độ lớn như nhau?

Bộ nhớ đệm là cách duy nhất? Làm thế nào để bạn tối ưu hóa mã của bạn để mất ít thời gian hơn để "render".

+0

không thể thực hiện với PHP và MySQL ... –

+0

200ms = 0,2 giây btw. Bạn sẽ có thể làm * đó * trong php? – krosenvold

+0

Thứ nhất, là thời điểm Google hiển thị thời gian thực tế để tạo trang (conect, truy vấn, echo ...) hoặc chỉ là thời gian để thực hiện truy vấn? Tôi tin rằng đó chỉ là truy vấn. Tôi có nhiều trang mất 0,05 giây để tải toàn bộ trang. –

Trả lời

5

Cách đây Google quyết định đưa mọi thứ vào RAM.

http://googlesystem.blogspot.com/2009/02/machines-search-results-google-query.html

Nếu bạn không bao giờ phải truy vấn ổ cứng, kết quả của bạn sẽ được cải thiện đáng kể. Caching giúp bởi vì bạn không truy vấn ổ cứng nhiều, nhưng bạn vẫn làm khi có một cache nhớ (trừ khi bạn có nghĩa là cache với PHP, nghĩa là bạn chỉ biên dịch chương trình PHP khi nguồn đã được sửa đổi).

+0

làm thế nào để kiểm tra xem db của tôi có nằm trong ram hoàn toàn không? – Thomaschaaf

+0

Google đang sử dụng công cụ DB của họ mà tôi nghi ngờ. Tôi không nghĩ rằng bạn có thể buộc MySQL để đặt toàn bộ cơ sở dữ liệu trong RAM. –

+0

Bạn luôn có thể sử dụng cụm MySQL! Rằng tất cả đi vào RAM với các điểm kiểm tra thường xuyên vào đĩa. Khá tiên tiến để thiết lập, mặc dù. Bạn cũng có thể sử dụng tất cả các bảng bộ nhớ, nhưng sẽ đi 'poof!' nếu máy chủ bị hỏng. – jonstjohn

8

Có nhiều kỹ thuật mà Google sử dụng để đạt được lượng thông lượng mà nó cung cấp. MapReduce, Google File System, BigTable là một vài trong số đó.

Có một vài lựa chọn thay thế miễn phí mã nguồn mở miễn phí & mã nguồn mở, cụ thể là Apache Hadoop, Apache HBaseHypertable. Yahoo! đang sử dụng và quảng bá các dự án Hadoop khá nhiều và do đó chúng được duy trì khá tích cực.

+0

Lựa chọn thay thế miễn phí tốt nào? – Thomaschaaf

+0

Tôi đã chỉnh sửa câu trả lời của mình để thêm một số lựa chọn thay thế tốt. –

+0

Cảm ơn. (Tôi phải viết một cái gì đó ở đây) – Thomaschaaf

3

Nó thực sự phụ thuộc vào những gì bạn đang cố gắng làm, nhưng đây là một số ví dụ:

  • Phân tích truy vấn của bạn với giải thích. Trong môi trường dev của bạn, bạn có thể xuất các truy vấn và thời gian thực hiện của bạn xuống cuối trang - giảm số lượng truy vấn và/hoặc tối ưu hóa các truy vấn chậm.

  • Sử dụng lớp lưu trong bộ nhớ cache. Có vẻ như Zend có thể được kích hoạt memcache. Điều này có khả năng có thể tăng tốc đáng kể ứng dụng của bạn bằng cách gửi các yêu cầu tới lớp bộ nhớ đệm cực nhanh thay vì db.

  • Xem thời gian tải giao diện người dùng của bạn. Sử dụng tiện ích YSlow của Yahoo cho Firebug. Giới hạn các yêu cầu http, đặt tiêu đề xa trong tương lai thành bộ nhớ cache js, css và hình ảnh. Vv

Bạn có thể nhận được tốc độ cực nhanh trên ứng dụng web, có thể không nhanh bằng google, nếu bạn tối ưu hóa từng lớp trong ứng dụng của mình. Thời gian kết nối db của bạn có lẽ không phải là phần chậm nhất trong ứng dụng của bạn.

1

Nếu nó dành cho công cụ tìm kiếm, nút cổ chai là cơ sở dữ liệu, tùy thuộc vào kích thước của nó.

Để tăng tốc tìm kiếm trên toàn văn trên một tập hợp lớn, bạn có thể sử dụng Sphinx. Nó có thể được cấu hình hoặc trên 1 hoặc nhiều máy chủ. Tuy nhiên, bạn sẽ phải điều chỉnh mã truy vấn hiện tại, vì Sphinx chạy dưới dạng một daemon tìm kiếm (libs có sẵn cho hầu hết các ngôn ngữ)

0

Theo liên kết được cung cấp bởi @Coltin, thời gian phản hồi của google nằm trong vùng .2 giây , không .02 giây.Miễn là ứng dụng của bạn có thiết kế hiệu quả, tôi tin rằng bạn sẽ có thể đạt được điều đó trên nhiều nền tảng. Mặc dù tôi không biết PHP nó sẽ surpise tôi nếu .2 giây là một vấn đề.

2

Memcached là giải pháp được khuyến nghị để tối ưu hóa lưu trữ/truy xuất trong bộ nhớ trên Linux.

6

Tôi đang sử dụng PHP với Zend Framework và Cơ sở dữ liệu kết nối một mình dường như mất nhiều thời gian hơn so với 0,02 giây Google cần để làm một truy vấn.

Hoạt động kết nối cơ sở dữ liệu là nặng dù bạn là ai: sử dụng hồ bơi kết nối để bạn không phải khởi tạo tài nguyên cho mọi yêu cầu.

Hiệu suất là về kiến ​​trúc không phải ngôn ngữ.

+0

1 cho sự thật rằng "Hiệu suất là về kiến ​​trúc không phải ngôn ngữ". Tôi ghét những câu hỏi này: P –

1

Google có một hệ thống phân tán lớn, kết hợp rất nhiều công nghệ độc quyền (bao gồm phần cứng của riêng họ và các hệ điều hành, tệp và cơ sở dữ liệu).

Câu hỏi này giống như hỏi: "Làm thế nào tôi có thể làm cho chiếc xe của tôi trở thành một chiếc xe tải?" và về cơ bản là vô nghĩa.

+0

Có vẻ như một phản hồi hợp lý với tôi - không được bỏ phiếu. –

0
  • Bộ nhớ đệm mã APC;
  • Zend_Cache với chương trình phụ trợ APC hoặc Memcache;
  • CDN cho các tệp tĩnh;
2

Các tập lệnh PHP theo mặc định được diễn giải mỗi khi chúng được gọi bởi máy chủ http, vì vậy mọi cuộc gọi đều khởi tạo phân tích tập lệnh và có thể biên dịch bởi Công cụ Zend. Bạn có thể loại bỏ nút cổ chai này bằng cách sử dụng bộ đệm ẩn tập lệnh, như APC. Nó giữ tập lệnh PHP được biên dịch một lần trong bộ nhớ/trên đĩa và sử dụng nó cho tất cả các yêu cầu tiếp theo. Lãi suất thường rất quan trọng, đặc biệt là trong các ứng dụng PHP được tạo bằng các khung công tác phức tạp như ZF.

Mọi yêu cầu theo mặc định sẽ mở ra kết nối với cơ sở dữ liệu, vì vậy bạn nên sử dụng một số loại kết nối cơ sở dữ liệu hoặc kết nối liên tục (không luôn hoạt động, tùy thuộc vào cấu hình http máy chủ/php). Tôi chưa bao giờ thử, nhưng có thể có một cách để sử dụng memcache để giữ các kết nối cơ sở dữ liệu.

Bạn cũng có thể sử dụng memcache để lưu dữ liệu phiên, nếu chúng được sử dụng cho mọi yêu cầu. Sự kiên trì của họ không quan trọng và memcache giúp làm cho nó rất nhanh. "Vấn đề" là PHP hoạt động hơi khác so với các khung công tác khác, vì nó hoạt động theo cách SSI (phía máy chủ) - mọi yêu cầu được xử lý bởi máy chủ http và nếu yêu cầu chạy một kịch bản PHP, trình thông dịch của nó được khởi tạo và các kịch bản được nạp, phân tích cú pháp, biên dịch và chạy. Điều này có thể được so sánh khi vào trong xe, khởi động động cơ và đi trong 10 mét.

Cách khác, giả sử, một ứng dụng máy chủ, trong đó chính ứng dụng web đang xử lý các yêu cầu trong vòng lặp riêng của nó, luôn chia sẻ kết nối cơ sở dữ liệu và không khởi chạy quá trình chạy lặp đi lặp lại. Giải pháp này cho độ trễ thấp hơn nhiều. Điều này mặt khác có thể được so sánh với việc đang ở trong một chiếc xe đang chạy và sử dụng nó để lái xe cùng 10 mét. ;)

Giải pháp lưu bộ nhớ đệm/biên dịch trước và gộp chung ở trên là cách tốt nhất để giảm phí đầu vào của init.PHP/MySQL vẫn là một giải pháp dựa trên RDBMS, và có một lý do chính đáng tại sao BigTable là, tốt, chỉ là một phần lớn, phân tán, phân phối rộng rãi hashtable (một chút quá đơn giản, tôi biết) - đọc trên High Scalability.

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