HHVM so với PHP 8

Công cụ PHP được tăng tốc từ Facebook tự hào có những cải tiến về hiệu suất, nhưng nút cổ chai thực sự vẫn là chính các ứng dụng

Pixabay

Nóng hổi sau đợt phát hành beta cho phiên bản 7. 0 của ngôn ngữ PHP, dự án HHVM của Facebook -- một công cụ PHP tốc độ cao -- cũng có một bản phát hành điểm mới.  

Điểm chuẩn do Facebook công bố cho thấy những cải tiến về hiệu suất cho HHVM so với cả phiên bản trước và công cụ PHP gốc. Nhưng nhiều gói PHP không tận dụng được toàn bộ phạm vi chức năng do HHVM cung cấp -- hoặc có các bộ thử nghiệm không thành công với HHVM, nghĩa là nó vẫn không phải là sự thay thế chung cho stock PHP

[ Nghệ thuật lập trình đang thay đổi nhanh chóng. Chúng tôi giúp bạn điều hướng những gì hấp dẫn trong lập trình và những gì đang nguội lạnh, đồng thời cung cấp thông tin chuyên sâu về các công nghệ đang thay đổi cách thức hoạt động của các nhà phát triển. . Theo kịp các chủ đề nóng trong lập trình với InfoWorld's. ]

Tuy nhiên, không phải tất cả đó là lỗi của HHVM

Phải đi nhanh hơn, phải đi nhanh hơn

Được giới thiệu vào năm 2013, HHVM sử dụng trình biên dịch just-in-time [JIT] để tăng tốc độ thực thi mã PHP. Mức tăng khác nhau tùy thuộc vào ứng dụng, nhưng bộ điểm chuẩn mới nhất do Facebook phát hành đặt HHVM nhanh hơn từ hai đến bốn lần so với PHP 5 và từ 1. 1 đối 1. Nhanh gấp 5 lần so với PHP 7

Facebook

Điểm chuẩn hiệu suất cho HHVM so với. các phiên bản khác nhau của PHP với nhiều ứng dụng phổ biến. Có thể tăng tốc nhiều hơn, nhưng chủ yếu là với các ứng dụng sử dụng I/O không đồng bộ thay vì bất kỳ thay đổi nào trong chính công cụ PHP

Điều đó nói lên rằng, bất kỳ ai mong muốn sử dụng HHVM và tự động nhận được tốc độ và quy mô giống như Facebook từ các ứng dụng PHP của họ chắc chắn sẽ thất vọng, phần lớn là do cách nhiều ứng dụng PHP hiện có được xây dựng. Trong phân tích về điểm chuẩn của HHVM, Facebook đã lưu ý: "[N]một trong những khung [đã thử nghiệm] này [Drupal, Mediawiki, WordPress] tận dụng kiến ​​trúc I/O không đồng bộ có sẵn trong HHVM [i. e. , không đồng bộ]. "

Do đó, các ứng dụng bị ràng buộc bởi hoạt động I/O đồng bộ chỉ có thể tăng tốc rất nhiều bằng cách tối ưu hóa mức sử dụng CPU của chúng. Tại một số điểm, I/O cũng phải được tối ưu hóa -- và điều đó thuộc về tác giả của ứng dụng PHP, không phải tác giả của công cụ PHP

Đánh nhiều hơn một bức tường

Để hỗ trợ khẳng định này, Facebook đã thực hiện thử nghiệm tối ưu hóa WordPress của riêng mình để sử dụng các truy vấn cơ sở dữ liệu không đồng bộ. Công ty nhận thấy rằng sự thay đổi như vậy "có thể chứng minh hiệu suất đạt được trong cả RPS [yêu cầu mỗi giây] và thời gian phản hồi. " [Số hiệu suất chi tiết đã được hứa hẹn vào một ngày sau đó. ]

Một trở ngại khác có thể xảy ra đối với việc hoán đổi bán buôn PHP cho HHVM. Nhiều gói PHP, như được cung cấp thông qua Trình soạn thảo, chưa vượt qua kiểm tra tự động khi chạy trong HHVM

Trang web Hỗ trợ HHVM trong Dự án PHP theo dõi các gói Trình soạn thảo và trong khi nhiều tùy chọn phổ biến thử nghiệm thành công trong HHVM, một số chỉ hoạt động một phần -- và những tùy chọn khác hoàn toàn không hoạt động. Điều này làm cho HHVM trở nên hữu ích để chạy các ứng dụng và khung được sử dụng phổ biến nhất [chẳng hạn như WordPress đã đề cập ở trên], nhưng các ứng dụng PHP ít phổ biến hơn có thể không may mắn như vậy

Theo thời gian, HHVM có thể đạt được ảnh hưởng lớn nhất không phải bằng cách thay thế PHP mà là nguồn ý tưởng về cách triển khai các lần lặp lại trong tương lai của công cụ PHP gốc. Miễn là phần lớn các ứng dụng PHP không được hiện đại hóa, công cụ chứng khoán sẽ là lựa chọn tốt nhất của hầu hết mọi người

Có liên quan

  • Người phục vụ
  • Phát triển phần mềm
  • Ứng dụng web
  • Kiểm tra ứng dụng
  • PHP

Serdar Yegulalp là một nhà văn cao cấp tại InfoWorld, tập trung vào học máy, container hóa, devops, hệ sinh thái Python và đánh giá định kỳ

Slack ra mắt vào năm 2014 với phần phụ trợ PHP 5. Cùng với một số công ty khác, chúng tôi đã chuyển sang HHVM vào năm 2016 vì nó chạy mã PHP của chúng tôi nhanh hơn. Chúng tôi ở lại với HHVM vì nó cung cấp một ngôn ngữ hoàn toàn mới. Hack [có thể tìm kiếm với tên Hacklang]

Hack làm cho các nhà phát triển của chúng tôi nhanh hơn bằng cách cải thiện năng suất thông qua công cụ tốt hơn. Hack bắt đầu như một siêu bộ của PHP, giữ lại những phần tốt nhất của nó như quy trình chỉnh sửa-làm mới và mô hình bộ nhớ hướng yêu cầu cho phép phát triển nhanh chóng. Ngoài một số cải tiến về chất lượng cuộc sống, Hack còn bổ sung hệ thống loại tốt hơn và trình kiểm tra loại tĩnh, giúp bắt lỗi và cho phép các nhà phát triển viết mã và tái cấu trúc một cách tự tin hơn

Trong bài đăng này, chúng tôi sẽ nói về cách thức và lý do chúng tôi chuyển sang Hack, những lợi ích mà nó mang lại cho chúng tôi và những điều cần xem xét cho cơ sở mã của riêng bạn

Kiểm tra loại tĩnh là một công cụ thay đổi trò chơi

Hệ thống loại của PHP đã trải qua một chặng đường dài kể từ PHP 5, khi không thể chú thích các loại trả về, thuộc tính lớp hoặc loại vô hướng. Những lỗ hổng còn lại, chẳng hạn như thiếu thuốc generic, có thể được giải quyết trong tương lai. Nhưng lỗ hổng lớn nhất của nó là các kiểu chỉ được kiểm tra khi chạy. Đây là thời gian tốn kém nhất để tìm hiểu về các lỗi liên quan đến loại, bằng cách phá vỡ bộ kiểm tra hoặc tệ hơn - báo cáo người dùng hoặc nhật ký lỗi sản xuất

Với Hack, quá trình kiểm tra loại diễn ra tĩnh [không cần chạy mã] và khi bạn nhập. Thay đổi chữ ký của một chức năng với hàng trăm trang web cuộc gọi và bạn sẽ thấy lỗi cho những trang cần cập nhật trước khi nhấn lưu

Đây là một công cụ thay đổi cuộc chơi về năng suất — sự khác biệt giữa việc tìm ra lỗi trong một phần nghìn giây sau khi nhập so với việc chờ đợi một bộ kiểm tra toàn diện [hoặc phát hiện ra sau khi triển khai] là điều khó có thể phóng đại. Nó giống như sự khác biệt về năng suất giữa việc phát triển các trang web bằng PHP so với. C. Với Hack, bạn không cần cố gắng chạy mã cho đến khi trình kiểm tra loại vượt qua và sau đó mã thường chỉ hoạt động. Điều này cho phép các nhà phát triển Slack tự tin xây dựng và tái cấu trúc, tập trung các nỗ lực thử nghiệm vào các khu vực có giá trị cao hơn như lỗi logic mà việc nhập tĩnh không thể giúp ngăn chặn

Có thể kiểm tra loại tĩnh trong PHP bằng các gói cộng đồng và nếu bạn đang sử dụng PHP thì tôi thực sự khuyên bạn nên sử dụng một trong các gói này. Tuy nhiên, trình kiểm tra loại của Hack có lợi thế là hệ thống loại đầy đủ tính năng hơn nhiều để làm việc với. Hack được xây dựng từ đầu để cho phép kiểm tra kiểu tĩnh, với các tính năng mà PHP thiếu như generics, shapes, enums, hack arrays và một thư viện chuẩn được đánh máy tốt để cho phép phân tích tĩnh nghiêm ngặt

Nhập dần dần cho phép di chuyển

Chúng tôi đã bắt đầu với Hack in, coi tất cả các giá trị chưa nhập là loại "bất kỳ", có thể sử dụng cho mọi mục đích. TypeScript lấy. Điều này cho phép di chuyển gia tăng—thêm các loại theo thời gian. Khi các tệp được nhập đầy đủ, chúng tôi đã thay đổi chúng thành chế độ nghiêm ngặt mặc định để chúng giữ nguyên như vậy

Đáng ngạc nhiên là việc dần dần thêm các loại vào một cơ sở mã được gõ yếu khiến tôi suy nghĩ kỹ hơn về an toàn của loại so với khi tôi làm việc với các ngôn ngữ được gõ mạnh như Java hoặc Go. Thay vì yêu cầu chạy trình biên dịch, các kiểu là một quyết định có ý thức để thêm giá trị vào cơ sở mã. Chúng tôi phải biện minh cho việc dành thời gian thêm các loại bằng cách quan sát cách chúng thay đổi cuộc sống làm việc của chúng tôi. Một số phần của cơ sở mã dễ nhập, nhưng những phần khác yêu cầu tái cấu trúc để kích hoạt an toàn loại

Chúng tôi không chỉ tìm thấy và ngăn chặn lỗi mà các loại còn đóng vai trò là một dạng tài liệu nội tuyến có thể xác minh [không giống như các khối nhận xét], giúp mọi người đọc và hiểu mã. Chúng cũng đóng vai trò là hợp đồng giữa các phần khác nhau của cơ sở mã. Điều này rất quan trọng đối với năng suất trong một cơ sở mã lớn, được chia sẻ như phần phụ trợ của Slack

Hệ thống loại của Hack có một tính năng đặc biệt, Shapes, đã gây sốt như cháy rừng ở Slack và tôi tin rằng đó là lý do chúng tôi không bao giờ nhìn lại khi giới thiệu Hack vào cơ sở mã của mình

Hình dạng giúp đại diện cho các cấu trúc phức tạp

Đáng ngạc nhiên là loại 

function http_post[
  string $url,
  http_post_options $options
]: http_response {
  // .. implementation here
}
2 của PHP có thể hoạt động như một danh sách [một tập hợp các giá trị được sắp xếp theo thứ tự] và một bản đồ [một tập hợp các cặp giá trị chính] cùng một lúc. Hầu hết các ngôn ngữ lập trình đều sử dụng các kiểu riêng biệt cho các. Theo kinh nghiệm của tôi, đây là nguồn lỗi vô tận trong mã PHP, đặc biệt là khi các hàm như 
function http_post[
  string $url,
  http_post_options $options
]: http_response {
  // .. implementation here
}
3 xử lý các mảng dạng danh sách và dạng bản đồ khác nhau

Hack cải thiện điều này bằng cách tách chúng thành các loại khác nhau và sử dụng chung chung để mô tả các loại khóa và giá trị của chúng. Mảng dạng danh sách chứa các chuỗi là 

function http_post[
  string $url,
  http_post_options $options
]: http_response {
  // .. implementation here
}
4 và mảng dạng bản đồ có khóa chuỗi và giá trị số nguyên là 
function http_post[
  string $url,
  http_post_options $options
]: http_response {
  // .. implementation here
}
5

Nhưng còn những dict chứa nhiều loại thì sao?

function http_post[
  string $url,
  http_post_options $options
]: http_response {
  // .. implementation here
}
6 là chú thích loại hợp lệ nhưng không đặc biệt hữu ích, chú thích này cho biết chính tả chứa 
function http_post[
  string $url,
  http_post_options $options
]: http_response {
  // .. implementation here
}
7 khóa và giá trị của bất kỳ loại nào

Nhập hình dạng. Một 

function http_post[
  string $url,
  http_post_options $options
]: http_response {
  // .. implementation here
}
0 là một mảng chứa các khóa đã biết với các loại cụ thể. Các phím có thể là tùy chọn nếu đứng trước 
function http_post[
  string $url,
  http_post_options $options
]: http_response {
  // .. implementation here
}
1. Các định nghĩa hình dạng ví dụ này đại diện cho các đối số của một yêu cầu http POST, có nhiều trường tùy chọn

type http_post_options = shape[
  ?'timeout' => int,
  ?'port' => int,
  ?'http_basic_auth' => string,
  ?'headers' => dict,
  ?'form_data' => dict,
  ?'json_payload' => JsonSerializable,
  ?'user_agent' => string,
  ?'follow_redirects' => bool,
];

Chữ ký hàm này sử dụng hình dạng đó để nhập

function http_post[
  string $url,
  http_post_options $options
]: http_response {
  // .. implementation here
}
2

function http_post[
  string $url,
  http_post_options $options
]: http_response {
  // .. implementation here
}

Một trang web cuộc gọi có thể trông như thế này

$result = http_post['//example.com', shape[
  'timeout' => 10,
  'form_data' => dict['example' => 'test'],
]];

Điều này không chỉ giúp đảm bảo các loại chính xác được sử dụng cho từng trường mà còn giúp tránh lỗi chính tả đối với tên của các khóa cả trong trang gọi và trong thân hàm nơi hình được truy cập. Điều này làm cho hình dạng có tác động nhiều hơn đến năng suất của nhà phát triển so với chú thích loại

function http_post[
  string $url,
  http_post_options $options
]: http_response {
  // .. implementation here
}
2 đơn giản. Trước khi định hình, việc tập hợp một lời gọi đến một chức năng như vậy sẽ yêu cầu đọc nội dung của nó hoặc một khối tài liệu lớn [có thể không được cập nhật đầy đủ] để hiểu tên, loại dự kiến ​​và “tùy chọn so với. bắt buộc" trạng thái cho mỗi đối số

Hình dạng được sử dụng cho nhiều trường hợp sử dụng khác nhau tại Slack, bao gồm

  • Hàng cơ sở dữ liệu [hình dạng được tạo mã trực tiếp từ lược đồ DB]
  • Kết quả mong đợi của việc giải mã tải trọng JSON
  • Các hàm có nhiều đối số tùy chọn, như trên

Async/await cho phép đồng thời đơn giản

Khi nhiều tính năng được thêm vào Slack, mỗi yêu cầu có xu hướng có nhiều việc phải làm hơn. Để duy trì trải nghiệm người dùng linh hoạt, đồng thời là một giải pháp phổ biến — thực hiện nhiều việc cùng lúc trong một yêu cầu

Trong nhiều ngôn ngữ lập trình, việc thêm đồng thời có nghĩa là thêm độ phức tạp đáng kể với mutexes, cấu trúc dữ liệu an toàn cho luồng hoặc lệnh gọi lại. Những điều này làm chậm các nhà phát triển, làm cho mã khó suy luận và gỡ lỗi hơn

Hack là một trong số một số ngôn ngữ triển khai mẫu Async/await cho đa nhiệm mà không cần đa luồng. Async/await là một khái niệm trừu tượng đơn giản cho phép tạm dừng các chức năng trong khi chờ I/O, giải phóng thời gian chạy để lên lịch cho các tác vụ khác. Chỉ cần thêm các từ khóa 

function http_post[
  string $url,
  http_post_options $options
]: http_response {
  // .. implementation here
}
4 và 
function http_post[
  string $url,
  http_post_options $options
]: http_response {
  // .. implementation here
}
5 và làm theo một vài nguyên tắc, mã có thể được di chuyển để tận dụng tính đồng thời mà không phá vỡ mô hình tinh thần về cách thức hoạt động của mã

Dưới đây là một ví dụ sử dụng khối mã 

function http_post[
  string $url,
  http_post_options $options
]: http_response {
  // .. implementation here
}
6 để tìm nạp dữ liệu từ hai nguồn cùng một lúc. Những lần tìm nạp này trước đây được thực hiện tuần tự. Việc thêm 
function http_post[
  string $url,
  http_post_options $options
]: http_response {
  // .. implementation here
}
5 và 
function http_post[
  string $url,
  http_post_options $options
]: http_response {
  // .. implementation here
}
6 giúp mã dễ đọc đồng thời cho phép quá trình tìm nạp diễn ra đồng thời

function http_post[
  string $url,
  http_post_options $options
]: http_response {
  // .. implementation here
}
1

Phá vỡ khả năng tương thích PHP giải phóng Hack để phát triển

HHVM đã đi một chặng đường dài kể từ khi Slack bắt đầu sử dụng nó. Phá vỡ khả năng tương thích với PHP là một quyết định gây tranh cãi, yêu cầu chúng tôi loại bỏ mọi dòng mã PHP cuối cùng và các phần phụ thuộc khỏi cơ sở mã của chúng tôi, nhưng đã cho phép cải thiện đáng kể hiệu quả và tính hợp lý cho ngôn ngữ. Kể từ HHVM 4. 0 đã loại bỏ hỗ trợ PHP, các nhà phát triển đã nhanh chóng loại bỏ "PHPism" cản trở sự an toàn và/hoặc hiệu suất của loại, đồng thời thêm các tính năng mới hữu ích. Theo kịp các bản cập nhật này trong một cơ sở mã lớn gần như là một công việc toàn thời gian

Nhược điểm lớn nhất của việc rời bỏ cộng đồng PHP là mất đi hệ sinh thái mở rộng gồm các gói mã nguồn mở trên Packagist. May mắn thay, các dự án Hack vẫn có thể xuất bản trên Packagist và có một số dự án chất lượng cao

  • HHAST cho phép các quy tắc xơ vải biểu cảm và di chuyển mã tự động bằng Cây cú pháp, không giống như các gói của PHP liên quan đến việc phân tích cú pháp một luồng mã thông báo
  • Slack Lược đồ JSON Hack mã nguồn mở, sử dụng Hack Codegen để tạo mã Hack và nhập các định nghĩa từ các định nghĩa lược đồ JSON
  • Hack SQL Fake là một thư viện tôi đã đóng góp để mô phỏng MySQL để sử dụng trong các bài kiểm tra đơn vị. Nó xử lý hàng triệu truy vấn SQL trong mỗi lần chạy thử tại Slack
  • XHP cho phép HTML kết xuất phía máy chủ không đồng bộ, an toàn về loại và chia sẻ lịch sử với JSX của React. Đó là khung HTML phía máy chủ tốt nhất mà tôi đã làm việc cùng

Nhìn về phía trước

Khi Hack tự giải phóng mình khỏi quá khứ PHP, tôi rất vui khi thấy nó trở thành ngôn ngữ hạng nhất theo đúng nghĩa của nó. Mặc dù việc chuyển dần cơ sở mã PHP sang Hack là không khả thi, nhưng tôi hy vọng sẽ thấy nhiều nhà phát triển chọn Hack cho các dự án mới khi ngôn ngữ này ổn định hơn, đặc biệt nếu họ đã quen thuộc với PHP và đang tìm kiếm thứ gì đó tốt hơn

Có một xu hướng chung trong ngành là thêm tính năng kiểm tra kiểu tĩnh vào các ngôn ngữ được diễn giải, với nhiều tùy chọn cho Python, JavaScript và Ruby. Việc kết hợp sự tiện lợi của các ngôn ngữ được giải thích với kiểm tra kiểu tĩnh rất đáng để xem xét đối với các cơ sở mã thuộc mọi quy mô

Scott Sandler là Kỹ sư chính trong nhóm Cơ sở hạ tầng cốt lõi tại Slack. Slack đang thuê kỹ sư phụ trợ

HHVM có thể chạy PHP không?

hhvm[1] [hay còn gọi là Máy ảo HipHop] là một máy ảo nguồn mở được thiết kế để thực thi các chương trình viết bằng Hack và PHP .

HHVM dùng để làm gì?

HHVM là một máy ảo mã nguồn mở được thiết kế để thực thi các chương trình được viết bằng Hack . HHVM sử dụng phương pháp biên dịch đúng lúc [JIT] để đạt được hiệu suất thời gian chạy tuyệt vời trong khi vẫn duy trì tính linh hoạt phát triển tuyệt vời. HHVM hỗ trợ ngôn ngữ lập trình Hack.

PHP HHVM là gì?

Máy ảo HipHop [HHVM] là một máy ảo nguồn mở dựa trên quá trình biên dịch just-in-time [JIT] đóng vai trò là công cụ thực thi cho ngôn ngữ lập trình Hack< . .

PHP 8 có tốt hơn PHP 7 không?

Nhóm đằng sau việc phát hành PHP 8 tự hào về thông báo của họ về hiệu suất tốt hơn, cú pháp tốt hơn và an toàn loại được cải thiện. PHP 8 nhanh hơn PHP 7 , cú pháp yêu cầu ít mã hơn và hỗ trợ gõ tốt hơn. Ba loại cải tiến này cung cấp một bản phát hành phiên bản chính mạnh mẽ của PHP.

Chủ Đề