2016-02-07 70 views
0

我有一個向多個收件人發送郵件的類方法,此方法接收2個參數(一個是整數,另一個是字符串),但是,當調用此方法時從主進程中,超時到期並且發送結束。然後,我需要這個函數(發送)在後臺運行,我需要動態傳遞參數,到目前爲止,我已經嘗試使用exec()命令。在後臺執行帶參數的類方法PHP

我的確在某處讀過我只能在命令中放入空格的類和方法名稱。因此,我triyng的命令是exec(/usr/bin/php /home/cesar/www/mails.php notices send 1 'Text' > /dev/null);然而,這個突擊隊不起作用,因爲我沒有收到郵件。

在此命令:

  • mail.php =文件腳本PHP
  • 告示=類名
  • 發送=方法名
  • 1 =的param1
  • '文本'= param2的

然後,我有很多問題:

  1. 在後臺運行此命令的正確方法是什麼?
  2. 我如何動態傳遞參數?我只是將命令字符串與我的變量連接起來?

順便說一句,這與「無脂框架」的工作。

謝謝你在前進,

Regads來自墨西哥,

回答

2

此外奧馬爾的回答,我在這裏發帖兩個解決方案所特有的框架:

解決方案1:

使用框架的abort()方法,斷開HTTP客戶端,並繼續發送郵件在後臺:

$f3->route('GET|POST /myroute',function($f3){ 
    echo 'Well done Callaghan!'; // message for the client 
    $f3->abort(); // stop response here => the client can request something else 
    // now we can run extra tasks in the background 
    ini_set('max_execution_time',3600);// it may take some time 
    $mail->send(); 
    $mail->send(); 
    $mail->send(); 
    ... 

}); 

解決方案2:

使用框架的Cron插件,調度後臺任務:

$cron=Cron::instance(); 
$cron->set('MassMailing','Mass\Mailing->go','@hourly'); 
// Mass\Mailing->go will be executed every hour 

您需要託管允許cron jobs,使該解決方案網絡。

0

EXEC需要一個字符串參數,你也有逃避你escapeshellarg發送文本,所以整個命令應該看起來像這個工作:

$text_to_send = "Hello World , " 
exec("/usr/bin/php /home/cesar/www/mails.php notices send 1 " . $text_to_send . " > /dev/null"); 
現在

mail.php你可以recive像文本這樣的:

$text_to_send = $argv[5]; 

你也有其他選擇發送背景電子郵件除此以外,例如,你可以存儲在數據庫表中的文本,然後您創建工作每一個cron作業,讓我們說一聲分鐘都檢查,如果在該表中發送任何文本,然後在從數據庫發送文本後刪除文本。

另一種方法是使用libray用於發送電子郵件如PHP-resque的Gearman創建後臺作業。