Hướng dẫn php is single threaded or multi-threaded - php là đơn luồng hoặc đa luồng

PHP không phải là duy nhất do tự nhiên.NOT single threaded by nature.

http://php.net/Thread

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 ren 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 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:

  • Spawn một quy trình phiên dịch PHP (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 luồng phiên dịch 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 tập lệnh là kết quả của việc biên dịch tập lệnh PHP thành các opcode để thực hiện bởi Zend.

Đây là do thiết kế, nó được gọi là một kiến ​​trúc không có gì và đó là thứ cho phép bạn tạo hàng trăm/nghìn/triệu trường hợp của cùng một kịch bản mà phần lớn không can thiệp 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; Ví dụ: nếu tập lệnh của bạn chỉnh sửa tệp văn bản và 1000 máy khách đến ngay lập tức, bạn nghĩ điều gì sẽ xảy ra với tệp văn bản?

Một luồng là một đơn vị nhỏ các hướng dẫn có thể được thực thi bởi bộ xử lý. Một ứng dụng sử dụng luồng nếu nó yêu cầu song song. Nói cách khác, bằng một chương trình duy nhất, chúng ta có thể xử lý nhiều đơn vị hướng dẫn tương đương.

Khả năng phục vụ yêu cầu PHP không được đa luồng, cho mọi yêu cầu mà một quy trình PHP mới được gọi và phục vụ. Nếu máy chủ của bạn không phải là đa lõi thì không thể diễn ra song song. .
PHP does not give inbuilt multi-threading functionality, we need to add package/extension “threads” to our PHP.

http://php.net/manual/en/pthreads.installation.php

Tiện ích mở rộng Pthread đi kèm với rất nhiều khái niệm khác nhau, ba lớp cơ bản được liệt kê ở đây để bắt đầu đá

Các đối tượng chủ đề: Một lớp là một đơn vị của các hướng dẫn thực thi (luồng), đó là những gì bạn muốn thực thi không đồng bộ. Phương thức chạy trong lớp này có khả năng thực thi nó như một luồng.: A class that is a unit of executable instructions (thread), It is what you want to execute asynchronously. the run method in this class has the ability to execute it as a thread.

Công nhân: Đây là một lớp được sử dụng để xử lý các luồng, tạo kết quả được đồng bộ hóa.: It is a class that is used to handle threads, make results synchronized.

Bể bơi: Lớp này được sử dụng để xử lý nhiều trường hợp lớp công nhân và quản lý chúng.: This class is used to handle multiple worker class instances and managing them.

Ví dụ đơn giản cho chủ đề

Pthread với tự động tải & kế thừa bối cảnh

Tất cả các ví dụ không liên quan đến ứng dụng trong thế giới thực, nơi chúng ta cần đặt luồng vào khung của chúng ta như Yii 2, Slim, v.v. trong đó chức năng tự động tải tải thư viện và ứng dụng nhưng với chuỗi con (đó là một đơn vị xử lý một đơn vị xử lý Quy trình của bạn) Nó có thể không liên quan đến bối cảnh cha mẹ có nghĩa là có thể có vấn đề về lớp không tìm thấy ngay cả khi lớp đã được tải vào bối cảnh cha mẹ. Trong trường hợp này, chúng ta có thể gọi chức năng tự động tải đến từng luồng nhưng nó sẽ làm cho mọi thứ chậm hơn . Chúng tôi có thể giải quyết vấn đề tự động tải với sự trợ giúp của lớp công nhân xếp chồng hoặc tập hợp với sự trợ giúp của lớp công nhân.
In this case, we can call autoload functionality to each thread but it will make things slower. We can solve the autoloading issue with the help of Worker class stacking or Pooling with the help of the worker class.

Chủ đề có thể tùy chỉnh sự kế thừa của bối cảnh khi chúng ta bắt đầu luồng. Mặc định là kế thừa tất cả.

PTHREADS_IZERIT_CLASSES: Chỉ thừa kế ClassedPthreads_Inerit_constants: Chỉ thừa kế ConstantSpThreads_Inerit_Funces: kế thừa chỉ hàm
PTHREADS_INHERIT_CONSTANTS: Inherit only constants
PTHREADS_INHERIT_FUNCTIONS: Inherit only functions
PTHREADS_INHERIT_NONE: Inherit nothing from the parent context.

http://php.net/manual/en/pthreads.constants.php

Trong trường hợp một công nhân với gộp, nếu bạn muốn đặt kế thừa thuộc tính của một luồng, chúng tôi chỉ đơn giản là không thể vì phương thức bắt đầu của luồng được gọi bởi lớp công nhân. Chúng ta cần ghi đè phương thức bắt đầu ở đây là một ví dụ:

Sử dụng luồng:

Chúng tôi có thể sử dụng luồng cho công cụ thông báo, công cụ lập lịch hoặc cho bất kỳ loại xử lý hàng loạt nào cho ứng dụng PHP.

PTHREAD với Lập lịch tác vụ: Một ví dụ thực tế

Ứng dụng của tôi yêu cầu một công cụ lập lịch để xử lý các nhiệm vụ với số lượng lớn, trong đó một số thành phần khác được tiếp tục đẩy các nhiệm vụ đến hàng đợi. Vì vậy, nhiệm vụ cơ bản của công cụ lập lịch là xử lý các nhiệm vụ tại thời điểm chúng có nghĩa là/dự kiến ​​sẽ có cơ sở ưu tiên.

Trước khi thực hiện Pthread

Lần thử đầu tiên

Chúng tôi đã sử dụng Cron Job và tiếp tục tạo công việc cron cho các nhiệm vụ để thực hiện. Trong trường hợp này, chúng tôi đã sử dụng bộ lập lịch của hệ thống để nhấn một quy trình kiểm tra gấp đôi công việc và làm cho mọi thứ thực thi. Đây là một cách giáo dân để hoàn thành công việc, chúng tôi đã tìm ra rằng số lượng tác vụ quá cao và máy chủ có thể đi vào trạng thái bế tắc.
This was a layman way to complete the job, we figured out that the number of tasks is too high and the server can go into a deadlock state.

Một số tiến hóa

Chúng tôi nhận được rằng chiến lược trước đó là một thất bại đối với các ứng dụng khổng lồ, bây giờ chúng tôi đã tạo ra một quy trình miền với tập lệnh chẩn đoán, quá trình tiếp tục tìm kiếm công việc với một số logic, nếu tìm thấy bất kỳ, nó thực hiện. Mặt khác, tập lệnh chẩn đoán tiếp tục xem quy trình miền nếu quá trình thoát hoặc chấm dứt thì công việc tập lệnh là làm cho quá trình miền chạy trở lại.

Và đây là pthread trong hình

Chiến lược tên miền đã hoạt động tốt nhưng sau đó các nhiệm vụ có quá nhiều với logic ưu tiên và mọi thứ trở nên thực sự chậm chạp, theo lịch trình muộn để chạy và một lần nữa chúng tôi ở trong tình huống chúng tôi không thể đi trước. Vì vậy, chúng tôi đã thực hiện PTHREAD với Chiến lược quy trình miền và gộp trong đó quy trình miền tìm kiếm công việc và khi một công việc trưởng thành, nó thực hiện nó bằng cách tạo một luồng mới.
So we implemented pthread with our domain process strategy and pooling where domain process seeks jobs and when a job became mature, it executes it by creating a new thread.

Đây là mã của công cụ lập lịch mẫu với MongoDB

Lớp Lập lịch

Danh sách bài viết của tôi

Đa luồng trong PHP

Kết nối đọc / ghi Laravel sử dụng nhiều cơ sở dữ liệu

Lập trình ổ cắm trong PHP

Tại sao php đơn lẻ?

Bản chất duy nhất của PHP có nghĩa là PHP không có bất kỳ hỗ trợ tích hợp nào để sinh ra các luồng mới trong quá trình thực thi tập lệnh.Tuy nhiên, điều này không có nghĩa là bạn không thể có hai lần thực hiện cùng một tập lệnh một cách đồng thời.Trong thiết lập phổ biến nhất, trang web của bạn được phục vụ bởi Apache HTTPD.PHP doesn't have any built-in support for spawning new threads during script execution. However, this doesn't mean that you can't have two executions of the same script simultanously. In the most common setup, your website is served by Apache HTTPD.

Chủ đề PHP là gì?

Một luồng là một đơn vị nhỏ các hướng dẫn có thể được thực thi bởi bộ xử lý.Một ứng dụng sử dụng luồng nếu nó yêu cầu song song.Nói cách khác bằng một chương trình duy nhất, chúng ta có thể xử lý nhiều đơn vị hướng dẫn tương đồng.a small unit of instructions which can be executed by a processor. A application uses threading if it requires parallelism. In other words by a single program ,we can process multiple unit of instructions parallaly.

Php Apache có đa luồng không?

Trong khi PHP có thể là một luồng, Apache có thể chạy đa quy trình và đa luồng.Điều này cho phép nhiều yêu cầu được thực hiện đồng thời.Apache can run multi-process and multi-threaded. This allows many requests to be executed simultaneously.

Là một sợi đơn của Laravel?

Mỗi hàng đợi sẽ là một quy trình duy nhất (trừ khi bạn biên dịch PHP cho đa luồng và sau đó sử dụng nó).Tùy thuộc vào bạn để phân chia hàng đợi cho phù hợp. (unless you compile php for multithreading and then utilize it). It's up to you to split up the queues accordingly.