運行:Linux中,PHPPHP代碼停止腳本從Envoirnment瀏覽器
場景:我寫這將被設置爲一個cron腳本。現在情況是,我希望腳本只能通過cron運行,而不能通過任何瀏覽器(包括移動瀏覽器的任何web瀏覽器)運行。所以我正在尋找一個類似browserValidate的函數。
劇本是寫在MVC框架,將作爲運行
/usr/bin/GET http://xyz.com/abc/pqr
請幫助我。
在此先感謝。
運行:Linux中,PHPPHP代碼停止腳本從Envoirnment瀏覽器
場景:我寫這將被設置爲一個cron腳本。現在情況是,我希望腳本只能通過cron運行,而不能通過任何瀏覽器(包括移動瀏覽器的任何web瀏覽器)運行。所以我正在尋找一個類似browserValidate的函數。
劇本是寫在MVC框架,將作爲運行
/usr/bin/GET http://xyz.com/abc/pqr
請幫助我。
在此先感謝。
當從crontab的範圍內執行腳本,你可以使用$_SERVER
超全局要麼檢查阿帕奇生成的條目(HTTP_*
)或 - 因爲$_SERVER
反映了執行二進制的環境 - 在執行之前確定一定的環境變量:
# in the crontab
FOOVAR=1 /usr/bin/php5 script.php
然後,在script.php的,檢查是否存在FOOVAR
:
if (!isset($_SERVER['FOOVAR']))
die('No browser access.');
如果您的cronjob正與wget
執行和客戶端IP是服務器的,你可以將它添加到一個.htaccess
文件:
SetEnvIf Remote_Addr "192.168.0.1" FOOVAR=1
這將設置FOOVAR
只有在客戶端的IP地址爲「192.168.0.1」 。
嗯,我不知道如何設置環境變量的OP請求OP有問題^^ – hakre 2012-01-17 12:04:35
@hakre請參閱我的編輯。 – 2012-01-17 12:08:31
正如@Mob所說的,實現這一目標的切實方法是將腳本放在無法通過Web服務器訪問的地方。如果這是不可能的,或者您不想出於某種原因執行此操作,則需要檢測腳本是通過Web服務器還是通過命令行調用。
我給這家最喜歡的方式(有很多)是:
$isRunningFromBrowser = !isset($GLOBALS['argv']);
這意味着,如果$isRunningFromBrowser
是真實的,你只是退出/返回錯誤消息/不管。
OP編輯了這個問題。該腳本使用'wget'-like二進制文件執行。所以沒有'argv'。另外,運行FastCGI的PHP將在'$ _SERVER'中包含'argv'。 – 2012-01-17 12:12:49
@LinusKleen我從來沒有FCGI環境,並且可能會在作品中拋出一個扳手 - 它是否仍然在全局範圍內定義'$ argv',或者只是在'$ _SERVER'中的一個條目? – DaveRandom 2012-01-17 12:20:05
我的不好,@Dave。 '$ _SERVER' * only *。沒有全局可見。 – 2012-01-17 12:28:54
將腳本移到Web目錄之外並在命令行上執行它。將參數解析爲適當的GET和POST變量填充的腳本。
看到http://www.php.net/manual/en/features.commandline.php#94912
我已經編輯這篇更好地說明:
由於您使用的/ usr/bin中/ GET通過HTTP我假設你有兩個單獨的服務器抓取網頁: 首先,PHP腳本處於打開狀態,無法運行cron腳本。 其次,您正在cron中運行/ usr/bin/GET提取作爲解決方法。
一個簡單的方法可能是簡單的URL發佈的唯一標識符並檢查腳本 這樣的:
/usr/bin/GET http://xyz.com/abc/pqr/SomeUniqueIdentifier
另一種方法可以是使用與在/ usr/bin中/ GET -H選項設置User-Agent頭部像一些獨特:
在/ usr/bin中/ GET -H 「的User-Agent:SomeUniqueIdentifier」 http://xyz.com/abc/pqr
PHP腳本,然後將檢查用戶代理字符串爲這個唯一標識符如:
if (strcmp($_SERVER['HTTP_USER_AGENT'], "SomeUniqueIdentifier") == 0)
{
// do whatever
}
else
{
// do nothing
exit();
}
這兩種方法都不是100%安全的,但可以提供幫助。
一個快速的方法是檢查請求的IP地址,且僅當它是本地主機IP上運行。
當然,你需要在以後添加更多的代碼(檢查用戶代理,引用者等),以確保即使是在本地的瀏覽器不會觸發腳本。
爲什麼你使用基於web的MVC框架來編寫你想從cron觸發的腳本?只需從命令行腳本訪問您的模型庫。 – Quentin 2012-01-17 12:02:41
有很多在框架中定義的腳本中使用的函數。因此,我正在使用MVC – 2012-01-17 12:03:50
問題是,如果您不希望它從瀏覽器運行,您首先可以通過Web訪問腳本? – 2012-01-17 12:06:27