2010-02-19 2 views
5

Я использую $_SERVER['DOCUMENT_ROOT'] для моих включенных путей, поэтому файлы будут определять, откуда они работают (т. Е. Находятся ли они в режиме реального времени или находятся в стадии постановки), и он отлично работает, за исключением сценариев, выполняемых cron, в которых я должен hardcode путь.

Есть ли другая переменная, которую я мог бы использовать, которая может работать как из cron, так и из браузера?

ответ

10

При запуске PHP-скрипта через cron я предполагаю, что он выполняется в контексте CLI вместо веб-сервера. В случае выполнения PHP из CLI, $ _SERVER ['DOCUMENT_ROOT'] не заполняется правильно. Вы можете использовать следующий код, чтобы обойти эту проблему:

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

Если скрипт, запущенный из подпапок, вернет подпапки. –

5

Следующая даст вам каталог, что ваш сценарий находится в:

realpath(dirname(__FILE__)); 

Это работает как для веб-запросов и хрон сценариев.

+0

using realpath помог мне при работе над системой Windows, спасибо. – CrandellWS

3

Лучшее, что нужно сделать, это определить свою собственную константу, с которой вы можете ссылаться из любого места в приложении. Например, вы можете поместить что-то подобное в MyAppDirectory/public_html/index.php:

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

Это даст вам последовательную обратную ссылку на MyAppDirectory/независимо от того, где index.php называется или включен с. Определение собственной константы позволяет не только вызывать свое приложение из cron, либо через браузер, как вы хотите, но также позволит вам значительно изменить структуру хранилища с минимальными изменениями для отслеживания. Zend Framework использует это в значительной степени с помощью процесса начальной загрузки Zend_Application, а поиск в google для «php APPLICATION_PATH» предоставит вам множество дополнительных ссылок.

0

Вы можете использовать chdir() функцию, если ваш скрипт работает через хрон:

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

Я работаю на Windows, так что используйте «nnCron», но он тоже должен работать на Linux.

Смежные вопросы