簡體   English   中英

PHP 腳本檢測到它是一個包含

[英]PHP script detect that it is an include

我有一個 PHP class 文件,它通過 web 服務器和 cron 進程用作包含。 我正在尋找一種方法將一些代碼添加到腳本的頭部,以便我可以檢測腳本是否直接從命令行啟動而不是包含在另一個腳本中。 這樣我可以通過直接調用腳本並讓 function 實例化 object 並在其上執行一些代碼而無需為其創建包裝腳本,從而使測試更容易一些。

我嘗試使用if (php_sapi_name() == 'cli') {但即使該腳本包含在從命令行調用的另一個腳本中,該測試也是如此。

檢查$ argv [0]是否設置可讓您知道是否從命令行調用了這些內容。 它不會告訴您是直接調用文件還是從另一個文件包含文件。 要確定這一點,請測試realpath($argv[0]) == realpath(__FILE__)

放在一起:

if (isset($argv[0]) && realpath($argv[0]) == realpath(__FILE__))
    // This file was called directly from command line

您可以檢查是否存在$argv 如果設置了$argv[0] (腳本名稱),則從命令行運行腳本。

您可以測試$_SERVER['DOCUMENT_ROOT']是否為空。 由於它是apache預定義的變量,因此在命令行執行中將為空。

有趣的是$_SERVER['DOCUMENT_ROOT']已定義但為空。 我猜想在使用cli時根本不會定義它。

您還可以測試是否定義了$argv或其大小(使用CLI時至少為1)。 我沒有測試何時包含文件,但如果定義, sizeof($argv)肯定為0。

其他可能的測試是$_SERVER['argc'] (由服務器執行時為0,從CLI執行時為1)和為PHP二進制文件的路徑定義的奇怪的$_SERVER['_'] ,但根本沒有定義當服。

總而言之,我將依賴$_SERVER['argc'] (或$argc ),它是傳遞給命令行的參數數量的直接計數:服務腳本時始終為0。 依靠$ argv更為復雜:您必須測試是否設置了$argv[0]sizeof($argv) > 0。

我已經成功地使用if (defined('STDIN'))這樣的檢查。 如果腳本是從外殼運行的,則將定義STDIN ,但如果是在服務器環境中則不會定義。

正如您在此處以及Ryan在其評論中提供的鏈接所看到的,存在很多可能性。

if($_SERVER['SCRIPT_FILENAME']==__FILE__){
   // Directly
}else{
   // Included
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM