2011-07-11 33 views
9

Tôi đã lập trình PHP trong vài năm nay và chưa bao giờ gặp phải lỗi này trước đây.Require_once Lỗi PHP

Dưới đây là tôi tập widget.php:

require_once('fruit.php'); 
echo "I am compiling just fine!!!"; 

fruit.php tập tin của tôi:

$bVar = true; 

Khi hai tập tin giống như thế này^sau đó tất cả mọi thứ biên dịch không có lỗi và tôi nhận được "Tôi đang biên dịch tốt!" thông báo thành công.

Bây giờ, phút tôi di chuyển fruit.php một file thư mục cấp cao lên, và thay đổi widget.php tập tin của tôi để phản ánh sự chuyển dịch cơ cấu thư mục:

require_once('../fruit.php'); 
echo "I am compiling just fine!!!"; 

Bây giờ tất cả các đột ngột, tôi nhận được cảnh báo PHP & lỗi chết người:

Warning: require_once(../fruit.php) [function.require-once]: failed to open stream: No such file or directory in /webroot/app/widget.php on line 1 

Fatal error: require_once() [function.require]: Failed opening required '../fruit.php' (include_path='.:/usr/local/php5/lib/php') in /webroot/app/widget.php on line 1 

Trong tất cả các năm của tôi làm việc với PHP, tôi đã không bao giờ se vi require_once() thất bại như thế này trước đây. Bất kỳ ý tưởng?!?!

+5

Điều duy nhất tôi có thể nghĩ ngay lập tức, bạn đã kiểm tra quyền của người dùng máy chủ web cho thư mục mẹ chưa?Bạn có thể muốn xác nhận hệ điều hành, máy chủ web, v.v. Tôi có thể thấy rằng có liên quan trong trường hợp này. –

+0

+1 cho Jeff ... máy chủ web "người dùng" có quyền truy cập vào thư mục mẹ hay không. – sdolgy

+0

@Jeff Parker - không có điều đó không bao giờ vượt qua tâm trí của tôi; Tôi sẽ phải gọi máy chủ và hỏi. Đây có phải là một biến trong Apache hay PHP không? Tập tin và tên biến nào? Và cảm ơn! – Kim

Trả lời

1

Hãy nhớ rằng trong trường hợp thứ hai, bạn chỉ định đường dẫn, nhưng trong trường hợp đầu tiên, nó sử dụng đường dẫn bao gồm của bạn. Có lẽ thay vì chỉ định rõ ràng .. trong trường hợp thứ hai, bạn trường hợp sửa đổi đường dẫn bao gồm của bạn.

http://php.net/manual/en/function.set-include-path.php

+0

cảm ơn cho đề nghị và tôi sẽ xem xét nó vào sáng nay, nhưng tôi chưa bao giờ có một vấn đề với việc sử dụng "./" hoặc "../" trước khi bên trong một require_once() tuyên bố, và không bao giờ phải sử dụng hàm set_include_path() để sửa bất kỳ vấn đề nào như thế này trước đây. Cảm ơn một lần nữa! – Kim

+0

IMHO, bộ bao gồm đường dẫn không có ý nghĩa khi bạn trực tiếp bao gồm một tệp như @kim đang làm, hãy sửa tôi nếu tôi sai. – Kumar

+0

Nó có thể là nếu ai đó đã làm một chdir hoặc một cái gì đó như thế. –

-1
require_once('fruit.php'); 

này tìm kiếm cho fruit.php trong cùng thư mục với widget.php là trong, không có vấn đề gì trong thư mục làm việc hiện nay là.

require_once('../fruit.php'); 

này tìm kiếm cho fruit.php trong một thư mục trên thư mục hiện, không phải trong thư mục trên một widget.php là trong.

+0

Không, điều đó sai. 'fruit.php' cố gắng giải quyết đường dẫn bằng cách sử dụng' include_path' (nhắc nhở rằng thư mục làm việc hiện tại '.' thường là một phần của nó) và' ../ fruit.php' cố gắng giải quyết nó _only_ bằng cách sử dụng tác phẩm hiện tại danh mục. – KingCrunch

+0

Bổ sung: Gọi 'fruit.php' không có nghĩa là thư mục công việc hiện tại trỏ tới thư mục, trong đó' fruit.php' là: 'php some/directory/fruit.php'. Hoặc nó đã được thay đổi bằng cách sử dụng 'chwd()' – KingCrunch

13

Có lẽ bạn đang ở trong thư mục làm việc sai. Đó là một ý tưởng tồi để dựa vào nó (ngoại trừ bạn vẫn muốn truy cập nó). Sử dụng

require __DIR__ . '/../fruit.php'; 

hoặc với pre-5,3

require dirname(__FILE__) . '/../fruit.php'; 

Nhắc, rằng con đường bắt đầu với .., hoặc .không giải quyết chống lại bao gồm-con đường, nhưng chỉ chống lại thư mục làm việc hiện hành.

0

Tôi biết câu hỏi cũ, nhưng câu hỏi vẫn có liên quan.

Theo kinh nghiệm của tôi, "open_basedir" directive rất có thể gây ra sự cố này.

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