2012-01-17 40 views
5

運行:Linux中,PHPPHP代碼停止腳本從Envoirnment瀏覽器

場景:我寫這將被設置爲一個cron腳本。現在情況是,我希望腳本只能通過cron運行,而不能通過任何瀏覽器(包括移動瀏覽器的任何web瀏覽器)運行。所以我正在尋找一個類似browserValidate的函數。

劇本是寫在MVC框架,將作爲運行

/usr/bin/GET http://xyz.com/abc/pqr 

請幫助我。

在此先感謝。

+1

爲什麼你使用基於web的MVC框架來編寫你想從cron觸發的腳本?只需從命令行腳本訪問您的模型庫。 – Quentin 2012-01-17 12:02:41

+0

有很多在框架中定義的腳本中使用的函數。因此,我正在使用MVC – 2012-01-17 12:03:50

+0

問題是,如果您不希望它從瀏覽器運行,您首先可以通過Web訪問腳本? – 2012-01-17 12:06:27

回答

6

當從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」 。

+0

嗯,我不知道如何設置環境變量的OP請求OP有問題^^ – hakre 2012-01-17 12:04:35

+0

@hakre請參閱我的編輯。 – 2012-01-17 12:08:31

8

正如@Mob所說的,實現這一目標的切實方法是將腳本放在無法通過Web服務器訪問的地方。如果這是不可能的,或者您不想出於某種原因執行此操作,則需要檢測腳本是通過Web服務器還是通過命令行調用。

我給這家最喜歡的方式(有很多)是:

$isRunningFromBrowser = !isset($GLOBALS['argv']); 

這意味着,如果$isRunningFromBrowser是真實的,你只是退出/返回錯誤消息/不管。

+0

OP編輯了這個問題。該腳本使用'wget'-like二進制文件執行。所以沒有'argv'。另外,運行FastCGI的PHP將在'$ _SERVER'中包含'argv'。 – 2012-01-17 12:12:49

+0

@LinusKleen我從來沒有FCGI環境,並且可能會在作品中拋出一個扳手 - 它是否仍然在全局範圍內定義'$ argv',或者只是在'$ _SERVER'中的一個條目? – DaveRandom 2012-01-17 12:20:05

+0

我的不好,@Dave。 '$ _SERVER' * only *。沒有全局可見。 – 2012-01-17 12:28:54

1

我已經編輯這篇更好地說明:

由於您使用的/ 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%安全的,但可以提供幫助。

1

一個快速的方法是檢查請求的IP地址,且僅當它是本地主機IP上運行。

當然,你需要在以後添加更多的代碼(檢查用戶代理,引用者等),以確保即使是在本地的瀏覽器不會觸發腳本。