在PHP中执行控制台命令
我试图在用户单击“导出PDF”按钮时执行控制台命令。我正在使用Phantom JS来生成PDF输出。在PHP中执行控制台命令
如果我跑在我的命令下促使这一切工作正常:
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);
}
正如你所知道的,我从来三编辑之前以任何语言执行控制台命令。我甚至关闭?
谢谢!如果你不确定它在做什么 - 第一个位,phantomjs.exe调用.exe应用程序,那么“generate_pdf”是一个与同一目录中的javascript文件.exe应用程序。第三项是我想要变成PDF的东西的链接。最后的“test.pdf”就是导出PDF后的命名。再次,通过命令提示符,我试图运行的命令工作正常,一切工作正常。
顺便说一句,目前当我点击按钮,我只是去一个白页,没有任何反应。
昨天得到这个工作,这里就是答案:
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);
}
}
我不确定这是否是远程涉及的,但如果您可以验证您是否正在执行您的功能,并且shell_exec正在尝试执行,则可能需要验证phantomjs.exe是否可从您的Web服务器的用户的PATH 。查看这是否是问题的最简单方法可能是使用可执行文件的完整路径。
Phantomjs不能像服务器用户www-data一样直接通过非root用户访问,因为它会导致Permission denied错误。为了通过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服务器进行必要的控制。
您可能需要URL编码在你的命令的空间。但是,通过Web服务器执行时的执行环境在通过用户shell会话执行时可能不同。 – datasage 2013-05-10 21:00:55
我认为它没有进入函数....尝试放置一个表单,只需要一个带有“导出”值的提交按钮,并将其命名为“export_test”;然后检查你的pho文件if(isset($ _ POST ['export'])){create_pdf(); } – Hackerman 2013-05-10 21:10:03