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ụ
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