Php duy nhất

Tuy nhiên, trường hợp cài đặt PHP phổ biến nhất trên các hệ thống UNIX là một thiết lập duy nhất, như cài đặt Apache phổ biến nhất và NGINX không có kiến ​​trúc dựa trên luồng

Trong thiết lập biến UNIX phổ biến nhất này, mỗi yêu cầu chấp nhận quy trình máy chủ HTTP có thể thực hiện một trong một vài điều kiện

  • Spawn a PHP phiên bản quy định [CGI - Cổng CGI chung]
  • Thao tác một phiên bản trong quá trình của trình thông dịch [MOD_PHP5 - Mô-đun PHP cụ thể của Apache, Dịch vụ cả MPM và Cài đặt công nhân của Apache]
  • Giao tiếp với quy trình FCGI [PHP -FPM - thường được sử dụng với Nginx, một số cách sử dụng Apache vẫn tiếp tục. ]

Trong thiết lập Windows phổ biến nhất và một số thiết lập UNIX nâng cao hơn, PHP có thể và thực hiện nhiều phiên dịch luồng trong một quy trình

Trong mọi trường hợp, mỗi trường hợp của trình thông dịch, có thể trong một quy trình khác hoặc trong một luồng khác, có quyền truy cập vào một biểu diễn duy nhất của lệnh tập tin là kết quả của việc biên dịch tập lệnh PHP thành

Đây là thiết kế, nó được gọi là kiến ​​trúc không có gì và đó là thứ cho phép bạn tạo ra hàng trăm/nghìn/triệu trường hợp của cùng một vở kịch mà phần lớn không thể xen lẫn nhau

Ngay cả khi PHP sử dụng bộ nhớ đệm opcode để lưu tài nguyên trên giai đoạn tổng hợp thực thi, không có hai trường hợp của trình thông dịch truy cập cùng một bộ nhớ vật lý

Đáng chú ý. PHP không hoàn toàn vô hiệu hóa các tác động của việc thực hiện đồng thời trong bất kỳ thiết lập nào, đây là bản chất của điện toán hiện đại; . nếu tập lệnh của bạn chỉnh sửa tệp văn bản đã chỉnh sửa và 1000 máy khách truy cập ngay lập tức, bạn nghĩ điều gì sẽ xảy ra với tệp văn bản?

Các ứng dụng PHP, chắc chắn hoạt động hiệu quả với khả năng đa luồng. MultiThreading là một cái gì đó tương tự như đa nhiệm vụ, nhưng nó cho phép xử lý nhiều công việc cùng một lúc, thay vì trên nhiều quy trình. Vì các công việc nhỏ hơn và các hướng dẫn cơ bản hơn các quy trình nên đa luồng có thể xảy ra trong các quy trình

Ví dụ. có khả năng đa nhiệm cho phép các trình duyệt web có nhiều Windows mở với hình ảnh động flash và JavaScript chạy đồng thời. Trong một chương trình đa luồng hoàn toàn, mỗi quá trình không có tác dụng đối với các quy định khác của chương trình chạy đồng thời miễn phí là CPU giữ lại đủ năng lượng để xử lý chúng. Giống như đa nhiệm, đa luồng cũng phát triển sự ổn định của các chương trình

Có một số ví dụ thực tế về đa luồng từ ngân hàng đến đặt vé. Chúng ta hãy thảo luận về một ví dụ về đặt vé xe xuất tuyến trực tuyến, trong đó nhiều người dùng cố gắng đặt vé xe xuất hiện cùng một lúc, với cách tiếp cận đa luồng, ứng dụng xử lý các luồng khác nhau [tức là . To queue any user continue queue from page web when vé does not available /bán hết. Bằng cách này, bạn có thể xử lý nhiều khách hàng hơn bằng cách sử dụng cùng một máy chủ công suất

Khi đa luồng với PHP không quá phổ biến trong thế giới mã hóa, không có giải pháp thực sự nào để song song với các công việc dài. Chúng tôi phụ thuộc vào việc chuyển qua PCNTL_Fork, bao gồm các vấn đề riêng của nó và rất khó để xử lý các kết quả đầy đủ. pcntl_fork, bao gồm các sự cố của chính nó và rất khó để xử lý các kết quả một cách thỏa đáng

Do đó, sử dụng đa luồng trong PHP là một khái niệm thuận lợi trong cộng đồng PHP. Có nhiều cách khác nhau để thực hiện xử lý bài hát này và hầu hết được coi là 'hacky'

Phần sau đây khám phá những phương pháp thường được sử dụng để đạt được đa luồng trong PHP

1] Thiết lập hàng đợi công việc/nhiệm vụ với phần mềm máy chủ web

