2012-03-16 24 views
18

Tôi đang làm việc trên dự án CakePHP 2. Ban đầu nó bắt đầu trong phiên bản 2.0.x và sau đó mới chuyển sang 2.1.0. Trong suốt toàn bộ quá trình phát triển, tôi đã nhận được thông báo lỗi dưới đây.SplFileInfo :: openFile (/ app/tmp/cache/persistent/cake_core_cake_console _): không thể mở luồng: Quyền bị từ chối trong /lib/.../FileEngine.php dòng 293

Nó bật lên ở đầu trang không thể đoán trước. Nó có thể là khi tôi chỉ xem các trang khác nhau, hoặc thậm chí sau khi tôi thêm một bản ghi vào cơ sở dữ liệu (chưa lưu bản ghi đúng cách).

Warning: 
SplFileInfo::openFile(/var/www/cake_prj/app/tmp/cache/persistent/cake_core_cake_console_): 
failed to open stream: 
Permission denied in 
    /var/www/cake_prj/lib/Cake/Cache/Engine/FileEngine.php on line 293 

Tôi đệ quy đặt chủ sở hữu và nhóm thư mục tmp thành apache và vẫn nhận được thư. Ngoài ra, tôi sau đó đệ quy thiết lập quyền truy cập để đọc, viết và thực thi cho tất cả (chmod 777). Thông báo lỗi vẫn bật lên.

Ngay cả sau khi thay đổi cả chủ sở hữu, nhóm và các quyền, các tập tin trong câu hỏi:

cake_prj/app/tmp/cache/persistent/cake_core_cake_console_ 

sẽ có chủ sở hữu và nhóm thiết lập trở lại gốc rễ của nó, và điều khoản của nó thiết lập trở lại mặc định.

Điều gì có thể gây ra sự cố này? Có cách nào để đảm bảo rằng mỗi khi tập tin này được tạo ra, rằng nó sẽ luôn luôn có apache: apache với quyền đọc/ghi/thực hiện?

Trả lời

13

Đã có báo cáo lỗi tại đây http://cakephp.lighthouseapp.com/projects/42648/tickets/2172 nhưng được coi là không phải là lỗi.

Điều mà tôi nhận thấy là một số chủ sở hữu tệp có thể được sửa đổi khi bạn sử dụng tập lệnh cake trong bảng điều khiển (ví dụ: để tạo bake). Các tệp đã sửa đổi sau đó thuộc về người dùng bạn sử dụng trong bảng điều khiển.

Điều này có nghĩa là bạn gọi số cake khi đang ở gốc? Hay bạn có bất kỳ công việc cron gốc nào gọi là kịch bản lệnh Cake shell?

Cá nhân tôi hiện có thói quen là chmod toàn bộ nội dung thư mục tmp quay lại người dùng apache sau khi đã sử dụng tập lệnh cake và dường như ngăn cảnh báo xuất hiện.

+0

nIcO, cảm ơn phản hồi. Tôi gọi bánh trong khi đăng nhập dưới dạng root. Mặc dù tôi đặt toàn bộ thư mục tmp của mình để có chủ sở hữu và nhóm của nó là 'apache: apache', và sau đó' chmod 777' toàn bộ thư mục đệ quy. Và sau đó tôi chạy bánh nướng nhưng sau đó, các điều khoản vẫn được thiết lập chính xác. Vì vậy, kịch bản 'bánh' dường như không gây ra nó. –

+0

Tôi không chắc rằng nó tạo lại tệp mỗi lần bạn sử dụng tập lệnh 'bánh'. Vì vậy, nó có thể không phải luôn luôn tạo lại các tập tin thuộc về gốc ngay cả khi đây là người dùng bạn sử dụng. Nhân tiện, có lẽ bạn nên sử dụng 'root' để gọi' bánh '. – nIcO

+0

Đã xảy ra gần đây và tôi chưa từng chạy 'bánh 'gần đây nên tôi tự hỏi đó có phải là vấn đề không. Tôi sẽ tiếp tục theo dõi điều này và xem nó có xảy ra lần nữa không. –

24

Bạn có thể giải quyết điều này bằng cách thêm một mặt nạ để cấu hình của bạn trong core.php

Cache::config('default', array(
    'engine' => 'File', 
    'mask' => 0666, 
)); 
+0

Bạn có nghĩ rằng bạn có thể giải thích cho tôi điều này không? –

+1

