在PHP中执行控制台命令


Execute console command in PHP

当用户单击"Export PDF"按钮时,我正在尝试执行控制台命令。我正在使用Phantom JS生成PDF输出。

如果我在命令提示符中运行以下命令,则一切正常:

phantomjs.exe generate_pdf.js http://hidden_link.com/view_printable_proposal/CPpktzdnbwDB test.pdf

因此,我在控制器中创建了一个函数,当你点击导出PDF按钮时它会转到那个函数:

<a href="<?= base_url().'create_pdf/'.$hash ?>"><button type="button" class="btn" style="width: 100%;">Export as PDF</button></a>

整个函数:

public function create_pdf($hash = false)
{
    $output = 'phantomjs.exe generate_pdf.js http://hidden_link.com/view_printable_proposal/CPpktzdnbwDB test.pdf';
    shell_exec($output);
}

可以看出,我从来没有尝试过用任何语言执行控制台命令。我还差得远吗?

谢谢!

PS:如果你不确定它在做什么,为了让你对控制台命令有一些了解-第一个位,phantomjs.exe调用。exe应用程序,然后"generate_pdf"是与。exe应用程序在同一目录下的javascript文件。第三项是我链接到我试图变成PDF的东西。最后的"test.pdf"只是在导出PDF后为其命名的名称。同样,通过命令提示符到我要运行的命令,一切都工作得很好。

顺便说一下,目前当我点击按钮时,我只是转到一个白页面,什么也没发生

我不确定这是否涉及远程,但如果您可以验证您正在击中您的函数,并且shell_exec正在尝试执行,您可能想要验证phantomjs.exe是否可以从您的web服务器的用户路径。查看是否存在问题的最简单方法可能是使用可执行文件的完整路径。

Phantomjs不能通过非root用户(如服务器用户www-data)直接访问,因为它会给出Permission denied error。为了通过php文件运行它,您需要做一个解决方案。完整的解决方案在这里http://cisight.com/run-latest-phantomjs-with-shell_exec-php-on-ubuntu-11-10-oneiric/

这可能是一个解决方案:http://php.net/manual/en/book.pdf.php不要使用外部应用程序,而是使用PECL扩展。如果您的主机没有安装扩展,这可能是一个问题。但是,再一次,你试图执行一些shell命令,所以你可能有必要的控制web服务器。

昨天就开始工作了,下面是答案:

public function create_pdf($hash = false)
{
    $this->load->helper('download');
    $output ="";
    $return_val = 0;
    //echo APPPATH;
    $path_to_js = APPPATH.'/libraries/generate_pdf.js';
    $base_url = $this->config->item("base_url");
    $tmp_location = $this->config->item("tmp_location");
    $output_path = $tmp_location."/".$hash.'.pdf';
    $command = $this->config->item('phantomjs_path').' '.$path_to_js.' '.$base_url.'view_printable_proposal/'.$hash.' '.$output_path;
//  $command = '/usr/bin/ls /';
    exec($command, $output, $return_val);
    if($return_val) {
        echo "Error";
        echo $return_val;
        echo json_encode($output);
    }
    else {
            $data = file_get_contents($output_path);
            force_download($hash.".pdf", $data);
            unlink($output_path);
    }
}