2012-11-07 6 views
29

Tôi đang làm việc trên một ứng dụng web đang cố gắng kết nối với cơ sở dữ liệu MongoDB từ PHP. Trong 90% of the page nạp tất cả mọi thứ hoạt động tốt, nhưng trong 10% còn lại nó ném ngoại lệ sau khi tôi cố gắng cập nhật một bộ sưu tập: MãPHP + MongoDB: Ngoại lệ không mong muốn 'MongoCursorException' với thông báo 'Không có tệp hoặc thư mục'

Fatal error: Uncaught exception 'MongoCursorException' with message 'No such file or directory' in D:\webDev\webSites\str\dev3\_global_classes\User.php:40 
Stack trace: 
#0 D:\webDev\webSites\str\dev3\_global_classes\User.php(40): 
    MongoCollection->update(Array, Array, Array) 
#1 D:\webDev\webSites\str\dev3\_init\_init.php(8): 
    User->__construct(NULL) 
#2 D:\webDev\webSites\str\dev3\index.php(3): 
    include('D:\webDev\webSi...') 
#3 {main} thrown in D:\webDev\webSites\str\dev3\_global_classes\User.php on line 40 

PHP:

public function __construct($SESSIONID = null) {   
    User::$_users_collection = Main::$_mongo->selectCollection("users"); 

    ... 

    $query = array('session_id' => session_id()); 

    $expiry = time() + Main::$_lifetime; 
    $data = array(
     'session_id' => session_id(), 
     'expiry' => (string)$expiry, 
     'ip' => $_SERVER['REMOTE_ADDR'] 
    ); 

    $options = array(
     'upsert' => true, 
     'safe' => true 
    ); 

    try { 
     User::$_users_collection->update($query, array('$set' => $data), $options); 
    } catch (Exception $e) { 
     throw $e; 
    } 

    ... 
} 

phiên bản Mongo :

Wed Oct 17 10:53:48 /usr/bin/mongos db version v2.0.7, pdfile version 4.5 starting (--help for usage) 
Wed Oct 17 10:53:48 git version: 875033920e8869d284f32119413543fa475227bf 
Wed Oct 17 10:53:48 build info: Linux ip-10-2-29-40 2.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64 BOOST_LIB_VERSION=1_41 

Cụm Mongo của tôi chỉ có một phân đoạn, phiên bản php của tôi là: 5.4.4 và phiên bản trình điều khiển mongo của tôi là: 1.2.12.

+0

Có điều gì có liên quan trong nhật ký máy chủ MongoDB không? –

+1

Máy khách Mongo Phiên bản PECL là 1.3.6. Tôi sẽ đề nghị thử một phiên bản sau vì điều này đã được phát triển tích cực trong một thời gian. https://github.com/mongodb/mongo-php-driver/tags – methai

+1

Bạn có thể thử lặp lại mã không? Điều đó sẽ giúp chúng tôi phân tích chi tiết vấn đề. Vui lòng sử dụng '$ e-> getCode()' trong khối catch. –

Trả lời

0

khó để biết được nơi nó xảy ra, nhưng this page giải thích một cách chi tiết những gì có thể gây ra ngoại lệ này

thư viện
0

Tôi đã nhìn thấy lỗi này khá một chút và nó có ý nghĩa:

MongoDB tăng ngoại lệ con trỏ khi có một TIMEOUT trong con trỏ lặp. Tức là, nếu bạn đưa ra một truy vấn trên Mongo cho một tập dữ liệu lớn, hãy phân bổ một con trỏ. Sau đó, bạn lặp qua con trỏ, truy xuất từng kết quả một lần, đó là hành vi con trỏ bình thường. NHƯNG, nếu bạn vẫn đang truy xuất kết quả sau một thời gian đủ dài, bạn sẽ nhận được thông báo ở trên.

Giải pháp cho điều này có thể là hai điều:

  • (lớp ứng dụng) Lấy kết quả của bạn thành một bộ sưu tập tạm thời và duyệt qua đó (xấu xí);
  • (lớp kết nối) Đặt thời gian chờ của bạn cao hơn trước khi truy vấn (tốt hơn nhiều là giả định có thể).

Lưu ý kết quả của bạn có thể thay đổi, may mắn nhất.

2

Kiểm tra mã lỗi $ e-> getCode(); sử dụng:

try { 
     User::$_users_collection->update($query, array('$set' => $data), $options); 
    } catch (MongoCursorException $e) { 
    echo "error message: ".$e->getMessage()."\n"; 
    echo "error code: ".$e->getCode()."\n"; 
    } 

Và so với các mã lỗi kiểm tra danh sách các lỗi ngoại lệ Mongo Cursor: http://www.php.net/manual/pt_BR/class.mongocursorexception.php

Ví dụ, nếu bạn nhận được mã lỗi 3 "Điều này có thể cho biết bạn đang ra khỏi RAM hoặc một số hoàn cảnh bất thường khác. ".

lưu ý: tránh sử dụng tùy chọn an toàn, không còn được dùng nữa. Sử dụng tùy chọn WriteConcern w, sẽ kích thích thêm tùy chọn.

Về các lỗi:.. "gây ra bằng cách truy cập một con trỏ không đúng cách hoặc một lỗi nhận bài trả lời Bất kỳ hoạt động đó gửi thông tin đến các cơ sở dữ liệu và chờ đợi một phản ứng có thể ném một MongoCursorException Ngoại lệ duy nhất là MongoClient mới() (tạo kết nối mới), sẽ chỉ ném MongoConnectionExceptions. "(http://php.net/manual/en/class.mongocursorexception.php)