web-dev-qa-db-ja.com

PHP:cronジョブでパスが機能しないのですか?

このファイルを含める必要があるcronジョブがあります。

require '../includes/common.php';

ただし、(ローカルテストではなく)cronジョブを介して実行すると、相対パスは機能しません。 cronジョブは、(ライブサーバー上で)次のファイルを実行します。

/home/username123/public_html/cron/mycronjob.php

そしてここにエラーがあります:

Fatal error: require(): Failed opening required '../includes/common.php' 
(include_path='.:/usr/lib/php:/usr/local/lib/php') in 
/home/username123/public_html/cron/mycronjob.php on line 2

cronジョブと同じ絶対形式を使用してcommon.phpは次の場所にあります

/home/username123/public_html/includes/common.php

つまり、2行目を次のように置き換える必要があります。

require '/home/username123/public_html/includes/common.php';

ありがとう!

25
gsquare567

技術的に見れば、phpスクリプトはcronが配置されている場所で実行されます。例cronが/ bin/cronにある場合、このステートメントは/bin/includes/common.phpでcommon.phpを検索します。

そうですね、おそらくフルパスを使用するか、 set_include_path を使用する必要があります

set_include_path('/home/username123/public_html/includes/');
require 'common.php';
27
Robus

のの。 cronでは絶対パスを使用する必要があります。

私がしていることは:

// supouse your cron is on app/cron and your lib is on app/lib
$base = dirname(dirname(__FILE__)); // now $base contains "app"

include_once $base . '/lib/db.inc';

// move on
27
Gabriel Sosa

すべてが現在のすべての答えを尊重しているので、彼らはすべて「phpコードを変更する」アプローチに行きました。

PHPファイルをcronから実行するためだけに変更するのは好きではありません。コードの移植性が低下し、1つまたは2つの相対パスの変更を忘れる可能性が高くなるからです。プログラムを中断します。

代わりに、cronタブ行のディレクトリを変更し、すべての相対パスとPHPファイルは変更されません。たとえば

1 1 * * * cd /home/username/public_html/&& php -f script.php

チェック この回答

またチェック この記事 、私は相対的な部分を引用します

PHPスクリプトのコードによっては、特定のディレクトリから呼び出された場合にのみ正しく実行される場合があります。たとえば、スクリプトが相対パスを使用してファイルを含める場合、次の場合にのみ実行されます。正しいディレクトリから呼び出されます。次のコマンドは、特定のディレクトリからPHPスクリプトを呼び出す方法を示しています。

cd /home/username/public_html/; php -q script.php
9
Accountant م

絶対パスの指定を推奨するソリューションの代わりに、スクリプトでchdirを使用することもできます。そうすれば、相対パスは期待どおりに機能します。

たとえば、スクリプトのディレクトリに移動するには、次のようにします。

$curr_dir = dirname(__FILE__);
chdir($curr_dir);

スクリプトの親ディレクトリに変更するには:

$curr_dir = dirname(__FILE__);
chdir($curr_dir . "/..");

などなど。

1
Scott C Wilson

相対パスが機能しない場合は、cronタスクの実行時に設定されている現在のディレクトリが/ home/username123/public_htmlではないことを意味します。このような場合、絶対パスのみを使用できます。

0
kiamlaluno

実行しているスクリプトがinclude_pathを設定し、そのスクリプトをインクルードしているのと同じくらい簡単に聞こえます。 phpinfo()を使用して、include_pathのグローバル設定とローカル設定を確認します。

0
MANCHUCK