it-swarm-vi.com

Tại sao Facebook sử dụng C ++ bên cạnh PHP?

Lý do chính khiến Facebook cần sử dụng C++ bên cạnh PHP là gì? Tôi tự hỏi nếu tôi làm một trang web với rất nhiều khách hàng thì tôi có cần sử dụng C++ không?

15
Goma

Đây là lý do: HipHop cho PHP: Di chuyển nhanh :

Một trong những giá trị quan trọng tại Facebook là di chuyển nhanh. Trong sáu năm qua, chúng tôi đã có thể đạt được rất nhiều nhờ tốc độ phát triển nhanh chóng mà PHP cung cấp. Là một ngôn ngữ lập trình, PHP rất đơn giản Đơn giản để học, đơn giản để viết, đơn giản để đọc và đơn giản để gỡ lỗi. Chúng tôi có thể khiến các kỹ sư mới phát triển nhanh hơn ở Facebook rất nhiều với PHP so với các ngôn ngữ khác, cho phép chúng tôi để đổi mới nhanh hơn.

Hôm nay tôi rất vui mừng được chia sẻ dự án một nhóm nhỏ những người tuyệt vời và tôi đã làm việc trong hai năm qua; HipHop cho PHP. Với HipHop, chúng tôi đã giảm mức sử dụng CPU trên các máy chủ Web của chúng tôi trung bình khoảng năm mươi phần trăm, tùy thuộc vào trang. CPU ít hơn có nghĩa là ít máy chủ hơn, có nghĩa là ít chi phí hơn. Dự án này đã có một tác động to lớn trên Facebook. Chúng tôi cảm thấy Web nói chung có thể hưởng lợi từ HipHop, vì vậy chúng tôi sẽ phát hành nó dưới dạng nguồn mở tối nay với hy vọng rằng nó mang lại một trọng tâm mới về việc nhân rộng các trang web phức tạp lớn bằng PHP. Mặc dù HipHop đã cho chúng ta thấy kết quả đáng kinh ngạc, nhưng nó chắc chắn chưa hoàn thành và bạn nên thoải mái với phần mềm beta trước khi dùng thử.

HipHop cho PHP về mặt kỹ thuật không phải là trình biên dịch. Thay vào đó, nó là một biến áp mã nguồn. HipHop lập trình biến đổi mã nguồn PHP của bạn thành C++ được tối ưu hóa cao sử dụng g ++ để biên dịch nó. HipHop thực thi mã nguồn theo cách tương đương về mặt ngữ nghĩa và hy sinh một số tính năng hiếm khi được sử dụng - chẳng hạn như eval () - để đổi lấy hiệu suất được cải thiện. viết lại nhiều phổ biến PHP Tiện ích mở rộng để tận dụng các tối ưu hóa hiệu suất này.

Chia tỷ lệ PHP làm ngôn ngữ kịch bản

Nguồn gốc của PHP là những ngôn ngữ kịch bản, như Perl, Python và Ruby, tất cả đều có lợi ích lớn về năng suất lập trình viên và khả năng lặp lại nhanh chóng trên các sản phẩm. Điều này được so sánh với các ngôn ngữ được biên dịch truyền thống hơn như C++ và các ngôn ngữ được dịch như Java. Mặt khác, các ngôn ngữ script được biết là thường kém hiệu quả hơn khi sử dụng CPU và bộ nhớ. Vì điều này, thật khó khăn khi mở rộng Facebook lên hơn 400 tỷ lượt xem trang dựa trên PHP mỗi tháng.

Một cách phổ biến để giải quyết những sự thiếu hiệu quả này là viết lại các phần phức tạp hơn của ứng dụng PHP của bạn trực tiếp trong C++ dưới dạng PHP Phần mở rộng. Phần lớn này biến đổi PHP thành ngôn ngữ kết dính giữa HTML mặt trước của bạn và logic ứng dụng trong C++. Từ góc độ kỹ thuật, nó hoạt động tốt, nhưng làm giảm đáng kể số lượng kỹ sư có thể làm việc trên toàn bộ ứng dụng của bạn. Học C++ chỉ bước đầu tiên để viết PHP Tiện ích mở rộng, bước thứ hai là hiểu API Zend. Vì nhóm kỹ thuật của chúng tôi tương đối nhỏ - có hơn một triệu người dùng cho mỗi kỹ sư - chúng tôi không thể đủ khả năng để làm cho các phần của cơ sở mã của chúng tôi ít truy cập hơn các phần khác.

