2009-12-17 26 views
34

Tôi có một thiết lập công việc cron trên một máy chủ để chạy tập lệnh sao lưu trong PHP được lưu trữ trên máy chủ khác. Lệnh Tôi đã sử dụng được định dạng như thế này:Lỗi Curl 52 Trả lời trống từ máy chủ

curl -sS http://www.example.com/backup.php 

Gần đây tôi đã nhận được lỗi này khi Cron chạy

curl: (52) Empty reply from server 

Tôi không có ý tưởng gì này có nghĩa. Nếu tôi đi đến liên kết trực tiếp trong trình duyệt của tôi kịch bản chạy tốt và tôi nhận được tập tin zip sao lưu nhỏ của tôi.

Có ai có thể cung cấp bất kỳ thông tin nào về nó không?

+0

Điều này thực sự không liên quan gì đến PHP khi curl không quan tâm đến bộ xử lý tệp xuất ra là gì. –

+1

Tập lệnh sao lưu của bạn có thể chạy quá lâu đến nỗi nó khiến 'curl' thành thời gian chờ? Bạn đã thử tăng thời gian chờ curl mặc định để kết nối với '--connect-timeout ' và cho toàn bộ hoạt động cần thực hiện với '--max-time '? –

Trả lời

31

Curl cung cấp lỗi này khi không có thư trả lời từ máy chủ vì đó là lỗi HTTP không trả lời bất cứ điều gì cho yêu cầu.

Tôi nghi ngờ vấn đề bạn có là có một số phần cơ sở hạ tầng mạng, như tường lửa hoặc proxy, giữa bạn và máy chủ được đề cập. Do đó, việc này sẽ yêu cầu bạn thảo luận vấn đề với những người chịu trách nhiệm về phần cứng đó.

+10

Đây có thể là cách tiếp cận sai để khắc phục sự cố. Trả lời trống có nghĩa là nó có thể kết nối với IP/cổng, nhưng máy chủ không trả lại gì trong thư trả lời. Đó có thể là một vấn đề về bản thân dịch vụ. –

+1

Vâng, không hoàn toàn. Khi điều này xảy ra với tôi đó là vì proxy xác thực của tôi không kết nối được với máy chủ từ xa. Vì vậy, trong thực tế thực tế không có vấn đề về bản thân dịch vụ. –

+0

Trong trường hợp của tôi, tôi có proxy, được tắt cho giao diện loopback nơi máy chủ đang chạy. – rbaleksandar

2

Trong trường hợp của tôi, điều này là do sự cố APC của PHP. Nơi đầu tiên để xem sẽ là các bản ghi lỗi Apache (nếu bạn đang sử dụng Apache).

Hy vọng điều này sẽ giúp ai đó.

+0

Bạn có thể giải thích thêm một chút không? Làm thế nào điều này có thể được gây ra bởi APC? Tôi thậm chí không chạy điều này bên trong PHP, tôi chỉ sử dụng dòng lệnh. –

+0

Cách đây rất lâu, tôi không thể nhớ lý do APC là nguyên nhân của vấn đề này. Xin lỗi tôi không thể giúp. – Euperia

3

Trong trường hợp của tôi, đó là chuyển hướng máy chủ; curl -L đã giải quyết được sự cố của tôi.

1

Điều này xảy ra khi bạn đang cố truy cập Trang web an toàn như Https.

Tôi hy vọng bạn bỏ lỡ 's'

Hãy thử thay đổi URL để cuộn tròn -sS -u "username: password" https://www.example.com/backup.php

+1

Rất nhiều không. Và btw auth đơn giản "tên người dùng: mật khẩu" đã làm gì với https? –

0

Hãy thử this -> Thay vì đi qua cURL, hãy thử ping trang web mà bạn' đang cố gắng liên lạc với Telnet. Phản hồi mà nỗ lực kết nối của bạn trả về sẽ chính xác là những gì cURL nhìn thấy khi nó cố gắng kết nối (nhưng nó vô hiệu làm xáo trộn bạn). Bây giờ, tùy thuộc vào những gì bạn thấy ở đây, bạn có thể rút ra một vài kết luận:

Bạn đang cố gắng kết nối với trang web là máy chủ ảo dựa trên tên, nghĩa là không thể truy cập trang web qua địa chỉ IP. Đã xảy ra sự cố với tên máy chủ — có thể bạn đã nhầm lẫn điều gì đó. Lưu ý rằng việc sử dụng GET thay vì POST cho các tham số sẽ cung cấp cho bạn một câu trả lời cụ thể hơn.

Sự cố cũng có thể được gắn với tiêu đề 100 tiếp tục. Hãy thử chạy curl_getinfo($ch, CURLINFO_HTTP_CODE) và kiểm tra kết quả.

+0

Điểm thú vị. Tôi thực sự có thể nhận được HTML như là phản ứng với 'telnet hostname' và' GET ' –

1

bạn có thể thử curl -sS "http://www.example.com/backup.php" bằng cách đặt URL của bạn vào "" làm việc cho tôi Tôi không biết lý do chính xác nhưng tôi cho rằng việc đặt url vào "" hoàn thành yêu cầu tới máy chủ hoặc chỉ hoàn thành yêu cầu tiêu đề.

13

Điều này có thể xảy ra nếu curl được yêu cầu thực hiện HTTP thuần trên máy chủ thực hiện HTTPS.

Ví dụ:

$ curl http://google.com:443 
curl: (52) Empty reply from server 
+2

Đây là tình huống trong trường hợp của tôi. 'curl localhost: 8443' đã cho tôi lỗi trả lời trống. 'curl -k https: // localhost: 8443' đã phục vụ trang đúng cách. –

2

Nó có thể xảy ra khi máy chủ không đáp ứng do 100% CPU hoặc sử dụng bộ nhớ.

tôi đã nhận lỗi này khi tôi đã cố gắng để truy cập sonarqube API và các máy chủ đã không được đáp ứng do sử dụng bộ nhớ đầy

1

Tôi đã có vấn đề này trước đây. Tôi đã tìm ra một ứng dụng khác sử dụng cùng một cổng (3000).

Cách dễ dàng để tìm thấy điều này:

Trong terminal, gõ netstat -a -p TCP -n | grep 3000 (thay thế các cổng mà bạn đang sử dụng cho '3000'). Nếu có nhiều hơn một lần nghe, một cái gì đó khác đã chiếm cổng đó. Bạn nên dừng quá trình đó hoặc thay đổi cổng cho quy trình mới của bạn.

0

Một lý do phổ biến khác cho trả lời trống là hết thời gian chờ. Kiểm tra tất cả các bước nhảy từ nơi cron job đang chạy từ máy chủ PHP/target của bạn. Có thể có một thiết bị/máy chủ/nginx/LB/proxy ở đâu đó dọc theo dòng kết thúc yêu cầu sớm hơn bạn mong đợi, dẫn đến một phản hồi trống.

Các vấn đề liên quan