2013-08-20 38 views
6

Kịch bản Phar của tôi tạo tệp mới với fwrite, hoạt động tốt, nó tạo tệp mới bên ngoài tệp phar, trong cùng thư mục với tệp phar.PHP Phar - file_exists() phát hành

Nhưng sau đó khi tôi sử dụng if (file_exists ('file.php')) nó không nhận nó lên.

Nhưng sau đó bao gồm và yêu cầu chọn nó.

Có ai biết về vấn đề này không? Được thử nghiệm và nghiên cứu một thời gian dường như không thể tìm ra giải pháp.

+0

Phiên bản PHP nào? Trình bao bọc URL có thể chỉ trên verions => PHP 5.0.0 –

+0

Bạn đã thử đề xuất sau từ tài liệu cho ['file_exists()'] (http://php.net/file_exists): "Lưu ý: Kết quả của hàm này Xem lại clearstatcache() để biết thêm chi tiết. "? –

+0

yea, tôi đã thử clearstatcache() - nhưng bộ nhớ cache sẽ lưu trữ nó như là 'tồn tại' và vấn đề của tôi là nó không tìm thấy nó - vì vậy đó chắc chắn không phải là thủ phạm. – Lan

Trả lời

4

Làm việc với đường dẫn tệp và lưu trữ tệp Phar

Làm việc với đường dẫn tệp và tệp nén Phar trong PHP có thể phức tạp. Mã PHP bên trong tệp Phar sẽ xử lý các đường dẫn tương đối là tương đối với tệp nén Phar, không liên quan đến thư mục làm việc hiện tại. Dưới đây là một ví dụ nhỏ:

Giả sử bạn có các tập tin sau đây:

phar/index.php 
test.php 
my.phar 

File index.php nằm bên trong thư mục Phar. Đây là tệp bootstrap cho tệp nén phar:

function does_it_exist($file){ 
    return file_exists($file) ? "true" : "false"; 
} 

Tệp bootstrap được thực thi khi tệp phar được bao gồm trong tập lệnh PHP. File bootstrap của chúng ta sẽ đơn giản khiến hàm "does_it_exist" được khai báo.

Hãy thử chạy đoạn mã khác nhau bên trong test.php và xem những gì kết quả cho mỗi lần chạy:

//Run 1: 
require_once 'phar/index.php'; //PHP file 
$file = __DIR__ . "/index.php"; //absolute path 
echo does_it_exist($file);  //prints "false" 

//Run 2: 
require_once 'phar/index.php'; //PHP file 
$file = "index.php";   //relative path 
echo does_it_exist($file);  //prints "false" 

//Run 3: 
require_once 'my.phar';   //phar file 
$file = __DIR__ . "/index.php"; //absolute path 
echo does_it_exist($file);  //prints "false" 

//Run 4: 
require_once 'my.phar';   //phar file 
$file = "index.php";   //relative path 
echo does_it_exist($file);  //prints "true" 

Nhìn vào Run 4. Mã này bao gồm các tập tin Phar và vượt qua chức năng một đường dẫn tương đối. Liên quan đến thư mục làm việc hiện tại, index.php không tồn tại. Nhưng liên quan đến nội dung của kho lưu trữ phar, nó tồn tại, đó là lý do tại sao nó in "true"!

+0

tôi biết, tôi biết. đó không phải là câu hỏi. gói phar của tôi tạo ra một tệp mới OUTSIDE của tập lệnh phar bằng cách sử dụng fwrite. hoạt động hoàn hảo, một tệp mới được tạo. và mới này sau này có thể được đọc bởi bao gồm hoặc yêu cầu nhưng nó không thể được "nhìn thấy" bởi file_exists - đó là vấn đề của tôi - tôi nghĩ rằng nó có thể là một lỗi trong phar – Lan

+0

@Lan trả lời bạn truy vấn – Vineet1982

+0

cảm ơn, nhưng nếu bao gồm ('đăng nhập .php ') hoặc yêu cầu (' đăng nhập.php ') cả hai tìm và đọc tệp, chắc chắn hơn nếu (file_exists (' login.php ')) sẽ trả về true - chắc chắn bởi thực tế là đọc của nó bằng cách bao gồm/yêu cầu hiển thị đường dẫn/vị trí tệp là chính xác và do đó không phải là vấn đề? – Lan

1

Không chắc những gì đang gây ra file_exists() thất bại nhưng bạn có thể thử một cái gì đó như thế này

function fileExists($path){ 
    //try to open the file, if it can be read the file exist 
    return (@fopen($path,"r") == true); 
} 
+1

ý tưởng hay. cảm ơn. tôi cần phải fclose nó sau đó để giữ cho nó hợp pháp hơn? – Lan

+1

Có ofcourse! Bạn có thể đóng nó sau đó nếu chức năng fopen thành công. Mở tệp, nếu nó đóng thành công tệp và trả về true, ngược lại trả về false. – Konsole

2

file_exists trong php có một số vấn đề, trong những trường hợp cụ thể.

Tôi khuyên bạn nên sử dụng stat() thay vào đó, cách thường được áp dụng để nhận thông tin đó,
không chỉ trong php. Cũng đừng quên xóa bộ nhớ cache bằng cách gọi clearstatcache().

function FileExists($filename) 
{ 
    clearstatcache(false, $filename); 

    return false !== @stat($filename); 
} 

Lưu ý: Tôi cố gắng tránh các nhà điều hành đàn áp @ càng nhiều như tôi có thể nhưng tôi thấy trường hợp cụ thể này là cần thiết để sử dụng nó :)