Phương pháp này cho phép bạn sử dụng các máy chủ đa bộ xử lý để bạn có thể phân phối nhiệm vụ sử dụng nhiều bộ xử lý một cách hiệu quả

  • Một thông báo, bao gồm tất cả dữ liệu cần thiết để hoàn thành quá trình gói được đóng và mã hóa thành chuỗi JSON
  • Thông báo này được gửi để xếp hạng các cơ chế như AWS SQS, RabbitMQ, Memcache, Redis, Beanstalkmq, v. v
  • Một trình nền quy định đọc các tin nhắn được xếp hạng này với tốc độ cố định và kích hoạt một bài đăng HTTP để chuyển tiếp tin nhắn đến một tập lệnh với tất cả thông tin để thực hiện nhiệm vụ/công việc
  • Sau đó, phần mềm máy chủ web như nginx, apache và tomcat xử lý các yêu cầu quy trình này theo cách như vậy nó sẽ làm như thế nào khi nhiều người dùng nhấn vào một trang web mà nó đang được lưu trữ

Lợi ích. Thật dễ dàng để thực hiện mặc dù nó trông giống như một thiết bị phức tạp. Có thể hiểu được một nhà phát triển làm việc với kiến ​​trúc Stack Web chung. Ngoài ra, bạn có thể bao gồm một công nhân tiêu thụ hàng đợi khác khi hàng đợi trở nên dài hơn và bao gồm nhiều quy trình hơn - do đó nó có khả năng mở rộng cao. Nó rất dễ thực hiện mặc dù có vẻ như là một thiết lập phức tạp. Có thể hiểu được đối với nhà phát triển làm việc với kiến ​​trúc ngăn xếp web chung. Ngoài ra, bạn có thể bao gồm một công nhân tiêu thụ hàng đợi khác khi hàng đợi trở nên dài hơn và bao gồm nhiều quy trình hơn - do đó, nó có khả năng mở rộng cao

Nhược điểm chính là kiến ​​trúc này không đánh giá cả phải chăng cho tất cả các hệ thống hoặc thiết lập máy chủ. Nếu nhu cầu xử lý của bạn là theo yêu cầu, thì hệ thống của bạn có thể phải đối mặt với thời gian máy chủ nhàn nhã, tốn nhiều tiền hơn

Phương pháp này có hiệu quả khi bạn yêu cầu xử lý hàng loạt chuỗi thường xuyên

2] Quy trình sắp xếp với pcntl_fork

Phương pháp này cho phép chúng tôi tạo ra một quy trình cha hoặc 'forking' - các quy trình con, chỉ là bản sao của quy trình cha mẹ Mục đích thực hiện nhiệm vụ

Khám phá thêm về quy trình PHP tại đây

Trong các trường hợp thực tế, phương pháp này rất khó xử lý vì khó duy trì theo dõi các quá trình con và nhu cầu thời gian chạy của chúng. Hơn nữa, nếu họ gặp sự cố hoặc không thoát khỏi sạch sẽ, họ có thể ngăn chặn không gian nhớ. Nhìn chung, phương pháp này hoạt động tốt, nhưng nó đòi hỏi một số kịch bản tốt để đảm bảo quản lý thích hợp và có thể trở nên khó chịu nhanh nếu không xử lý lỗi

