2017-08-01 38 views
0

對於長文本感到抱歉。單獨程序中的PHP調用函數

我正在尋找一個想法來觸發執行PHP函數(在不同的目錄中,測試並在同一目錄中),當具體的行爲發生時。

系統是Debian和php框架yii。

使用API​​,我們從遠程服務器接收新數據,併爲我們收到的數據中的特定值,我需要在單獨的進程中啓動功能。無需等待完成。 由於API響應時間,我無法將此功能集成到其中,並且集成會導致API無法使用。

我已經閱讀了Stackoverflow和許多其他示例的幾十個答案。

對於測試,我只是試圖創建新的文件夾在特定的位置和文件沒有創建(權限問題,我認爲,但無法確認,因爲它使得它,如果從主代碼完成 - api)。 這是應該做以下幾點:

  • 通從API接收功能
  • 創建文件夾,如果不存在
  • 調用內部類使用FPDF來打印PDF文件它2個參數。
  • 保存文檔並將其郵寄給PHPMailer。

不能使用pcntl_fork,因爲它需要額外的安裝(我不允許這樣做)。

涵蓋的主題:

  • 與pcntl_fork分叉(停止執行上達到它)
  • POPEN/pclose函數,EXEC,proc_open/proc_close(沒有回答,也無法確認其實際輸入功能)。

當然這種情況排除使用include和require的可能性。

無法釋放API代碼,但這裏是我要求它做的事:

background.php

$docs_dir='test_folder'; 
if (!file_exists('/var/www/created_documents/'.$docs_dir)) 
{ 
    mkdir('/var/www/created_documents/'.$docs_dir, 0777, true); 
    chmod('/var/www/created_documents/'.$docs_dir, 0777); 
} 

它什麼都不做。

幾個例子,我用在api代碼跳轉到它(許多人在工作中被刪除)。

$proc = popen('php ' . __DIR__ . '/background.php &', 'r'); 
return $proc; 
while (!feof($proc)) 
{ 
    $data = fgets($proc); 
    var_dump($data); 
} 


exec("php background.php"); 


$cmd = "php background.php"; 
$timer = popen("start ". $cmd, "r"); 
pclose($timer); 


exec($cmd . " > /dev/null &"); 
pclose(popen("php background.php &","r")); 
+0

聽起來像是使用隊列,堆疊作業並在後臺處理它們。 –

+0

很難在dar中開發,用這兩行記錄你的文件錯誤:ini_set(「log_errors」,1); ini_set(「error_log」,path_to_file); –

回答

1

您可以使用curl and its async funcionality進行單獨的內部http請求。

或者您可以使用排隊機制,其中一部分是發射事件而另一部分正在消耗它。 RabbitMQGearman可以爲你做這個。

+0

由於我無法安裝任何新東西,因此捲曲看起來只是選項。將繼續嘗試這種方法。 – Aleks

+0

謝謝你的建議。我將在稍後嘗試,因爲在此期間我必須更換另一個子項目。 – Aleks