Tập lệnh PHP có dừng thực thi khi bạn nhận được 504 Gateway Timeout không?


8

Tôi đang ở trên một máy chủ được chia sẻ (Siteground) và vì tập lệnh PHP WordPress của tôi mất hơn 30 giây, nó sẽ trả về thời gian chờ 504 Gateway.

Truy vấn của tôi có chạy và hoàn thành nếu nó không gặp phải lỗi nào nữa không?

Chỉnh sửa: Tôi đã hỏi tại sao tôi nhận được lỗi này cho nhóm lưu trữ của mình, ở đây, chuyên gia Hosting của Siteground đã giải thích vấn đề như sau:

Chúng tôi sử dụng cả Apache + Nginx trên tất cả các máy chủ của chúng tôi. Apache được sử dụng cho dịch vụ web chính, trong khi Nginx được sử dụng làm proxy ngược và phân phối bộ đệm. Khi phản hồi không thể được cung cấp từ bộ đệm (thường thì điều này đề cập đến nội dung động), một yêu cầu từ Nginx được thực hiện đối với Apache. Điều này khi Apache đang xử lý yêu cầu, chuyển tiếp nó đến trang web của bạn và theo logic PHP, các truy vấn MySQL có thể được thực hiện hoặc lấy dữ liệu khác. Khi quá trình này mất quá nhiều thời gian và Apache không trả lại phản hồi kịp thời cho Nginx, bạn sẽ thấy lỗi này. Trong ngắn hạn, Apache không thể phục vụ yêu cầu vì ứng dụng đã hoàn tất quy trình trong thời gian cho phép. Điều này cũng có nghĩa là quá trình bắt đầu có lẽ chưa hoàn thành đầy đủ và một số dữ liệu / hành động có thể đã được lưu / thực thi.

Chuyên gia nói rằng "initiated process most probably not completed fully",

Thêm chi tiết về kịch bản của tôi: Kịch bản của tôi thêm các sản phẩm thương mại điện tử với các biến thể sử dụng wp_insert_postphương thức vào trang web wordpress của tôi. Sau khi thêm sản phẩm, nó sẽ hiển thị hình ảnh của các sản phẩm mới được thêm vào.

Khi tôi thêm 1 sản phẩm (40 biến thể), nó sẽ hoàn thành và hiển thị hình ảnh sản phẩm. Khi tôi thêm 6 sản phẩm (240 biến thể), tôi nhận được lỗi trực tiếp trong trình duyệt của mình.

Vì vậy, để kiểm tra thêm vấn đề này, tôi đã sửa đổi mã của mình và viết lại bằng ajax và thêm một thanh quy trình như hệ thống. (Mà tăng một số cho mỗi biến thể).

Sau khi tôi chạy mã cho 1 sản phẩm (với 40 biến thể), số tiến trình tăng lên 40 và nó sẽ hiển thị hình ảnh sản phẩm.

Khi tôi chạy mã cho 6 sản phẩm, số tiến trình tăng lên 240, nhưng nó không hiển thị gì cả và khi tôi kiểm tra, nó nhận được lỗi 504. ( jQuery.Ajaxphần lỗi chức năng)

Vì vậy, điều này khiến tôi nghĩ rằng truy vấn chạy ngay cả khi hết thời gian, nhưng tôi vẫn không thể chắc chắn và đang tìm kiếm thông tin chi tiết về lỗi hết thời gian chờ cổng 504 vì không có tài liệu tốt về điều này.


1
Nó có thể phụ thuộc vào việc thời gian chờ cổng đến từ đâu. Đây là một câu hỏi thú vị.
Stephen Ostermiller

@StephenOstermiller đã thêm một số chi tiết dựa trên nhận xét của bạn.
HOY

Có lẽ bạn sẽ biết liệu tập lệnh đã hoàn thành hay chưa nếu tất cả "6 sản phẩm (240 biến thể)" được thêm vào trang web của bạn? Hay là khó xác định? Có thể thêm một số chức năng đăng nhập vào kịch bản của bạn?
MrWhite

Câu trả lời:


3

Script sẽ không dừng thực thi cho đến khi chúng đạt đến thời gian chờ php.