7

Tại cuống của Phar, bạn có thể sử dụng __DIR__ kỳ diệu liên tục để lấy thư mục của tệp PHAR.

Với ý nghĩ đó, bạn chỉ có thể sử dụng

is_file(__DIR__ . DIRECTORY_SEPARATOR . $path); 

Để kiểm tra sự tồn tại của một tập tin bên ngoài Phar.

Bạn CHỈ có thể thực hiện việc này từ gốc, và CHỈ nếu nó là một nhánh tùy chỉnh, trái ngược với câu lệnh được tạo bởi Phar :: setDefaultStub(). Nếu bạn cần kiểm tra các tập tin ở dưới dòng, bạn sẽ phải làm cho giá trị của hằng số có sẵn bằng cách nào đó, như biến toàn cầu, hằng số tùy chỉnh không kỳ diệu hoặc thuộc tính tĩnh hoặc thứ gì đó mà các tệp khác tham khảo.

EDIT: Trên thực tế, bạn cũng có thể sử dụng dirname(Phar::running(false)) để nhận thư mục PHAR từ bất kỳ đâu trong PHAR. Hàm đó trả về một chuỗi rỗng nếu bạn không nằm trong PHAR, do đó, cho dù ứng dụng của bạn được thực hiện dưới dạng PHAR hay trực tiếp, nó sẽ hoạt động tốt, ví dụ:

$pharFile = Phar::running(false); 
is_file(('' === $pharFile ? '' : dirname($pharFile) . DIRECTORY_SEPARATOR) . $path) 
2

Tôi có thể tạo lại hành vi này bằng cách gọi Phar::interceptFileFuncs(). Có vẻ như các cuộc gọi fopen ở chế độ ghi không bị chặn, trong khi các hàm liên quan đến stat là.

Kể từ tên tập tin tuyệt đối được coi là liên quan đến hệ thống tập tin ngay cả trong tệp nén Phar rằng chức năng tập đánh chặn:

[...] đường dẫn tuyệt đối được giả định là cố gắng để tải tập tin bên ngoài từ hệ thống tập tin.

... một cách để đối phó với vấn đề này là sử dụng realpath():

if (file_exists(realpath($filename)) { /* file exists on filesystem */ } 
4

tôi gặp cùng một vấn đề ngày hôm nay. Sau vài giờ đào ... tôi tìm thấy câu trả lời.

Bạn có thể thử tập lệnh sau trước không?

if(file_exists(realpath('file.php'))); 

Nếu tập tin tồn tại, thì vấn đề là

nếu bạn chỉ sử dụng tên tập tin mà không cần thông tin đường dẫn, file php điều trị có liên quan đến Phar còn sơ khai. ví dụ:

phar:///a/b/c/file.php

Vì vậy, bạn phải sử dụng đường dẫn tuyệt đối để thao tác các tập tin, ví dụ:

/home/www/d/e/f/file.php

Hope trợ giúp này.

Đánh dấu