3

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='/var/www/clientname/library/') を /var/www/clientname/commandline/zfcli.php で開くことができませんでした11行目

コマンドラインを実行してphpinfoをダンプすると、次のように表示されるため、PHPは新しいパスを受け入れていると思います。

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

ここの構文が少し奇妙に見えることは認めますが、修正方法がわかりません。どんな提案でも大歓迎です。

ありがとう夏

4

2 に答える 2

2

zf-cliZFPlanetでのPádraicのアプローチを見てください。

これは、シェルからphpファイルを実行するために使用する小さなシェルスクリプトです。したがって、cwdが何であるかを確認します。

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

1.10.4より前のオートローダーにもバグがありました。アップグレードしてみてください。isReadable()

于 2010-04-29T07:04:38.597 に答える
0

ほとんどの場合、CRON ジョブの現在のディレクトリはディレクトリではありませんcommandlinegetcwd()現在のディレクトリを確認するために使用します。

[編集:]

また、予期しない動作が発生する可能性があるため、相対パスを使用しないでください。set_include_pathもちろん、現在のディレクトリは除き.ます。realpath()に追加する前に、絶対パスを取得するために使用できますinclude_path

于 2010-04-27T17:11:21.543 に答える