Lỗi 504 được tạo trên chính gateway / proxy, nó không xuất phát từ quá trình php.

Đó là bởi vì điều này, nếu bạn có một Apache với Apache-mod-php, bạn sẽ không bao giờ gặp phải lỗi này, vì không có proxy.

Mở rộng giải thích, suy nghĩ như sau:

Bạn có một quy trình PHP. Quá trình PHP có thể là PHP-FPM, PHP-CGI hoặc Apache-MOD-PHP. Trong quá trình này, bạn có thời gian chờ (được định cấu hình trên php.ini hoặc với ini_set).

Proxy PHP cung cấp phản hồi trong thời gian cho phép (còn gọi là: nếu bạn có set_time_limit (600), quy trình PHP của bạn có thể chạy tối đa 10 phút).

Không liên quan đến câu này, bạn có thể có một quá trình khác đang chờ phản hồi này: Đó là trường hợp của một apache (được định cấu hình để liên hệ với php bởi cgi hoặc fpm), nginx, lighthttpd và các cách khác. Đó không phải là trường hợp của một apache được cấu hình bởi apache-mod-php. Quá trình thứ hai này, có thời gian chờ mới (proxy_timeout), được định cấu hình trên cấu hình ứng dụng máy chủ vhost / chung. Đó là thời gian chương trình sẽ chờ phản hồi từ công cụ xử lý PHP.

Câu cuối cùng, có thể được lặp lại trên mỗi proxy / gateway.

Hãy suy nghĩ về kịch bản này:

haproxy (Hết giờ 1) -> Nginx (Frontend / cache) (Hết giờ 2) -> Apache (Hết giờ 3) -> PHP-FPM (Hết giờ PHP / set_time_limit).

Và một kịch bản rất đơn giản:

Apache (với apache-mod-php) (Hết giờ PHP / set_time_limit).

Mỗi lần xuất hiện hết thời gian chờ (ngoại trừ chính Thời gian chờ của PHP) là nguồn gốc có thể xảy ra của lỗi hết thời gian chờ cổng HTTP HTTP.


"Nếu bạn có một Apache với Apache-mod-php, bạn sẽ không bao giờ gặp phải lỗi này" - bạn có thể giải thích câu cuối cùng này không?
MrWhite

Khi bạn sử dụng máy chủ Apache với mod-php, việc thực thi đã được thực hiện bởi chính Apache. Bởi vì điều này, bạn không thể có thời gian chờ 504, vì không có bất kỳ cổng nào trong quy trình. Nếu bạn sử dụng php-cgi hoặc php-fpm, Apache / nginx / một số máy chủ web khác đang hoạt động như một proxy hoặc cổng vào công cụ xử lý thực. Sau đó, lỗi 504 xuất hiện khi cổng này không nhận được phản hồi trong một khoảng thời gian được định cấu hình.
Sakura Kinomoto

Nhưng bạn có thể không có proxy ngược Nginx trước mod-php của Apache không?
MrWhite

Rõ ràng, nhưng đó không phải là câu hỏi. Trong trường hợp này, 504 có thể được đưa ra bởi nginx, nhưng không phải Apache. Câu hỏi về trường hợp này là ai nếu mã lỗi 504 được tạo bởi proxy, thì việc thực thi được kích hoạt bởi lệnh gọi proxy sẽ không dừng lại. Trong trường hợp của một cổng hoặc proxy, có ít nhất hai bộ định thời đang chơi. Thời gian chờ của giao tiếp proxy (ví dụ trên nginx) và thời gian chờ trên quy trình php.
Sakura Kinomoto

Tôi hiểu. Nhưng câu cuối cùng của bạn dường như chưa hoàn chỉnh trong trường hợp đó, vì nó ngụ ý rằng chỉ cần sử dụng Apache-mod-php (bất kể có proxy phía trước hay không) sẽ tránh được lỗi này. Tôi giả sử ý của bạn là ... "nếu bạn chỉ có Apache với Apache-mod-php và không có proxy phía trước (Nginx trong trường hợp này) thì bạn sẽ không bao giờ nhận được lỗi này"?
MrWhite

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.