PDA

View Full Version : PHP - Thư mục tạm theo sessions



rekcah
04-12-2007, 17:16
Chào các bác!

Em có vấn đề sau nhờ các bác cho ý kiến, giúp đỡ với. Em đang muốn làm hệ thống download có đặc thù như sau:

1 - Muốn download phải login
2 - Link download được cấp trong thư mục theo sessions

VD: Anh A, đăng nhập để download với sessions được gán là 'abc' thì link download của anh A trong phiên làm việc đó là 'http://host.com/abc/file.zip' và có thời hạn là 24h
Anh B cũng download file đó nhưng tất nhiên với sessions là 'xyz' tuy cũng chỉ là 1 file.

Sau khoảng thời gian đã định (như trên là 24h), hệ thống tự quét và xóa thư mục đi.

Điều này rất hữu ích khi muốn che giấu link thật sự nhưng vẫn muốn cho download trực tiếp vì vấn đề download qua buffer không thể resume nếu đứt đoạn và tốc độ cũng ko nhanh.

Và 1 câu hỏi khác nữa, download qua buffer có ưu nhược điểm gì hả các bác? Đối với những file lớn khoảng 100M thì thế nào?

Cảm ơn các bác!
<*kakalot*>

mitavn
04-12-2007, 17:42
Không khả thi !
Tưởng tượng bạn có 500 khách hàng, vậy bạn phải sao chép cái file.zip ra 500 lần àh ! Chưa nói đến bao nhiêu files :D

cái nick đó
04-12-2007, 18:00
tớ nghĩ đó chính là cách mà cách dịch vụ chia sẻ file như Megaupload hay rapidshare sử dụng.

Trong PHP có hàm mkdir, trên Linux có Cron job, theo hướng đó thôi.

mitavn
04-12-2007, 18:07
tớ nghĩ đó chính là cách mà cách dịch vụ chia sẻ file như Megaupload hay rapidshare sử dụng.

Trong PHP có hàm mkdir, trên Linux có Cron job, theo hướng đó thôi.

Cái đó là filehosting nên nó phải cấp mỗi account 1 thư mục để người ta toàn quyền thao tác (upload/download/delete ..) còn vấn đề là bác kia muốn cho thành viên bác ấy download file có sẵn trên server lại phân thư mục theo session từng account ! :no:

cái nick đó
04-12-2007, 18:32
Tớ để ý ở MegaUpload và RapidShare khi download = Premium thì cái link sẽ sống được trong khoảng thời gian nào đó và đường dẫn thì thay đổi sau khoảng thời gian đó, đâu phải mỗi người 1 thư mục cố định.

amida
04-12-2007, 19:14
Nếu vậy mỗi lần user đăng nhập bạn tạo sẵn 1 biến mã (abc,xyz gì đó) rồi cấp cho user đó để họ download. Với mỗi url (your.com/mã/file.rar) đó bạn direct sang cùng một địa chỉ để download thôi. Rồi kiểm tra luôn user có xài đúng mã đã cấp chưa, hay dùng của người khác.
Nhưng cách này coi bộ không khá tí nào :)

rekcah
04-12-2007, 20:18
Cảm ơn các bác cho ý kiến. Em cũng đã nghĩ tới chuyện mkdir tạo thư mục và copy file sang đó nhưng giải pháp đó không tốt với số lượng người online nhiều và dung lượng file lớn.

Mục tiêu của em là thế này, ví dụ có 1 file với đường URL như sau:
http://host.com/store/file.rar

Anh A login (với sessions là [sessions_a]) và download file trên thì link phải là http://host.com/[sessions_a]/file.rar và link trên sống được 1 khoảng thời gian đã định. Tất nhiên với anh B thì link phải là
http://host.com/[sessions_b]/file.rar

