2013-04-30 47 views
0

我试图通过CLI使用exec命令来调用CodeIgniter控制器,以便在不等待服务器回复的情况下发送电子邮件。通过CLI的CodeIgniter执行控制器

但是,这根本不起作用,我不明白为什么。

的过程中用户控制器开始与库调用

$this->load->library('Mailer'); 
... 
$this->mailer->send_user_email($email,$token); 

$email%20更换@发送,从而CI可以在接受它作为有效的URL

然后梅勒库的代码如下

chdir('/var/www/projectroot'); 
$command='php index.php mailing send_email '.$mail.' '.$token.' > output.txt 2> error.txt &'; 
exec($command); 

然后在邮寄控制器邮件应发送

$transport = Swift_SmtpTransport::newInstance(
    .... 

    echo $mailer->send($message); 

我测试过直接在服务器从命令行调用该控制器,它完美地工作。另外,$command变量中生成的字符串是正确的,如果手动将它提供给CLI,也可以正常工作。

但也没有类型的输出提供给output.txt的文件既不error.txt

我怎样才能解决这个问题呢?

+1

你应该在任何情况下使用'escapeshellarg($电子邮件)'和' escapeshellarg($ token)'来防止shell命令注入。也许这会修复错误。 – hek2mgl 2013-04-30 15:50:35

+0

Nicelly指出,但是,不,没有解决任何问题 – 2013-04-30 15:53:27

+0

你打电话给控制器怎么样?从命令行或浏览器? – raidenace 2013-04-30 15:53:52

回答

0

有一点可以检查是有用的,你的代码是直接使用,还是通过系统函数$ _SERVER ['REMOTE_ADDR']间接使用,CLI模式中不存在该代码。我自己也有点类似CLI的问题。

你可以检查,如果这是通过修改核心/ Input.php(2.1.3线351)一个问题:

if(isset($_SERVER['REMOTE_ADDR'])) 
     $this->ip_address = $_SERVER['REMOTE_ADDR']; 
    else 
     $this->ip_address = '0.0.0.0';