簡體   English   中英

從PHP腳本運行PHP腳本的最佳實踐是什么?

[英]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

此代碼有兩個問題:

  1. 據我記得?k1=v1&k2=v2僅適用於網絡呼叫,因此在這種特殊情況下,參數不會傳遞給腳本。

  2. 我真的不知道如何初始化$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);
}

一些要點:

  • 是的,它只適用於Linux
  • 如果允許將用戶輸入傳遞給shell命令,則應該小心用戶輸入: escapeshellarg()和company
  • 實際上,通常PHP不應該用於這樣的東西,就像它是關於異步請求一樣,更好地實現分叉或運行來自外部工作者的命令。

如何傳遞參數

通過文件系統路徑執行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.

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