2009-09-17 27 views
5

Điều này rất đơn giản. Tôi viếtBộ nhớ Zend_Auth hoạt động như thế nào?

$auth->getStorage()->write($user); 

Và sau đó tôi muốn, trong một quá trình riêng biệt để nạp $ thành viên này, nhưng tôi không thể vì

$user = $auth->getIdentity(); 

trống. Không phải tôi chỉ ... ĐẶT nó? Tại sao nó không hoạt động? Halp?

[EDIT 2011-04-13]

Điều này đã được hỏi gần hai năm trước. Thực tế là, mặc dù, mà tôi lặp lại câu hỏi trong tháng 7 năm 2010 và có một câu trả lời tuyệt vời mà tôi trở lại sau đó chỉ đơn giản là không hiểu.

Link: Zend_Auth fails to write to storage

Tôi đã kể từ khi xây dựng một lớp litte rất đẹp mà tôi sử dụng (đôi khi với tinh chỉnh thêm) trong tất cả các dự án của tôi bằng cách sử dụng công cụ lưu trữ giống như Zend_Auth nhưng phá vỡ tất cả các xấu.

<?php 

class Qapacity_Helpers_Storage { 

    public function save($name = 'default', $data) { 

     $session = new Zend_Session_Namespace($name); 
     $session->data = $data; 

     return true; 
    } 

    public function load($name = 'default', $part = null) { 

     $session = new Zend_Session_Namespace($name); 

     if (!isset($session->data)) 
      return null; 

     $data = $session->data; 

     if ($part && isset($data[$part])) 
      return $data[$part]; 

     return $data; 
    } 

    public function clear($name = 'default') { 

     $session = new Zend_Session_Namespace($name); 

     if (isset($session->data)) 
      unset($session->data); 

     return true; 
    } 

} 

?> 
+0

Vấn đề khác có thể là bộ nhớ (và Zend_Auth) không có cùng cấu hình. Viết ở một nơi, đọc trên một địa điểm khác. – AsTeR

Trả lời

1

Đó là nghĩa vụ phải hoạt động.

Dưới đây là việc triển khai chức năng getIdentity Auth.

/** 
* Returns the identity from storage or null if no identity is available 
* 
* @return mixed|null 
*/ 
public function getIdentity() 
{ 
    $storage = $this->getStorage(); 

    if ($storage->isEmpty()) { 
     return null; 
    } 

    return $storage->read(); 
} 

Đây là việc thực hiện ghi PHP phiên lưu trữ và đọc chức năng:

/** 
* Defined by Zend_Auth_Storage_Interface 
* 
* @return mixed 
*/ 
public function read() 
{ 
    return $this->_session->{$this->_member}; 
} 

/** 
* Defined by Zend_Auth_Storage_Interface 
* 
* @param mixed $contents 
* @return void 
*/ 
public function write($contents) 
{ 
    $this->_session->{$this->_member} = $contents; 
} 

Bạn có chắc bạn đang tải cùng một ví dụ của lớp Zend_Auth?

Bạn đang sử dụng

$auth = Zend_Auth::getInstance(); 

Có lẽ bạn đang gọi phương pháp ghi sau khi phương pháp getIdentity?

Dù sao, như tôi đã nói, những gì bạn đang làm sẽ hoạt động.

+0

Vâng, tôi nghĩ rằng tôi đã làm tất cả các loại thí nghiệm với điều này và tất cả những gì tôi nhận được là những vết bầm tím. Về cơ bản, tôi đã thực hiện nó bởi cuốn sách, sau đó với những sửa đổi, sau đó với viết lại, sau đó với các thí nghiệm ngẫu nhiên trừu tượng mà không đạt được bất kỳ kết luận nhất quán nào. Khi cập nhật bộ nhớ, nó hoạt động, nhưng chỉ khi người dùng truy cập vào cùng một trang và cuối cùng có thể sử dụng được làm mới tiếp theo. Nếu tôi có chuyển hướng, nó sẽ không hoạt động trừ khi nó ở trong một lớp đã tải lớp khác, đã cập nhật bộ nhớ, v.v. Kết luận của tôi là crap này hoàn toàn ngẫu nhiên. Cảm ơn mặc dù. – John

+0

Chỉ cần xác nhận việc thiết lập bộ nhớ trực tiếp sẽ hoạt động với tôi. Tôi sử dụng phương pháp đó để buộc danh tính trong chế độ gỡ lỗi khi bị ngắt kết nối để tôi có thể đăng nhập bằng trang đăng nhập ID mở của mình. Tôi nghĩ rằng đây là một vấn đề phiên như được mô tả là vấn đề chủ yếu có khả năng của bạn. – Jai

0

Vì vậy, khi tải lại trang, bạn có thể tìm nạp phiên trong khi không chuyển hướng? Bạn đang chuyển hướng trên một tên miền khác? Sau đó, nó có thể là một vấn đề với Cookie và bạn cần phải tự đặt biến số session.cookie_domain ini.

Kiểm tra xem cookie có tên PHPSESSID đã được đặt đúng chưa và liệu cookie đó có được gửi đến máy chủ trên mọi yêu cầu trang không? Nó có liên tục hay nó thay đổi theo mọi yêu cầu?

Ngoài ra, bạn có thể muốn kiểm tra xem dữ liệu phiên có được lưu đúng cách vào đĩa hay không. Các phiên có thể được tìm thấy trong thư mục được xác định bởi biến ini session.save_path. Tệp có tương ứng với PHPSESSID của bạn ở đó và tệp có chứa mục nhập có ý nghĩa không? Trong trường hợp của tôi nó chứa

[email protected]:~# less /var/lib/php5/sess_081fee38856c59a563cc320899f6021f 
foo_auth|a:1:{s:7:"storage";a:1:{s:9:"user_id";s:2:"77";}} 
+0

Không, đó là cùng một tên miền. Tuy nhiên, tôi sẽ kiểm tra cookie. Bởi thời gian này tôi gần như chắc chắn nó có thể được khá nhiều bất cứ điều gì, bao gồm cả sự nóng lên toàn cầu, heh. – John

0

Add:

register_shutdown_function('session_write_close'); 

lập chỉ mục.php trước:

$application->bootstrap()->run(); 
+0

Điều này không giúp được –

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