2012-05-08 9 views
8

- Chạy PHP 5.3.8 trên Linux-get_browser() trả về FALSE

Để bắt đầu, chúng tôi đã giải quyết được vấn đề này tới điểm mà hàm trả về các giá trị mong đợi. Tuy nhiên vẫn còn rất nhiều câu hỏi chưa được trả lời tôi có, và "giải pháp" là một hack-xung quanh hơn bất cứ điều gì.

Tôi đã dành phần tốt hơn trong một ngày cho vấn đề này, vì vậy hãy chịu đựng tôi khi tôi giải thích những gì đã được thực hiện. Để bắt đầu, vấn đề là giá trị trả về của get_browser()FALSE, không phải là giá trị trả về được ghi nhận. Điều này dẫn tôi giả định rằng FALSE được trả về có nghĩa là một số loại trạng thái lỗi trong hàm.

Mã thử nghiệm, sau nhiều lần lặp lại, trở thành chỉ đơn giản var_dump(get_browser($agent, true)). Tôi chạy các thử nghiệm với cả việc truyền chuỗi tác nhân người dùng trực tiếp, cũng như không truyền tham số, ví dụ: var_dump(get_browser()), tất cả đều có cùng giá trị trả lại.

gì đã được thử nghiệm/kiểm tra, không có sự thay đổi trong giá trị trả về:

browscap.ini:

  • Có phiên bản mới nhất, cũng đã thử nghiệm một vài phiên bản trước

Quyền:

  • bowscap.ini - điều khoản ban đầu là 644, nhưng tôi đã cố gắng mọi thứ từ 644-777

  • Thư mục chứa browscap.ini - điều khoản ban đầu là 755, đã cố gắng 777 cũng

  • đã xác minh rằng PHP có thể truy cập vào các tập tin và thư mục với các chức năng khác như file()

User Agent

  • Cố gắng đi qua một chuỗi đại lý hướng dẫn sử dụng

  • Cố gắng đi qua $ _SERVER [ 'HTTP_USER_AGENT']

  • xác nhận chuỗi user agent của tôi với một người bạn ở một vùng đất xa xôi - get_browser() giá trị trở lại như mong đợi .

php.ini

  • Những điểm thiết lập browscap đến vị trí đúng

  • xác nhận một lần nữa với echo count(file(ini_get('browscap')));

Lỗi Logs

  • Checked PHP & Apache err hoặc nhật ký cho bất kỳ đề cập đến 'browscap' hoặc bất cứ điều gì thậm chí liên quan chặt chẽ - không có gì trong số bình thường.

Cấu trúc tập tin

Đây là nơi mà tôi nghi ngờ rằng lỗi đến từ đâu. browscap.ini sống ở /var/php/, có các quyền phù hợp như đã nêu ở trên. Suy nghĩ của tôi là có lẽ PHP không thể truy cập thư mục này, hoặc một cái gì đó dọc theo những dòng đó. Tuy nhiên, thư mục này cũng là nơi các phiên được lưu trữ, do đó sẽ ít có khả năng xảy ra.

"giải pháp"

gì giải quyết vấn đề này đã được di chuyển browscap.ini vào thư mục web công cộng. Tôi tò mò là tại sao đây là trường hợp, đặc biệt là cho các giá trị trả lại không có giấy tờ. "Giải pháp" hoạt động, nhưng không phải là giải pháp mà tôi nghĩ rằng tôi sẽ tìm thấy ...

Có yêu cầu quyền đặc biệt hoặc bất kỳ điều gì tương tự không? file() có thể truy cập vào thư mục và tập tin tốt, nhưng get_browser() không thể (có lẽ). Tôi đã thực sự kéo tóc của tôi ra về vấn đề này và sẽ yêu một số độ phân giải!

Cảm ơn bạn đã đọc!

+1

Bạn đang sử dụng tính năng này để làm gì? Tiêu đề tác nhân người dùng và nhận ra nó không chính xác đáng tin cậy. Bạn có lẽ sẽ có may mắn hơn kiểm tra khả năng của trình duyệt với javascript và gửi thông tin này đến máy chủ. Tuy nhiên điều này không cần thiết, vì bạn thường xử lý phương sai 100% phía máy khách. – dqhendricks

