このファイルを含める必要がある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';
?
ありがとう!
技術的に見れば、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';
のの。 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
すべてが現在のすべての答えを尊重しているので、彼らはすべて「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
絶対パスの指定を推奨するソリューションの代わりに、スクリプトでchdir
を使用することもできます。そうすれば、相対パスは期待どおりに機能します。
たとえば、スクリプトのディレクトリに移動するには、次のようにします。
$curr_dir = dirname(__FILE__);
chdir($curr_dir);
スクリプトの親ディレクトリに変更するには:
$curr_dir = dirname(__FILE__);
chdir($curr_dir . "/..");
などなど。
相対パスが機能しない場合は、cronタスクの実行時に設定されている現在のディレクトリが/ home/username123/public_htmlではないことを意味します。このような場合、絶対パスのみを使用できます。
実行しているスクリプトがinclude_pathを設定し、そのスクリプトをインクルードしているのと同じくらい簡単に聞こえます。 phpinfo()を使用して、include_pathのグローバル設定とローカル設定を確認します。