3] Xử lý không đồng bộ

Nếu chúng ta có một nhóm các nhiệm vụ độc lập để thực hiện, chúng ta có thể áp dụng phương pháp này vì nó cho phép chúng ta xử lý chúng đồng thời, mà không ảnh hưởng/chặn nhau. Dòng bao gồm

  • Một vòng lặp quy trình cha mẹ xung quanh một bộ công việc
  • Đối với mỗi công việc, 'luồng' mới được tạo ra để thực hiện nhiệm vụ và không cần phải đợi quá trình cha mẹ
  • Quy trình phụ huynh nhận được thông báo khi luồng đã hoàn thành và nó đánh giá lại giới hạn đồng thời nếu có

Phương pháp này rất dễ thực hiện và các chuyên gia cho rằng một mô-đun gọi là "pthreads" trong PHP 7 giúp phương pháp này dễ tiếp cận hơn. PTHREADS được định nghĩa là đối tượng hướng API cung cấp toàn bộ công cụ cần thiết cho đa luồng trong PHP. Giờ đây, các ứng dụng PHP sở hữu khả năng tạo, đọc, viết, thực thi cũng như đồng bộ hóa với các chủ đề, công nhân và các đối tượng chủ đề

Khi nói đến việc thực hiện xử lý không đồng bộ với PHP, việc biên dịch PHP với ZTS [một chủ đề toàn phần Zend] được kích hoạt là hành động đầu tiên và quan trọng nhất chúng ta cần làm

Bằng chứng của khái niệm

Hãy để tôi xem xét cách thực hiện đa luồng trong PHP với phần mở rộng Pthreads

Mã dưới đây chắc chắn là song song, nhưng không có cách nào để kiểm soát có bao nhiêu quy trình chúng ta có thể chạy đồng thời. Sẽ rất tốt nếu bao gồm một số cài đặt đồng thời để mang lại một số cải tiến hiệu quả với giá phải chăng. Ảnh chụp màn hình sau đây minh họa các phân đoạn mã được nâng cấp theo thuộc tính đồng thời bằng cách sử dụng tiện ích mở rộng Pthreads. Pthreads cung cấp một giao diện phong phú, cho phép chúng tôi tạo và kiểm soát nhiều luồng. Do đó, khi bạn có rất nhiều việc phải làm đồng thời, hãy nghĩ hai lần trước khi loại bỏ PHP như một tùy chọn. Chủ đề giành chiến thắng luôn luôn là giải pháp khi nó được sử dụng cho các trường hợp cụ thể có thể được chia thành các đơn vị công việc riêng biệt, nhưng dù sao đó cũng là một công cụ chắc chắn có trong hộp công cụ

Ảnh chụp màn hình sau đây minh họa các đoạn mã được nâng cấp với thuộc tính đồng thời bằng tiện ích mở rộng pThreads

pThreads cung cấp giao diện phong phú, cho phép chúng tôi tạo và kiểm soát nhiều luồng. Do đó, khi bạn có nhiều việc phải làm đồng thời, hãy suy nghĩ kỹ trước khi loại bỏ PHP như một tùy chọn. Phân luồng không phải lúc nào cũng là giải pháp khi nó được sử dụng cho các trường hợp cụ thể có thể được chia thành các đơn vị công việc riêng biệt, tuy nhiên, nó vẫn là một công cụ vững chắc cần có trong hộp công cụ của bạn

Pthreads mở rộng tiện ích thêm lợi ích thú vị. Nó tương thích với PHP7 và một phiên bản mới vừa ra mắt. Hơn nữa, kho lưu trữ mở rộng Pthreads có sẵn trên GitHub và nó phổ biến rộng rãi với các ví dụ, giải thích và tài liệu về cơ chế bên trong của nó. Nâng cấp các ứng dụng PHP của bạn cho một hệ thống đa luồng để mở khóa khả năng bổ sung của nó và tìm lệnh PHP của bạn hoạt động nhanh hơn

Chủ Đề