+0

@dqhendricks Điều này là để bảo trì trên một codebase (khá lớn) hiện có. Các giá trị từ cuộc gọi này được sử dụng khắp nơi trong cả nội dung tiền xử lý và phân phát. Tôi luôn mở ra những cách làm mới/tốt hơn, nhưng có lẽ sẽ có quá nhiều việc để thay đổi toàn bộ hệ thống trong trạng thái hiện tại của nó. – orourkek

+0

tôi hiểu. chúc may mắn sau đó. – dqhendricks

Trả lời

4

Thực ra, thậm chí không được ghi trên trang thủ công, hàm get_browser có thể trả lại FALSE vì nhiều lý do.

Ít nhất hãy xem xét the underlying source code hãy giả sử điều đó.

Tôi đề nghị bạn hãy xem trong đó và sau đó cho tôi biết nếu bạn có thêm câu hỏi. Tôi có thể trả lời chúng sau đó.

+1

Tôi đã xem xét các lý do khác nhau khiến nó có thể trả về false, nhưng không có lý do nào trong số đó có ý nghĩa, cho môi trường. Dự đoán tốt nhất của tôi về lỗi là một số vấn đề với việc đọc/mở tệp và các câu hỏi cụ thể của tôi liên quan đến lý thuyết này, ví dụ: nếu 'file()' có thể truy cập tập tin, tại sao không thể 'get_browser()'? PHP không có vấn đề khi mở, đọc và ghi vào tệp này với nhiều hàm, ngoại trừ 'get_browser()', không thành công vì một lý do không xác định. – orourkek

4

Bạn đã thử xung quanh mọi phương thức được yêu cầu.

http://php.net/manual/en/function.get-browser.php có lưu ý:

Để cho tiện làm việc, thiết lập cấu hình browscap của bạn trong php.ini phải trỏ đến vị trí chính xác của tệp browscap.ini trên hệ thống của bạn.

browscap.ini không đi kèm với PHP, nhưng bạn có thể tìm thấy tệp php_browscap.ini cập nhật tại đây.

Trong khi browscap.ini chứa thông tin trên nhiều trình duyệt, nó dựa trên cập nhật của người dùng để giữ cho cơ sở dữ liệu hiện tại. Định dạng của tệp khá tự giải thích.

What solved the issue was moving browscap.ini to the public web directory. 

Có thể trỏ đến vị trí đó. tức là thư mục web công khai

Does get_browser() have special permissions requirements, or anything like that? 

Quyền đọc chỉ bắt buộc.

+0

browscap.ini đã được sử dụng là phiên bản mới nhất có sẵn. Tôi cũng đã thử nhiều phiên bản trước đó mà chúng tôi có trong hệ thống tệp của mình. Đối với các điều khoản, PHP ** đã có ** quyền đọc trên tập tin và thư mục, và chúng tôi thậm chí đã đi xa như vậy để thử 777 quyền trên cả hai. – orourkek

+0

Tôi có nghĩa là để nói rằng có thiết lập browscap trong php.ini mà thực sự là con đường của tập tin đó. Kiểm tra xem thư mục nào đang trỏ. –

3

Tôi gặp vấn đề tương tự như poster gốc. Giải pháp? php.ini yêu cầu một đường dẫn tuyệt đối đến tệp browscap.ini.

Vì vậy, mặc dù PHP tìm thấy các tập tin và nó xuất hiện trong đầu ra phpinfo() 's, dòng sau là vấn đề:

browscap = browscap.ini 

Với dòng đó, getBrowser() trở false.

Tuy nhiên, thay đổi nó vào một đường dẫn tuyệt đối làm việc, như vậy:

browscap = /etc/browscap.ini 

Hy vọng điều này sẽ giúp người! Thật lạ lùng ...

+0

Điều thú vị này không phải là nguyên nhân của vấn đề tôi gặp phải - ban đầu tôi có một con đường tương đối, nhưng đã thay đổi thành tuyệt đối trong việc gỡ lỗi của tôi. Mặc dù nhìn vào [source code] có liên quan (http://lxr.php.net/xref/PHP_5_3/ext/standard/browscap.c#454) cho thấy một vài nơi mà 'FALSE' được trả về. – orourkek