在PHP中执行控制台命令

在PHP中执行控制台命令,php,console,phantomjs,Php,Console,Phantomjs,我试图在用户单击“导出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”按钮时执行控制台命令。我正在使用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>
正如您所知,我以前从未尝试过用任何语言执行控制台命令。我离你很近吗

谢谢

PS:如果你不确定控制台命令在做什么,那么让你对它有一些了解-第一位,phantomjs.exe正在调用.exe应用程序,然后“generate_pdf”是与.exe应用程序位于同一目录中的javascript文件。第三项是我的链接,我正试图将其转换为PDF格式。最后一个“test.pdf”就是导出pdf后的名称。同样,通过命令提示符,我试图运行的命令工作正常,一切都很好


顺便说一句,当前当我单击按钮时,我只是进入一个白色页面,什么也没有发生。

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

Phantomjs无法通过非根用户(如服务器用户www data)直接访问,因为它会给出权限拒绝错误。为了在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);
    }
}

您可能需要对命令中的空间进行url编码。但是,通过web服务器执行时的执行环境可能与通过用户shell会话执行时的执行环境不同。我认为它也没有进入函数…尝试放置一个表单,仅使用一个带有“导出”值的提交按钮,并将其命名为“导出测试”;然后,如果(isset($_POST['export']){create_pdf();},请检入您的pho文件
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);
    }
}