Tôi vừa chạy vào cùng một vấn đề và điều này dường như khắc phục nó cho tôi. Khi Mark Story giải thích: "Âm thanh như các vấn đề về quyền. Điều này có thể xảy ra khi người dùng cli và apache của bạn khác nhau hoặc umask của bạn không đủ cho phép."Cách giải quyết dường như là sử dụng tùy chọn 'mặt nạ' như được mô tả ở trên và tại đây http://cakephp.lighthouseapp.com/projects/42648/tickets/2172 – BeesonBison

+2

Tôi nghĩ rằng điều này nên đi trong bootstrap.php không core.php –

0

Nếu bạn đang gặp phải các lỗi SplFileInfo trong CakePHP2 và bạn hoàn toàn chắc chắn rằng tập tin/thư mục cho phép của bạn được thiết lên đúng, sau đó một điều khác để kiểm tra là phiên bản PHP của bạn. Cake2 yêu cầu PHP 5.2.8 trở lên và mặc dù bạn thường được cảnh báo trên trang mặc định nếu bạn đang sử dụng phiên bản sai, bạn sẽ không được cảnh báo nếu bạn đã phát triển ứng dụng của mình trên một máy chủ và sau đó chuyển nó sang một máy chủ khác .

Tôi gặp phải lỗi này sau khi phát triển ứng dụng Cake2 trên máy chủ PHP5.3 và sau đó chuyển nó sang máy chủ PHP 5.1. Nâng cấp lên 5.2.17 (trên 5.2.8) đã giải quyết được vấn đề.

+0

Nó có thể đã thay đổi máy chủ một vài lần nhưng tôi tin rằng máy chủ nó chạy trên luôn có các yêu cầu tối thiểu PHP (hiện tại máy chủ có 5.3.3). Một điều cần lưu ý mặc dù là nó chỉ có vẻ xảy ra khi tôi chạy một phiên bản Ứng dụng này trên máy ảo Tôi không chắc liệu điều đó có nghĩa là gì khác không? –

0

Sử dụng điều này ..

cd cakephp/app/tmp/cache/persistent 

sudo chmod 666 myapp* 

cd .. 

cd models 

sudo chmod 666 myapp* 
+0

Điều này có vẻ như một lỗ hổng bảo mật khá lớn nếu bạn làm cho bộ nhớ cache của bạn có thể đọc được và ghi được bởi tất cả mọi người. –

7

Thay vì đặt cho đọc/ghi truy cập vào tất cả mọi người trên thư mục tmp/cache Tôi đã làm điều này:

chgrp -R www-data app/tmp 
chmod -R g+rw app/tmp 
find app/tmp -type d -exec chmod g+s {} \; 

Thiết nhóm các thư mục cho người dùng Apache và sau đó thiết lập các bit setgid sẽ cho phép bạn đảm bảo rằng các tệp được tạo trong thư mục đó nhận được quyền của nhóm thích hợp bất kể người dùng nào chạy tập lệnh trình bao. Điều này cũng cho phép bạn loại trừ quyền đọc/ghi đối với người dùng "khác".

2

Tôi nghĩ lý do của sự cố đã được giải thích, vì cron chạy dưới người dùng root và tệp được tạo trong tmp không thể truy cập được bởi người dùng web. Các giải pháp khác không làm việc cho tôi và tôi không muốn thiết lập quyền tmp để 777, tôi đã kết thúc thiết lập một công việc định kỳ cho người sử dụng web, trong debian đặc biệt nó sẽ là

crontab -u www-data -e 

Taken từ câu trả lời này How to specify in crontab by what user to run script?

0

Bạn cần tạo thư mục ứng dụng/tmp có thể ghi bởi máy chủ web. Tìm hiểu xem người dùng máy chủ web của bạn chạy như thế nào (trong trường hợp của tôi _www) và thay đổi quyền sở hữu thư mục app/tmp cho người dùng đó: $ chown -R _www app/tmp

0

Một giải pháp khác. Xung đột giấy phép xảy ra vì nhiều người dùng chia sẻ cùng một tệp. Vì vậy, nếu chúng ta chia thư mục bộ nhớ cache thành nhiều thư mục con, không xảy ra xung đột và không có quyền mặc định thay đổi của các thư mục và tệp cần thiết.

Như sau, mỗi thư mục cache sub được xác định theo loại hình xử lý api php:

define('CACHE', TMP . 'cache' . DS . php_sapi_name() . DS); 
  • Khi trình duyệt web, người dùng tích cực là apache. Và thư mục phụ là bộ nhớ cache/apache2handler.
  • Khi chạy hàng loạt, người dùng đang hoạt động là người dùng root hoặc đăng nhập. Và thư mục con là cache/cli.

Mặt khác, tài khoản người dùng hiện tại có thể được sử dụng để đặt tên thư mục phụ. Kiểm tra tại How to check what user php is running as?

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