2010-02-19 47 views
5

Tôi đang sử dụng $_SERVER['DOCUMENT_ROOT'] cho các đường dẫn bao gồm của mình để tệp sẽ tìm ra nơi chúng đang chạy (nghĩa là chúng đang hoạt động hoặc dàn dựng) và hoạt động tốt, ngoại trừ các tập lệnh được chạy bởi cron mà tôi phải hardcode đường dẫn.

Có biến nào khác mà tôi có thể sử dụng có thể hoạt động từ cả cron và trình duyệt không?

Trả lời

10

Khi chạy tập lệnh PHP của bạn thông qua cron, tôi giả sử nó được thực thi trong ngữ cảnh của CLI thay vì máy chủ web. Trong trường hợp thực thi PHP từ CLI, $ _SERVER ['DOCUMENT_ROOT'] không được điền chính xác. Bạn có thể sử dụng đoạn mã sau để làm việc xung quanh này:

if ($_SERVER['DOCUMENT_ROOT'] == "") 
    $_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__); 
+1

Nếu tập lệnh chạy từ thư mục con, sẽ trả về các thư mục con. –

5

Sau đây sẽ cung cấp cho bạn các thư mục mà kịch bản của bạn được đặt tại:

realpath(dirname(__FILE__)); 

này hoạt động cho cả các yêu cầu web và các kịch bản cron.

+0

sử dụng realpath đã giúp tôi khi làm việc trên hệ thống cửa sổ, cảm ơn. – CrandellWS

3

Điều tốt nhất cần làm là xác định hằng số của riêng bạn mà bạn có thể tham chiếu từ bất kỳ nơi nào khác trong ứng dụng của mình. Ví dụ, bạn có thể đặt một cái gì đó như thế này trong MyAppDirectory/public_html/index.php:

define('APPLICATION_PATH', realpath(dirname(__FILE__).'/..')); 

này sẽ cung cấp cho bạn một tài liệu tham khảo phù hợp trở lại MyAppDirectory/không phân biệt nơi index.php được gọi hoặc bao gồm từ. Việc xác định hằng số của riêng bạn không chỉ cho phép bạn gọi ứng dụng của mình từ cron hoặc thông qua trình duyệt như bạn muốn, mà còn cho phép bạn thay đổi cấu trúc lưu trữ theo nhiều cách khác nhau với những thay đổi tối thiểu để theo dõi. Zend Framework sử dụng rất nhiều với quá trình khởi động Zend_Application của nó, và googling cho "php APPLICATION_PATH" sẽ cung cấp cho bạn nhiều tham chiếu khác nhau.

0

Bạn có thể sử dụng chdir() chức năng, nếu kịch bản của bạn đang chạy qua cron:

chdir(dirname(__FILE__)); //avoid conflict with "cron path" and app base path (if script runs via 'Cron') 

tôi làm việc trên Windows, do đó sử dụng "nnCron", nhưng nó cũng phải hoạt động trên Linux.

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