Yêu cầu đồng thời tới PHP Script


85

Nếu PHP Engine đang trong quá trình thực thi một tập lệnh trên máy chủ thì điều gì sẽ xảy ra với các yêu cầu trình duyệt đồng thời khác đối với cùng một tập lệnh?

  • Các yêu cầu sẽ được xếp hàng đợi?
  • Liệu họ có bị bỏ qua?
  • Mỗi yêu cầu sẽ có phiên bản script riêng của nó?
  • Có khả năng nào khác không?

1
Ngoài ra kiểm tra câu trả lời này: konrness.com/php5/how-to-prevent-blocking-php-requests
trante

Câu trả lời:


140

Máy chủ, tùy thuộc vào cấu hình của nó, nói chung có thể phục vụ hàng trăm yêu cầu cùng một lúc - nếu sử dụng Apache, MaxClientstùy chọn cấu hình là tùy chọn nói:

Các MaxClientschỉ thị đặt ra giới hạn về số lượng yêu cầu đồng thời sẽ được phục vụ.
Mọi nỗ lực kết nối vượt quá MaxClients giới hạn thông thường sẽ được xếp hàng đợi, tối đa là một con số dựa trên chỉ thị ListenBacklog.
Sau khi một tiến trình con được giải phóng ở cuối một yêu cầu khác, kết nối sẽ được phục vụ.


Thực tế là hai khách hàng yêu cầu cùng một trang không phải là một vấn đề.

Vì thế :

Các yêu cầu sẽ được xếp hàng đợi?

Không; ngoại trừ nếu:

  • có một số khóa ở đâu đó - có thể xảy ra, ví dụ: nếu hai yêu cầu đến từ cùng một ứng dụng khách và bạn đang sử dụng phiên dựa trên tệp trong PHP : trong khi một tập lệnh đang được thực thi, phiên bị "khóa", điều này có nghĩa là máy chủ / máy khách sẽ phải đợi cho đến khi yêu cầu đầu tiên kết thúc (và tệp được mở khóa ) để có thể sử dụng tệp để mở phiên cho người dùng thứ hai.
  • các yêu cầu đến từ cùng một khách hàng VÀ cùng một trình duyệt; hầu hết các trình duyệt sẽ xếp hàng các yêu cầu trong trường hợp này, ngay cả khi không có gì phía máy chủ tạo ra hành vi này.
  • có nhiều hơn MaxClientscác quy trình hiện đang hoạt động - hãy xem phần trích dẫn từ hướng dẫn sử dụng của Apache ngay trước đó.


Liệu họ có bị bỏ qua?

Không: điều này có nghĩa là chỉ một người dùng có thể sử dụng một trang web cùng một lúc; Điều này sẽ không được tốt đẹp, phải không?

Nếu đúng như vậy thì mình không đăng được câu trả lời này, các bạn ở đâu nhấn F5 cùng lúc để xem có người trả lời nhé!
(Chà, SO không có trong PHP, nhưng các nguyên tắc thì giống nhau)


Có khả năng nào khác không?

Vâng ^^


chỉnh sửa sau khi bạn chỉnh sửa OP và nhận xét:

Mỗi yêu cầu sẽ có phiên bản script riêng của nó?

Không có cái gọi là " phiên bản tập lệnh ": nói một cách đơn giản, điều gì đang xảy ra khi một yêu cầu đối với một tập lệnh được thực hiện là:

  • máy chủ web phân nhánh một quy trình khác để xử lý yêu cầu (thông thường, vì lý do hiệu suất, những nhánh này được thực hiện trước, nhưng điều này không thay đổi gì)
  • quá trình đọc tập lệnh PHP từ đĩa
    • một số quá trình có thể làm điều này cùng một lúc : không có khóa khi đọc tệp
    • tập tin được tải vào bộ nhớ; trong một khối bộ nhớ riêng biệt cho mỗi quá trình
  • tệp PHP trong bộ nhớ được " biên dịch " thành mã opcodes - vẫn còn trong bộ nhớ
  • các mã opcodes đó được thực thi - vẫn từ khối bộ nhớ thuộc quy trình trả lời yêu cầu của bạn


Thực sự, bạn có thể có hai người dùng gửi yêu cầu đến cùng một tập lệnh PHP (hoặc đến các tập lệnh PHP riêng biệt mà tất cả đều bao gồm cùng một tệp PHP) ; đó chắc chắn không phải là vấn đề, hoặc không có trang web nào tôi từng làm việc sẽ hoạt động!


