2012-06-20 34 views
5

Tôi đang sử dụng các dịch vụ Google GeoCoding. Tôi có một ứng dụng PHP gọi API Google Maps và nhận dữ liệu JSON. Chức năng gọi cho máy chủ Google Maps bị treo cho đến khi hết thời gian, nhưng chỉ khi tôi chuyển sang máy chủ riêng ảo Godaddy.file_get_contents treo

Tôi đã ssh'd vào máy chủ và sửa php.ini tôi đã thay đổi "chế độ an toàn" để "tắt"

tôi nhận được thông báo lỗi này:

nhắn: file_get_contents (http://maps.googleapis.com/maps/api/geocode/json?address=xYxY & cảm biến = false): thất bại trong việc mở dòng: Connection timed out

này hoạt động tốt trong máy chủ WAMP của tôi nhưng không thành công trên máy chủ trực tiếp. Bất kỳ ý tưởng tại sao?

+2

Google có thể bị tường lửa trong máy chủ trực tiếp Ur – Sergey

+1

Gọi cho ISP của bạn và yêu cầu họ. Đó là cách dễ nhất. @Sergey đúng, đây có thể là sự cố tường lửa. Nhiều nhà cung cấp không cho phép các loại kết nối này. – Sanjay

+0

Bạn có nhận được bất kỳ thông tin nào khác nếu bạn cố gắng sử dụng 'wget' để tải trang không? Lệnh là: 'wget http: //maps.googleapis.com/maps/api/geocode/json? Address = xYxY & sensor = false' – h2ooooooo

Trả lời

8

Tôi đã tìm thấy câu trả lời. Những gì đã được một tuần, bây giờ? Tôi hy vọng những người khác tìm thấy giải pháp này. Các máy chủ chuyên dụng ảo từ GoDaddy được kích hoạt ipv6, nhưng bản đồ google API không có điều đó. Vì vậy, nói Curl để buộc yêu cầu v4, như thế này:

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); 

tín dụng là một phần do một blog nơi tôi tìm thấy thông tin này:

http://www.businesscorner.co.uk/disable-ipv6-in-curl-and-php/

+0

Rất tốt, thx. –

+1

Tuyệt vời. Tôi đã tìm thấy một số báo cáo lỗi liên quan đến vấn đề này, nhưng bạn là người đầu tiên thực sự đưa ra giải pháp. – Digits

-1

Sử dụng curl để nhận dữ liệu ngoài. Nhiều máy chủ chia sẻ ngăn việc sử dụng file_get_contents cho dữ liệu ngoài (http://www.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen) do các rủi ro bảo mật.

Rất nhiều ví dụ curl trực tuyến.

+0

bắt đầu bằng curl. sau nhiều giờ thất vọng chuyển sang file_get_contents. Bây giờ Im trở lại curl. Nhưng vấn đề vẫn còn. Sử dụng curl OR file_get_contents() Tôi có thể tải dữ liệu từ các máy chủ khác. Tôi không thể gọi API Google Maps. Thời gian xử lý cho thời gian tối đa trên máy chủ chuyên dụng ảo của tôi (120 giây). WOrkds ngay lập tức trên máy cục bộ của tôi, hoạt động ngay lập tức với các url kiểm tra khác. Bản đồ Google chỉ bị treo. – GRY

+0

OK - câu trả lời của tôi không phải là giải pháp sau đó - và tôi sẽ xóa ngay.Nó sẽ là một vấn đề về tường lửa/định tuyến GoDaddy, hoặc google chủ động chặn các cuộc gọi - mặc dù tôi có thể nghĩ cả hai sẽ hết thời gian chờ. Xin lỗi cho chỉ đạo bum (nhưng vẫn đề nghị bạn ở lại với curl cho phát triển trong tương lai). – Robbie

+0

Cảm ơn Robbie, tôi đã chuyển về CuRL Tôi nghĩ bạn đúng về cách tiếp cận tốt hơn. – GRY

0

Kiểm tra mạng của bạn. Google không chặn yêu cầu đó.

Kiểm tra here.

1

Thay vì chỉ vô hiệu hóa IPv6, bạn có thể thử để kết nối qua một phiên bản IP và sau đó trao đổi sang phiên bản khác nếu lần đầu tiên không thành công. Điều này làm cho việc triển khai của bạn mạnh mẽ hơn đối với các sự cố định tuyến tạm thời trên đầu của bạn và từ xa.

Bạn có thể nhận hành vi này trong file_get_contents() bằng cách ràng buộc kết nối với giao diện với inet6 hoặc inet và sau đó thử gia đình địa chỉ khác nếu lần thử đầu tiên trả về FAIL. Tôi đã viết lên how to make file_get_contents() more routing-robust and dual-stack cho bất kỳ ai quan tâm. Tôi cũng cho bạn thấy làm thế nào để buộc các kết nối sử dụng IPv4 hoặc IPv6 nếu bạn thích đi xuống tuyến đường đó.

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