Cảnh báo PHP khi cài đặt mới (Đã hết thời gian kết nối)


10

Tôi nhận được Cảnh báo PHP này khi truy cập cài đặt WordPress 3.4.1 mới (ngôn ngữ Na Uy).

Cảnh báo: fopen (URL_TO_MY_WORDPRESS_PAGE / wp-cron.php? Doing_wp_cron = 1341476616.7605190277099609375000): không thể mở luồng: Kết nối đã hết thời gian trong lớp PATH_TO_MY_WP_FILES

Điều này là tất nhiên với WP_DEBUGcờ được đặt thành true, vì nó đang chạy trên một máy chủ phát triển.

nhập mô tả hình ảnh ở đây

Điều này xảy ra không liên tục, vì vậy nó dường như là một vấn đề với wp-cron.

Đây có phải là lỗi trong WordPress hoặc có lỗi gì đó trên máy chủ của tôi không? Tôi có nên lo lắng không?

Máy chủ là một máy chủ Ubuntu Server 12.04 VM mới với ngăn xếp LAMP.

Tìm kiếm của Google cho thấy tôi không phải là người duy nhất trải nghiệm điều này. (Xem các phiên bản được đệm / lập chỉ mục của các trang được liệt kê để xem các lỗi thực tế.)

EDIT: Tôi cũng nhận được Cảnh báo PHP tương tự trên trang nhất. Nó có thể liên quan đến thực tế là máy chủ web đang bị NAT không? Hiện tại tôi đã thiết lập tường lửa để trỏ cổng 19235 đến 80 trên máy chủ phát triển.


Trong tệp php.ini của bạn, được allow_url_fopenđặt thành BẬT?
it_me

Vâng,allow_url_fopen = On
ohaal

Câu trả lời:


10

Câu trả lời rõ ràng là CÓ, tôi nên lo lắng . Sau một số nghiên cứu, tôi thấy rằng cảnh báo dường như có liên quan đến cấu hình sai trên máy chủ mà WordPress được lưu trữ trên (ví dụ: sự cố với máy chủ của tôi, không phải WordPress).

Cấu hình sai phổ biến:

  1. Máy chủ không có DNS và do đó, nó không thể tìm ra "example.com" là ai, mặc dù chính nó là.
  2. Các quản trị viên máy chủ, trong một nỗ lực sai lầm về bảo mật, đã chặn các yêu cầu "loopback", do đó, nó thực sự không thể thực hiện cuộc gọi lại cho chính nó.
  3. Máy chủ đang chạy một cái gì đó gọi là "mod_security" hoặc tương tự, chủ động chặn cuộc gọi do cấu hình chết não.

