2012-02-03 11 views
17

私はcronジョブを実行したいです。私のアプリケーションはPHPとMySQLで開発されています。

コーディングで$_SERVER[HTTP_HOST]を使用するとブラウザで正常に動作します。しかし、私がcronジョブで同じことを使用すると、エラーが発生します。

これを修正する提案はありますか?

+0

のようなものです。 $ _SERVER ['HTTP_HOST']は、cronスクリプトがブラウザのようにHTTP_HOSTを定義していないために未定義ですか?あなたはisset($ _ SERVER ['HTTP_HOST'])でテストすることができます –

+0

php> = 5.3.0 gethostname()を使用してください – nick

答えて

16

$_SERVER['HTTP_HOST']は、cronジョブから実行しても、HTTP経由でアクセスされません。

ホストをハードコードするか、コマンドライン引数で渡して、$_SERVER['argv']アレイ経由でアクセスする必要があります。

+0

良い答え。 CLIスクリプトにはアクセスできる$ argvと$ argcグローバルがありますので、$ _SERVERを使用する必要はありません。 –

+1

'$ argv'はglobal-keywordのない関数では使用できません。 '$ _SERVER'はスーパーグローバルです。 – TimWolla

2

空の場合は$_SERVER[HTTP_HOST]の値をハードコードするか、その他のチェックを行うことができます。

6

phpがコマンドラインで実行されると、$_SERVER['HTTP_HOST']は(もちろん)利用できません。

は、あなただけの@記号を使用して、エラーを抑制または構築物ラインを使用して、もう少し慎重にすることができます。

先に述べたように
$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'CLI'; 
6

あなたは、PHP-CLI経由でPHPを実行するときには、$ _SERVERが存在しません。

ただし、$ _SERVERを持つphp-cgiでcronのスクリプトを実行するオプションがあります。ローカルWebサーバーにカールすると、$ _SERVERが設定されます。

$ cat /etc/cron.daily/mydailyphpwork 
/usr/bin/curl http://domain.tld/path/to/cron-script.php &> /dev/null 

しかし、私はあなたが本当にこの動作を必要としない限り、あなたは確かに、TimWollaまたはDerVOによって提案された解決策に固執するべきだと思います。

長所:

  • あなたは期待通りに設定されているすべての$ _SERVER変数を取得します。
  • if-elseで多くのコードを書き直す必要がある場合は、コードを変更する必要がないので、これが望ましい場合があります。

短所:

  • それは、回避策の一種であり、おそらくCPU負荷のわずかな増加を意味します。
4

cronジョブをcurlで実行してみてください。$ _SERVER ['HTTP_HOST']に値が設定されます。 Linux上

構文はいくつかの種類のいくつかのエラー・メッセージを提供してください

curl http://yourdomain/yourfile.php 
+1

これは、あなたのファイルが一般公開のURLになっている限り、私にとっては最も簡単な解決策でした。 AronCederholmも同様の提案をしましたが、ポイントに正しく答えるための@alwaysLearnへの小道具です。これは私にとって完璧でした。 – David

関連する問題