Mở rộng Facebook đặc biệt khó khăn vì hầu hết mọi lượt xem trang là người dùng đăng nhập với trải nghiệm tùy chỉnh. Khi bạn xem trang chủ của mình, chúng tôi cần tìm kiếm tất cả bạn bè của bạn, truy vấn các bản cập nhật phù hợp nhất của họ (từ một dịch vụ tùy chỉnh mà chúng tôi đã xây dựng có tên là Multifeed), lọc kết quả dựa trên cài đặt quyền riêng tư của bạn, sau đó điền vào các câu chuyện bằng các bình luận , ảnh, lượt thích và tất cả dữ liệu phong phú mà mọi người yêu thích trên Facebook. Tất cả điều này chỉ trong chưa đầy một giây. HipHop cho phép chúng ta viết logic thực hiện việc kết hợp trang cuối cùng trong PHP và lặp lại nhanh chóng trong khi dựa vào các dịch vụ phụ trợ tùy chỉnh trong C++, Erlang, Java hoặc Python để phục vụ News Feed, tìm kiếm, Trò chuyện và các phần cốt lõi khác của trang web.

Từ năm 2007, chúng tôi đã nghĩ về một vài cách khác nhau để giải quyết những vấn đề này và thậm chí đã thử thực hiện một vài trong số chúng. Gợi ý phổ biến là chỉ viết lại Facebook bằng ngôn ngữ khác, nhưng với sự phức tạp và tốc độ phát triển của trang web, điều này sẽ mất một thời gian để hoàn thành. Chúng tôi đã viết lại các khía cạnh của Zend Engine - phần bên trong của PHP - và đã đóng góp các bản vá đó vào dự án PHP, nhưng cuối cùng vẫn chưa thấy loại tăng hiệu suất cần thiết. Lợi ích của HipHop là gần như minh bạch với tốc độ phát triển của chúng tôi.

Hack lên HipHop

Một đêm tại Hackathon vài năm trước (xem Prime Time Hack), tôi đã bắt đầu chuyển đoạn mã đầu tiên của mình PHP thành C++. Các ngôn ngữ khá giống nhau về mặt cú pháp và C++ vượt trội hoàn toàn PHP khi sử dụng cả CPU và bộ nhớ. Thậm chí PHP được viết bằng C. Chúng tôi biết rằng không thể viết lại thành công toàn bộ cơ sở mã có kích thước này bằng cách nhưng tự hỏi điều gì sẽ xảy ra nếu chúng ta xây dựng một hệ thống để thực hiện nó theo lập trình.

Tìm cách mới để cải thiện PHP hiệu suất không phải là một khái niệm mới. Vào thời gian chạy, Công cụ Zend biến nguồn PHP của bạn thành opcodes sau đó chạy qua Máy ảo Zend. Các dự án nguồn mở như APC và eAccelerator lưu trữ đầu ra này và được sử dụng bởi phần lớn các trang web PHP. Ngoài ra còn có Zend Server, một sản phẩm thương mại tạo ra PHP nhanh hơn thông qua tối ưu hóa opcode và bộ nhớ đệm. Thay vào đó, chúng tôi đã suy nghĩ về việc chuyển đổi PHP nguồn trực tiếp thành C++, sau đó có thể được chuyển thành mã máy gốc. Thậm chí biên dịch PHP không phải là một ý tưởng mới, các dự án nguồn mở như Roadsend và phc compile PHP to C, Quercus compiles PHP sang Java và Phalanger biên dịch PHP thành .Net.

Không cần phải nói, nó mất nhiều thời gian hơn so với Hackathon đơn lẻ đó. Tám tháng sau, tôi đã có đủ mã để chứng minh rằng thực sự có thể chạy nhanh hơn với mã được biên dịch. Chúng tôi nhanh chóng bổ sung Iain Proctor và Minghui Yang vào nhóm để đẩy nhanh tiến độ của dự án. Chúng tôi đã dành mười tháng tiếp theo để hoàn thành tất cả mã hóa và sáu tháng thử nghiệm tiếp theo trên các máy chủ sản xuất. Chúng tôi tự hào nói rằng tại thời điểm này, chúng tôi đang phục vụ hơn 90% lưu lượng truy cập Web của chúng tôi bằng HipHop, tất cả chỉ sáu tháng sau khi triển khai.

Cách HipHop hoạt động

Thách thức chính của dự án là thu hẹp khoảng cách giữa PHP và C++. PHP là ngôn ngữ kịch bản với kiểu gõ động, yếu. C++ là ngôn ngữ được biên dịch với gõ tĩnh. While PHP cho phép bạn viết các tính năng động kỳ diệu, hầu hết PHP tương đối đơn giản. Nhiều khả năng bạn thấy if (...) {...} else {..} hơn là để xem function foo($x) { include $x; }. Đây là nơi chúng ta đạt được hiệu suất. Bất cứ khi nào có thể, mã được tạo của chúng ta sẽ sử dụng liên kết tĩnh cho các hàm và biến. Chúng ta cũng sử dụng kiểu suy luận để chọn loại cụ thể nhất có thể cho các biến của mình và do đó tiết kiệm bộ nhớ.

