[英]What is the best practice to run PHP script from PHP script?
我使用以下代碼:
$SERVER_PATH = dirname(__FILE__);
shell_exec($PHP_LOCATION.' '.$SERVER_PATH."/script.php?k1=v1&k2=v2 > /dev/null 2>/dev/null &");
哪里:
$PHP_LOCATION
應該包含PHP的路徑,
$SERVER_PATH
- 是當前工作目錄(幸運的是,要運行的腳本位於同一目錄中),
> /dev/null 2>/dev/null &
added以使此調用異步(取自PHP問題中的異步shell exec )
此代碼有兩個問題:
據我記得?k1=v1&k2=v2
僅適用於網絡呼叫,因此在這種特殊情況下,參數不會傳遞給腳本。
我真的不知道如何初始化$PHP_LOCATION
變量以使其靈活並適用於大多數主機。
我對這兩個問題進行了一些研究:
要解決1 建議使用-- 'parameters_string'
但是也建議修改腳本以解析看起來有點笨拙的參數字符串。 有更好的解決方案嗎?
要解決2,我找到了一個使用PHP_BINARY
的解決方案 ,但這是一個PHP 5.4+案例(我使用的是5.3)。 但最初的問題是要運行與原始腳本版本相同版本的PHP。 所以對我來說(因為我只使用PHP 5.3)可能有一個解決方案嗎?
編輯0
讓我解釋為什么我堅持這種奇怪的(對於PHP)方法:
那些PHP腳本應該彼此分開:
其中一個將分析數據和
第二個將生成PNG圖作為最終結果。
這些腳本不是要同時運行,這意味着第二個腳本可以按照自己的計划運行,只需要運行應該在其數據准備就緒時(由第一個腳本完成)。 因此,不應將數據從第二個腳本(子)傳遞回第一個(父)。
編輯1
從大多數評論中可以看出 ,主要的討論是分叉方向。 但是我想對原始問題中提到的第1點和第2點施加壓力。 我有一些理由以我指出的方式解決任務,我試圖指出所有這些原因。 如果我的一些觀點看起來很奇怪,請發表評論 - 我會更清楚或者我會改變主要問題。
先感謝您!
假設您使用的是Linux,則可以使用:
function getBinaryRunner($binary)
{
return trim(shell_exec('which '.$binary));
}
例如,同樣可以用於檢查是否安裝了所需的東西:
function checkIfCommandExists($command)
{
$result = shell_exec('which '.$command);
return !empty($result);
}
一些要點:
escapeshellarg()
和company 通過文件系統路徑執行shell_exec()
,您正在訪問該文件,顯然,所有“GET”參數都只是文件名的一部分,它不再是“URI”,因為沒有Web服務器來處理它。 所以你有兩個選擇:
通過訪問您的Web服務器來調用呼叫。 所以它會像:
//Yes, you will use wget or, better, curl to make web-request from CLI shell_exec('wget http://your.web-server.domain/script.php?foo=bar');
在這里下方:如果你通過公共DNS訪問你的網絡服務器,它將導致網絡差距和所有處理開銷。 好處 - 顯然,您不必期望腳本中的任何其他內容,也不必區分CLI和非CLI調用
在腳本中使用$_SERVER
數組並使用CLI傳遞參數:
shell_exec('/usr/bin/php /path/to/script.php foo bar'); //inside your script.php you will see: //$_SERVER['argv'][0] is "script.php" //$_SERVER['argv'][1] is "foo" //$_SERVER['argv'][2] is "bar"
是的,它需要在腳本中進行修改,並且可能需要一些如何映射“常規”Web請求和CLI的邏輯。 我建議甚至考慮將與CLI相關的東西分離到不同的腳本包中,這樣就不會弄亂那些邏輯。
當您執行php script.php &
您只需在后台模式下運行它。 但是,這仍然保持了您的過程的親子關系。 這意味着 - 如果父進程死亡,它的子進程也將被刪除。 確切地說,將觸發SIGHUP
並避免這種情況,您應該使用nohup
命令。 它將允許模擬流程的“分離”,從而使其運行可靠並且獨立於父流程發生的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.