Vấn đề trong trường hợp của tôi thực sự là do tường lửa của tôi (pfSense), do "Vô hiệu hóa phản xạ NAT" theo mặc định (được liệt kê là lý do phổ biến # 2).

Trên chính máy chủ, tôi đã cố gắng tiếp cận bản thân bằng telnet và kết quả như sau:

$ telnet bên ngoài.server.hostname.com 19235
Đang dùng thử XXX.XXX.XXX.XXX ...
telnet: Không thể kết nối với máy chủ từ xa: Đã hết thời gian kết nối

Để khắc phục điều này, tôi phải bỏ chọn Vô hiệu hóa phản chiếu NAT trên tường lửa của mình. Trong trường hợp của tôi, đây là trong giao diện web của pfSense trong System-> Advanced-> Firewall / NAT.
Nguồn: http://forum.pfsense.org/index.php?topic=3473.0

nhập mô tả hình ảnh ở đây

Bây giờ tôi có thể kết nối với chính mình (trên chính máy chủ) thông qua tường lửa tốt:

$ telnet bên ngoài.server.hostname.com 19235
Đang dùng thử XXX.XXX.XXX.XXX ...
Đã kết nối với bên ngoài.server.hostname.com.
Nhân vật thoát là '^]'.

và tôi không còn nhận được cảnh báo PHP về wp-cron.


Tôi đã tìm ra điều này sau khi đọc câu trả lời chi tiết này liên quan wp_cron, giải thích cách nó hoạt động.

Câu trả lời ngắn: Thêm phần này vào định nghĩa trong tệp wp-config.php của bạn: xác định ('ALTERNATE_WP_CRON', true);

Câu trả lời thực sự dài, đối với những người bạo dâm: Bài viết theo lịch trình không phải bây giờ, và chưa bao giờ, "bị hỏng". Các nhà phát triển của WordPress không thể sửa nó vì không có gì để sửa.

Vấn đề nằm ở chỗ, máy chủ của bạn, vì một số lý do, không thể thực thi đúng quy trình wp-cron. Quá trình này là cơ chế thời gian của WordPress, nó xử lý tất cả mọi thứ từ các bài đăng được lên lịch để gửi pingback đến các lệnh ping XML, v.v.

Cách thức hoạt động khá đơn giản. Bất cứ khi nào một trang WordPress tải, WordPress nội bộ sẽ kiểm tra xem nó có cần tắt wp-cron hay không (bằng cách so sánh thời gian hiện tại với lần cuối wp-cron chạy). Nếu nó không cần chạy wp-cron, thì nó sẽ cố gắng tạo kết nối HTTP trở lại chính nó, gọi tệp wp-cron.php.

Kết nối này trở lại chính nó là có lý do. wp-cron có rất nhiều việc phải làm, và công việc đó cần có thời gian. Trì hoãn người dùng nhìn thấy trang web của mình trong khi nó thực hiện một loạt các công cụ là một ý tưởng tồi, vì vậy bằng cách làm cho kết nối đó trở lại chính nó, nó có thể chạy chương trình wp-cron trong một quy trình riêng biệt. Vì bản thân WordPress không quan tâm đến kết quả của wp-cron, nên nó chỉ đợi một giây, sau đó quay lại hiển thị trang web cho người dùng. Trong khi đó, wp-cron, đã được đưa ra, sẽ hoạt động cho đến khi hoàn thành hoặc hết thời gian thực hiện.

Kết nối HTTP đó là nơi một số hệ thống được cấu hình kém không thành công. Về cơ bản, WordPress hoạt động như một trình duyệt web. Nếu trang web của bạn là http://example.com/blog , thì WP sẽ gọi http://example.com/blog/wp-cron.php để bắt đầu quá trình. Tuy nhiên, một số máy chủ đơn giản là không thể làm điều đó vì một số lý do. Trong số các lý do có thể:

  1. Server không có DNS, và vì vậy nó không thể tìm ra người "example.com" là, mặc dù nó là bản thân .
  2. Các quản trị viên máy chủ, trong một nỗ lực sai lầm về bảo mật, đã chặn các yêu cầu "loopback", do đó, nó thực sự không thể thực hiện cuộc gọi lại cho chính nó.
  3. Máy chủ đang chạy một cái gì đó gọi là "mod_security" hoặc tương tự, chủ động chặn cuộc gọi do cấu hình chết não.
  4. Thứ gì khác.

Vấn đề là vì bất kỳ lý do gì, máy chủ web của bạn được cấu hình theo một cách không chuẩn nào đó đang ngăn cản WordPress thực hiện công việc của mình. WordPress đơn giản là không thể khắc phục điều đó.

Tuy nhiên, nếu bạn có tình trạng này, có một cách giải quyết. Thêm phần này vào định nghĩa trong tệp wp-config.php của bạn:

xác định ('ALTERNATE_WP_CRON', đúng);

Phương pháp thay thế này sử dụng phương pháp chuyển hướng, làm cho trình duyệt người dùng có được chuyển hướng khi cron cần chạy, để họ quay lại trang web ngay lập tức trong khi cron tiếp tục chạy trong kết nối mà họ vừa bỏ. Phương pháp này đôi khi hơi iffy, đó là lý do tại sao nó không phải là mặc định.

Nguồn: http://wordpress.org/support/topic/schediated-posts-still-not-usiness-in-282#post-1175405

Như đã nêu trong bài đăng tuyệt vời và chi tiết này, nếu bạn không kiểm soát cấu hình máy chủ của mình hoặc, nếu có thể, môi trường - một cách giải quyết là đặt

xác định ('ALTERNATE_WP_CRON', đúng);

trong tập tin wp-config.php của bạn.


3
Báo cáo rất hay!
brasofilo

2
Thật tuyệt khi mọi người tự giải quyết vấn đề của họ, nhưng thật tuyệt vời khi họ quay lại để thả giải pháp. @ohaal Vậy, mọi thứ ổn chưa?
it_me

1
@AahanKrish: Hóa ra, tôi đã nhanh tay một chút trên ngón tay cò súng. Vấn đề đã phức tạp hơn một chút so với dự kiến ​​ban đầu - thủ phạm không phải, như dự đoán ban đầu, lỗi apache2. Tôi đã cập nhật câu trả lời của tôi với các chi tiết.
ohaal
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.