Vậy làm thế nào mà không tạo thư mục theo sessions, copy file sang đó. Em đã từng gặp những trang cho download như thế, không biết tìm theo từ khóa nào. Virtual Directory? Active Directory??? Hay là &^%&^%$(*&$ :D

Bác Aminda có thể code hóa ý tưởng bác nêu ra được ko? Vì đó là cái em đang cần học hỏi
<*kakalot*>
p/s: Không biết thuật toán mấy trang rapid, mega, 4share thế nào ạ???

ChipInside
04-12-2007, 20:29
Bạn thử với mod_rewrite của Apache xem sao

Thực chất của các dịch vụ kia không phải là copy file mà là chuyển request. Bạn có thể dùng hàm readfile của PHP để đọc rồi send tới trình duyệt, các dịch vụ kia ko dùng cách này mà can thiệp vào webserver luôn. Cách readfile này chậm và tốn tài nguyên hơn chuyển request tới webserver chứa file, nó giống như là shortcut nhưng không redirect mà request thẳng tới file thông qua alias nào đó.

rekcah
04-12-2007, 20:36
Yeah đúng rồi! Thực chất là chuyển hướng, tuy nhiên em đang tìm hiểu cách chuyển hướng trên Server chạy IIS. Còn Mod_rewrite của Apache thì em mù tịt, bác nào có thể cho ví dụ code được ko ah?
<*kakalot*>

mitavn
04-12-2007, 20:37
Tớ đề nghị vầy cho tiện :
- Khi upload 1 file lên server cậu sẽ lưu nó vào thư mục xác định, rồi cho nó cái tên = id trong DB. VD : http://host.com/files/12/04/2007/39746.rar với 39746 là ID của file đó trong DB (Cậu tổ chức DB sao thì tùy :D tớ đề nghị fileID,fileName,fileDescription,absolutePath.. hi hi )
- Phần quan trọng là cậu viết file .htaccess để handle các extension file đều trỏ về file php hết, có nghĩa là khi người dùng gõ vào địa chỉ http://host.com/files/12/04/2007/39746.rar thì nó sẽ trỏ sang http://host.com/filemanager.php, trong phần manager đó cậu mới xác thực xem người đó đã login hay chưa nếu rồi thì cậu send file 39746.rar cho họ(dùng header() ấy :D ), còn không thì redirect đến trang home hay login gì đó tùy.
Tớ nghĩ không nên tạo directories theo session có hiệu lực trong khoảng thời gian time làm gì, khi họ kết thúc phiên làm việc (đóng trình duyệt chẳng hạn) thì ngưng luôn.
Còn nếu muốn giống Rapidshare thì cậu dùng cookies nữa !
Lý thuyết suông là thế, tớ chưa làm phần này nên cũng không nói chính xác được :no: nếu có time thì tớ sẽ thử :yes:
Thân!

rekcah
04-12-2007, 20:45
Bác Mitavn thân,
Dùng hàm header() để chuyển thì lại quay về buffer rồi (có phải ko nhỉ??). Cái đó em làm ngon lành, cái quan trọng là có thể dùng trình hỗ trợ download.
<*kakalot*>

mitavn
04-12-2007, 20:51
Rekcah thử tham khảo cái Pafiledb này xem http://www.phparena.net/scripts.php?script=pafiledb open source đấy, hồi trước (khoảng 2003) có tham khảo 1 lần, đến giờ lâu quá ko có ghé lại, hi hi :D
p/s : Àh, còn không thì cậu cứ check referrers, nếu ko phải từ server mình thì redirect bố nó sang index.php, công việc còn lại là send file thôi :D, download = Downloader thoải mái hi hi :D

pcdinh
04-12-2007, 21:48
header sẽ chuyển cơ chế send file từ PHP về cho web server. PHP ko dành bộ nhớ để xử lý công việc này nữa nên không gọi là buffer. Nếu dùng Apache thì có thể dùng subrequest để send file đi.

Việc sử dụng buffer đúng là có chậm đi. Nhưng vấn đề lại không phải là nằm ở chỗ đó mà là ở số lượng HTTP connection có thể mở.

Còn về url chỉ tồn tại sau 1 thời hạn nhất định thì đó là khái niệm về các hash and in-memory database. Không có chuyện move file tum lum lùm la như các bác đoán đâu. Các bác move thử 5 file 100Mb trên hệ điều hành xem CPU và I/O nó báo sao????

phluyenc
06-12-2007, 10:28
vậy có ai có code không? share di???

rekcah
07-12-2007, 07:30
Bác PCdinh có thể làm 1 bài nói về khái niệm các hash and in-memory database được ko?
<*kakalot*>

dungpt2003
07-12-2007, 20:28
làm như của mitavn là đúng hướng đó, còn nếu muốn chia sẻ và quản lý thời gian sống của url trong memory có thể dùng APC hoặc eaccelerator.