Quá trình chuyển đổi bao gồm ba bước chính:

  1. Phân tích tĩnh nơi chúng tôi thu thập thông tin về người tuyên bố những gì và phụ thuộc,
  2. Nhập suy luận trong đó chúng tôi chọn loại cụ thể nhất giữa các vô hướng C++, Chuỗi, Mảng, các lớp, Đối tượng và Biến thể, và
  3. Việc tạo mã mà phần lớn là sự tương ứng trực tiếp từ PHP câu lệnh và biểu thức đến câu lệnh và biểu thức C++.

Chúng tôi cũng đã phát triển HPHPi, một trình thông dịch thử nghiệm được thiết kế để phát triển. Khi sử dụng HPHPi, bạn không cần phải biên dịch PHP mã nguồn trước khi chạy nó. Nó đã giúp chúng tôi bắt lỗi trong chính HipHop và cung cấp cho các kỹ sư cách sử dụng HipHop mà không thay đổi cách họ viết PHP.

Nhìn chung, HipHop cho phép chúng tôi giữ các khía cạnh tốt nhất của PHP trong khi tận dụng lợi ích hiệu suất của C++. Tổng cộng, chúng tôi đã viết hơn 300.000 dòng mã và hơn 5.000 bài kiểm tra đơn vị.

20
Trinidad

Câu trả lời ngắn - không, bạn không cần C++.

Tôi tin rằng bạn đang đề cập đến HipHop . Nếu bạn đọc về những cải tiến mà nó mang lại, đó là khoảng 50%. Điều này rất quan trọng nếu bạn là Facebook có hàng ngàn máy chủ lối vào. Cắt giảm tải có nghĩa là hàng triệu trong tiết kiệm chi phí trung tâm dữ liệu. Trong trường hợp công ty có 10 - 100 máy chủ frontend, chi phí phát triển sẽ tiết kiệm rất nhiều. Dù sao, việc xử lý nặng nhất được thực hiện ở back-end, thường là một số giải pháp RDBMS hoặc NoQuery, được phát triển dưới dạng mã C/C++ được tối ưu hóa cao.

Tất nhiên, số tiền tiết kiệm có thể đạt được cao hơn rất nhiều chỉ cần bán phá giá PHP hoàn toàn. Nhưng đó không phải là điều bạn có thể làm với cơ sở mã lớn, như trong trường hợp của Facebook.

Bây giờ, đối với phần khác của câu hỏi: nếu bạn thực sự muốn biết cách xử lý tải trọng lớn, hãy đọc blog Khả năng mở rộng cao , đặc biệt là phần Kiến trúc cuộc sống thực.

Có thể với PHP, nhưng chắc chắn sẽ không phải là lựa chọn của tôi. Nếu bạn muốn ngôn ngữ động, Python, Ruby hoặc có thể Lua sẽ là lựa chọn tốt hơn nhiều.

13
vartec

Điều hay ho về cách tiếp cận của FB là họ không phải quyết định ngay lập tức. Bạn nên làm như vậy. Chọn ngôn ngữ giúp bạn làm việc hiệu quả nhất, nhưng hãy chắc chắn rằng nó giao tiếp dễ dàng với C/C++.

Khi bạn có hàng triệu người dùng và cần loại bỏ mili giây thời gian phản hồi, bạn có thể tối ưu hóa các đường dẫn quan trọng bằng C/C++.

6
Scant Roger

Phần tử C++ được Facebook sử dụng là HHVM.

Đó là máy ảo HIPHOP. Mặc dù được viết bằng C++ nhưng về cơ bản nó là "tốt hơn PHP trình thông dịch".

Mã php được biên dịch thành mã byte, sau đó được HHVM giải thích tại thời điểm thực thi và chịu sự tối ưu hóa "Chỉ trong thời gian" khi nó chạy.

Các nhà phát triển tại face book vẫn viết chủ yếu bằng PHP và, những gì bạn thấy trên trình duyệt của bạn gần như chắc chắn được xuất ra bởi một PHP - tất cả đều được biên dịch và giải thích bởi thời gian chạy HHVM .

HHVM thực tế là nguồn mở có sẵn miễn phí. Vì vậy, nếu bạn cần phục vụ một triệu bức ảnh mèo con dễ thương mỗi giờ thì bạn có thể tải xuống HHVM và tăng tốc máy chủ của bạn với sự thay đổi tối thiểu đối với PHP của bạn.

0
James Anderson