Nếu nhiều yêu cầu đồng thời đang truy cập cùng một tệp php thì kết quả sẽ là gì. các yêu cầu khác sẽ được giữ trong khi chờ xử lý hay mỗi yêu cầu sẽ có phiên bản script riêng?
Kevin Boyd

3
Không có cái gọi là "trường hợp tập lệnh": mỗi yêu cầu được xử lý bởi một quy trình (hoặc luồng) riêng biệt ;; các tập lệnh được đọc từ bộ nhớ / đĩa, nhưng cùng một tệp có thể được đọc từ nhiều tiến trình cùng lúc mà không có vấn đề gì (ít nhất là trên các hệ điều hành "hiện đại" - tức là cả Windows và Linux)
Pascal MARTIN

Đây là một câu trả lời tuyệt vời, tôi có thể tìm hiểu thêm chi tiết về cách hoạt động của PHP ở đâu? Bất kỳ cuốn sách tốt cho điều này?
Kevin Boyd

1
Tôi thực sự không biết về điều đó: Tôi đoán là xem qua sách hướng dẫn, đọc các bài báo trên mạng, câu hỏi / câu trả lời ở đây và ở đó, và làm việc với PHP trong vài năm là một cách hay để học - nhưng tôi có thể ' t thực sự giới thiệu bất kỳ cuốn sách nào giải thích chính xác cách hoạt động của PHP ;; có một số thông tin trong "Mở rộng và nhúng PHP", nhưng chủ đề của nó không phải là giải thích cách hoạt động của PHP ;; có lẽ php.net/manual/en/internals2.php có thể giúp đỡ?
Pascal MARTIN

Sự hoàn hảo! Đã giúp tôi rất nhiều!
zookastos

21

Nếu 2 máy khách gọi máy chủ cùng một lúc, máy chủ có thể trả lời cả hai máy khách gần như đồng thời. Các khách hàng ở đây tôi xác định chúng ở cấp trình duyệt.

Có nghĩa là trên cùng một máy, nếu bạn đang sử dụng 2 trình duyệt để tải cùng một trang web / trang cùng một lúc, thì cả hai phải được tải cùng một lúc.

tuy nhiên vì chúng ta đang nói về PHP, bạn cần phải ghi chú đặc biệt về các phiên. Nếu các trang của bạn sử dụng phiên, máy chủ chỉ phục vụ một trang tại một thời điểm. Điều này là do tệp phiên sẽ bị khóa, cho đến khi một tập lệnh thoát.

Nhìn vào ví dụ này. 2 tệp được tải từ cùng một phiên hoặc cùng một trình duyệt cùng một người dùng.

      scripta.php requested                 scripta.php served
------+---+---------------------------------+------------------------>
          scripta.php started

               scriptb.php requested           scriptb.php started
---------------+-------------------------------+-----------------+--->
                                                                 scriptb.php served.

Lưu ý rằng scriptb.php chỉ được bắt đầu sau khi scripta.php được phục vụ. điều này là do khi scripta.php bắt đầu, tệp phiên bị khóa với các tập lệnh khác để scripta.php có thể ghi vào tệp phiên. Khi scripta.php hoàn thành, tệp phiên được mở khóa và do đó các tập lệnh khác có thể sử dụng nó. Do đó scriptb.php sẽ đợi cho đến khi tệp phiên được giải phóng sau đó nó sẽ khóa tệp phiên và sử dụng nó.

Quá trình này sẽ tiếp tục lặp lại để ngăn nhiều tập lệnh ghi vào cùng một tệp phiên gây ra sự chậm trễ. Vì vậy, bạn nên gọi session_write_close() khi bạn không còn sử dụng phiên, đặc biệt là trên trang web sử dụng nhiều iframe hoặc AJAX.


4

Chỉ cần bản thân mình gặp phải điều này. Về cơ bản, bạn cần gọi session_write_close()để ngăn chặn việc khóa người dùng đơn lẻ. Hãy chắc chắn rằng khi bạn gọi, session_write_close()bạn không thử và sửa đổi bất kỳ biến phiên nào. Sau khi bạn gọi nó, hãy coi các phiên là chỉ đọc từ đó trở đi.


3

Trừ khi bạn đang chạy một thiết lập rất không chuẩn, máy chủ web của bạn (Apache, IIS, nginx, v.v.) sẽ có nhiều quy trình chạy PHP riêng biệt cho từng yêu cầu đến máy chủ. Các yêu cầu đồng thời sẽ được phục vụ đồng thời.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.