web-dev-qa-db-ja.com

$ _SERVER ['DOCUMENT_ROOT']は、cronを介して実行されるphpスクリプトでは機能しません

$ _SERVER ['DOCUMENT_ROOT']。 "/ lib/sft_required.php"を使用します。 PHPスクリプトに 'sft_required'ファイルを含めます。ブラウザを使用してこのファイルを実行すると正常に動作しますが、これをcronジョブジョブとして実行すると機能しません。 cronを介してスクリプトを実行すると、ファイルは含まれません。

28
phpian

(cronjobによってトリガーされたHTTPリクエストによってアクセスされるWebサーバーから(たとえば、wgetを実行するcronによって)アクセスされるのではなく)直接cronを介してスクリプトを実行していると仮定すると、もちろん機能しません。

サーバーがないので、$_SERVERが設定されていません。

24
Quentin

自分で$ _SERVER ['DOCUMENT_ROOT']を入力できます

$_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__);

cronファイルがドキュメントルートにある場合

$_SERVER['DOCUMENT_ROOT'] = dirname(dirname(__FILE__));

cronファイルがドキュメントルートの1つのディレクトリの場合

65
Gabriel Solomon

$_SERVERは、CLIインタープリターを使用してPHPスクリプトを実行する場合、通常の値を含むことは期待できません。パスを環境変数に入れるか、コマンドとしてスクリプトに渡します。行引数。

私は同様の質問 ここ に答えました。人々が述べたように、スーパーグローバル$ _SERVERはCLIの状況では定義されていません。リンクには、DOCUMENT_ROOTの場所を取得するための(今のところ)簡単な方法があります。役立つことを願っています。

define('DOCROOT', substr(str_replace(pathinfo(__FILE__, PATHINFO_BASENAME), '', __FILE__), 0, -1));

これにより、cronジョブの$_SERVER['DOCUMENT_ROOT']と同じデータが得られます。

1
Destralak

例1:
/var/www/site.com /-DOCUMENT_ROOT;
/var/www/site.com/cron/script.php-CRON PHPスクリプト;

<?php
/** DOCUMENT_ROOT -> /var/www/site.com/ */
$_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__).'/../');
?>

例2:
/var/www/site.com /-DOCUMENT_ROOT;
/var/www/site.com/sub_dir/cron/script.php-CRON PHPスクリプト;

<?php
/** DOCUMENT_ROOT -> /var/www/site.com/ */
$_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__).'/../../');
?>

私の場合、この問題は、通常のサイト操作中に$_SERVER['DOCUMENT_ROOT']パスに末尾のスラッシュがあり、cronジョブ中に末尾のスラッシュがないことが原因でした。

何が原因であるかはわかりませんが、回避策として、一貫した値を返すように見えるため、代わりにABSPATHを使用するようにコードを切り替えました。

つまり、言い換えれば、これを変更しました。

$private_folder = realpath($_SERVER['DOCUMENT_ROOT'] . "../private_html");

これに:

$private_folder = realpath(ABSPATH . "../private_html");

str_replacertrimの使用など、この問題には他にもいくつかの解決策があります。

0
Pikamander2

これは私が扱った同様の問題の私の解決策です。

$site_root_directory = substr( __DIR__, 0, strpos( __DIR__, "wp-content" ) );

私の場合、テーマ内のファイルを実行するcronを実行しています。 (トウモロコシのWordPressをロードしないので、ABSPATHのようなものにアクセスできません)。).

このようにして、スクリプトディレクトリから戻るのではなく、スクリプトにつながるルート内のfirst子フォルダーを使用して 'ルートディレクトリ'を取得します。

/var/more_directories/public_html/wp-content/themes/theme-name/includes/cron-jobs/var/more_directories/public_html/

つまり、スクリプトは常に最初の子フォルダーの下のどこかにあるので、スクリプトを移動することについて心配する必要はありません。

0
VoidZA

私も同じ問題を抱えていました。インターネットで見つけた解決策がウェブサーバーのcronでは機能しないため、そのパスを簡単に変更する別の方法を見つける必要がありました。

そして、それはほとんど大きな問題ではありません.1〜2のcronファイルがある場合(必要に応じてファイルパスを簡単に編集できます)、20のcronファイルがあり、サーバーの変更またはパスの変更またはsmtが必要な場合は、それらすべてのファイルを変更する必要があります、それらのファイルパスを変更...

だから私は少なくともFOR MEの優れたソリューションを見つけました: i cronフォルダーに1つのファイルpath.phpを作成しましたとcronファイルを含む同じフォルダーをbcにすると、エラーなしでそれを含めることができます。

そしてpath.phpには$path = '/server/root/path';

そして、i そのcronファイルへのpath.phpを含めます(20ほどのcronファイルがあります)

そして今私は以下のように私のcronファイルでその$ pathを使用します:

include 'path.php';
include $path.'/includes/db.php';

ここで、パスを変更する必要がある場合は、path.phpファイルを開くだけです、それを変更して、すべて機能します。

私が誰かを助けることを願っています、bcソリューションが私の人生をはるかに簡単に変えました!それでもまだ完璧ではありませんが、bcパーフェクトはすべてが自動的に機能する場合ですが、私にとっては以前のシステムよりもはるかに簡単なので、私の経験を共有するつもりです。

0
aimar