CLI включает пути для запуска Zend Framework через cron - PullRequest
3 голосов
/ 27 апреля 2010

Я написал утилиту командной строки, используя Zend Framework, для создания ночных отчетов. Он использует тонну той же функциональности сопутствующего сайта. Он отлично работает, когда я запускаю его вручную, но когда я запускаю его на cron, у меня возникают проблемы с путями. Похоже, это должно быть легко исправлено с помощью set_include_path, но, может быть, я что-то упустил?

Моя структура каталогов выглядит так:

/var/www/clientname/
    application
        Globals.php
    commandline
        commandline_bootstrap.php       
    public_html
        public_bootstrap.php        
    library
        Zend

В public_bootstrap.php я без проблем использую set_include_path относительно текущего каталога:

set_include_path('../library' . PATH_SEPARATOR . get_include_path());  

Если я правильно понимаю, в commandline_bootstrap.php мне нужно указать абсолютный путь, чтобы cron знал, где все находится. Мой файл начинается так:

error_reporting(E_ALL);
set_include_path('/var/www/clientname/library' . PATH_SEPARATOR . get_include_path());  
require_once "../application/Globals.php";

Но когда я запускаю его через cron, я получаю следующую ошибку:

Неустранимая ошибка PHP: require_once (): Не удалось открыть '../Application/Globals.php' (Include_path = '/ вар / WWW / ClientName / библиотека /') в /var/www/clientname/commandline/zfcli.php по линии 11

Я думаю, что PHP принимает мой новый путь, потому что когда я запускаю его из командной строки и выкидываю phpinfo, я вижу:

include_path => /var/www/clientname/library/:.:/usr/share/pear:/usr/share/php =>.: / usr / share / pear: / usr / share / php

Я допускаю, что здесь синтаксис выглядит немного странно, но я не могу понять, как это исправить. Любые предложения будут с благодарностью.

Спасибо лето

Ответы [ 2 ]

2 голосов
/ 29 апреля 2010

Взгляните на подход Падрайка к zf-cli на ZFPlanet .

Вот небольшой сценарий оболочки, который я использую для запуска php-файла из оболочки, поэтому я уверен, что это за cwd:

#!/usr/bin/env php
<?php
chdir(dirname(__FILE__));
include('doctrine-cli.php');

Была также ошибка в автозагрузчике isReadable() до 1.10.4, попробуйте обновить.

0 голосов
/ 27 апреля 2010

Скорее всего, текущий каталог задания CRON не является каталогом commandline. Используйте getcwd() для проверки текущего каталога.

[Edit:]

Также не используйте относительные пути в set_include_path, так как это может привести к неожиданному поведению - за исключением, конечно, текущего каталога .. Вы можете использовать realpath(), чтобы получить абсолютный путь, прежде чем добавить его в include_path.

...