2014-01-20 60 views
1

我的服務器中有一些PHP腳本用於數據庫維護,需要定期執行。顯然,最簡單的解決方案是使用系統cron安排其運行。

腳本需要$ _ SERVER訪問,如數據庫的主機名,cron的參數等一些服務器變量

我可以運行命令行預定的cron命令,沒有任何問題,一切似乎工作正常(調用類似於php的文件名.php)。然而,當同樣的命令是從cron執行腳本失敗,並報告錯誤是這樣的:

PHP公告:未定義指數:RDS_DATABASE在 的/ var /應用/電流/應用/ XX/DB第8行上的/ConnectionFactory.php PHP

似乎$ _SERVER變量在從cron運行時未正確初始化,但它可以從命令行運行。我試過用crontab -u ec2-user -e但沒有運氣。

我不想使用wget來運行腳本,因爲它增加了一些開銷,並且腳本隱藏從HTTP訪問。

有關從命令行成功訪問$ _SERVER的提示,但是從crontab運行時失敗?

+0

變量的設置在哪裏? _SERVER是環境的一部分,所以我假設你的Apache配置中,在這種情況下,它們不可用於cron。您需要將它們導出爲環境變量 – Cfreak

+0

爲什麼不將您需要的值(即數據庫端點)配置到腳本或某個配置文件中?如果你自己沒有添加它,爲什麼'RDS_DATABASE'變量甚至會被預期存在於'$ _SERVER'中? –

+1

我使用$ _SERVER,因爲它們可以通過其控制檯管理輕鬆地從AWS Elastic Beanstalk進行配置。我在調試和發佈中有不同的服務器,並且我想更改實例之間的最小代碼。我想_SERVER是在apache中配置的。問題是爲什麼腳本在從命令行手動調用時運行,而不是從cron調用? –

回答

8

有同樣的問題。找到了解決辦法:

echo "InstanceID: ".get_cfg_var('INSTANCE_ID')."\n"; 

出於某種原因,它是工作的罰款對我的EC2用戶而不是像根cron作業。使用函數而不是訪問$ _SERVER數組解決了我的問題。

+1

似乎工作!謝謝! –

0

由於@Baminc和@Ankur表示解決方案是使用get_cfg_var函數來獲取信息,因爲$ _SERVER僅在您從Web瀏覽器訪問時才起作用。

我要做的就是與SERVER_NAME例如以下:

if (isset($_SERVER['SERVER_NAME'])) { 
    $myServerName = $_SERVER['SERVER_NAME']; 
} else { 
    $myServerName = get_cfg_var('SERVER_NAME'); 
} 

希望這有助於!