2011-08-19 38 views
8

Tôi gặp sự cố với chức năng filemtime PHP. Trong webapp của tôi, tôi sử dụng công cụ mẫu Smarty với tùy chọn bộ nhớ đệm. Trong webapp của tôi, tôi có thể thực hiện một số hành động gây lỗi, nhưng chỉ tập trung vào một hành động. Khi tôi nhấp vào liên kết trên trang một số nội dung được cập nhật - tôi có thể nhấp vài lần và mọi thứ đều OK nhưng về một yêu cầu trên 10 không thành công. Sau lỗi xảy ra:Chức năng filemtime PHP - "stat không thành công cho"

filemtime() [<a href='function.filemtime'>function.filemtime</a>]: stat failed for 

và dòng gây ra vấn đề:

return ($_template->getCachedFilepath() && file_exists($_template->getCachedFilepath())) ? filemtime($_template->getCachedFilepath()) : false ; 

Như bạn thấy, tập tin tồn tại bởi vì nó được kiểm tra.

dòng Problematic mã được bao gồm trong smarty_internal_cacheresource_file.php (một phần của Smarty lib v3.0.6)

App đang chạy trên hệ thống UNIX, lưu trữ bên ngoài.

Bất kỳ ý tưởng nào? Tôi có nên đăng thêm chi tiết không?

+0

Chỉ cần một lưu ý: là thư mục mẹ có thể đọc được? –

+0

có thể đọc được – lbednaszynski

Trả lời

10

file_exists nội bộ sử dụng cuộc gọi access hệ thống mà sẽ kiểm tra quyền như thực người dùng , trong khi filemtime sử dụng stat, thực hiện việc kiểm tra như hiệu quả sử dụng . Vì vậy, vấn đề có thể được bắt nguồn từ giả định của người dùng thực sự == người dùng thực sự, mà không giữ. Một giải thích khác là tập tin bị xóa giữa hai cuộc gọi.

Vì cả kết quả của $_template->getCachedFilepath() và sự tồn tại của tệp có thể thay đổi giữa các cuộc gọi hệ thống, tại sao bạn lại gọi file_exists? Thay vào đó, tôi muốn đề nghị chỉ

return @filemtime($_template->getCachedFilepath()); 

Nếu $_template->getCachedFilepath() có thể được thiết lập để một giá trị giả như false, sử dụng như sau:

$path = $_template->getCachedFilepath(); 
if (!$path) return false; 
return @filemtime($path); 
+0

Tôi hiểu rằng tệp có thể biến mất giữa hai cuộc gọi, nhưng tôi chỉ là người kiểm tra ứng dụng này. Tôi cũng kiểm tra nó chỉ cho một người dùng thats tại sao nó là lạ đối với tôi. Tôi có thể bỏ qua lỗi bằng cách đặt ký hiệu @, nhưng vấn đề sẽ không biến mất. – lbednaszynski

+1

Tôi không thích các giải pháp bao gồm triệt tiêu lỗi, nhưng +1 cho ghi chú hiệu quả/thực. @marchewa kiểm tra quyền của các tệp. –

+0

Quyền của tất cả các tệp được lưu trong bộ nhớ cache là 0644 (rw-r - r--). Các tập lệnh của tôi tạo, xóa và cố đọc các tệp này. Như tôi đã nói, chỉ khoảng 10% yêu cầu không thành công. – lbednaszynski

0

tôi đã sử dụng filemtime thành công mà không kiểm tra "file_exists" trong nhiều năm. Cách tôi đã luôn luôn giải thích tài liệu là FALSE nên được trả về từ "filemtime" khi có lỗi. Sau đó một vài ngày trước một cái gì đó rất lạ xảy ra. Nếu tệp không tồn tại, công việc Cron của tôi bị chấm dứt với kết quả. Kết quả không nằm trong đầu ra của chương trình mà đúng hơn là trong đầu ra của Cron. Thông báo "đã vượt quá độ dài tệp". Tôi biết công việc của Cron đã kết thúc vào bản tuyên bố về thời gian quay phim vì tôi đã gửi cho tôi một email trước và sau tuyên bố đó. Email "sau" không bao giờ đến.

Tôi đã chèn một kiểm tra tệp_exists trên tệp để khắc phục công việc Cron. Tuy nhiên, điều đó không cần thiết. Tôi vẫn không biết những gì đã được thay đổi trên máy chủ lưu trữ tôi sử dụng. Một số công việc Cron khác đã bắt đầu thất bại trong cùng một ngày. Tôi không biết liệu họ có liên quan gì đến việc làm phim không.

2

Sử dụng:

Smarty::muteExpectedErrors(); 

đọc thisthis

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