我有一个网页,我让用户上传文件到帐户文件夹。确切地说,只有PDF和JPG文件。我想计算每个上传的PDF文件的页数,以便向用户显示。
为此,我使用了XPDF项目的一部分PDFINFO linux库。这是二进制文件的手册页:http://linuxcommand.org/man_pages/pdfinfo1.html
您可以在这里下载带有二进制文件的.zip文件:http://www.foolabs.com/xpdf/download.html
我的代码(这工作完美,但昨天它失败了):
function getNumPagesInPDF($document){
if(!file_exists($document))return null;
$cmd = "pdfinfo";
// Open the document
exec($cmd." '".$document."'", $output);
// Browse the data
$pagecount = 0;
foreach($output as $op){
// Extrac number of pages
if(preg_match("/Pages:'s*('d+)/i", $op, $matches) === 1){
$pagecount = intval($matches[1]);
break;
}
}
return $pagecount;
}
我可以在SSH中运行该命令,并且它在服务器中工作。现在,这段代码不能在PHP中工作,但是没有改变代码。
啊!一点补充:我检查了exec工作在我的PHP使用:
function exec_enabled() {
$disabled = explode(',', ini_get('disable_functions'));
return !in_array('exec', $disabled);
}
if (exec_enabled()){
echo "exec funciona";
}
另一个补充:PHP没有显示任何与此相关的错误,我已经将错误日志记录启用到日志文件(包括警告)。我的主机最近激活了mod_security.
TASK1:尝试$document变量:路径是ok的,相对于php代码文件放置的地方。路径存在,文件也存在
TASK2:检查$output变量是否有任何内容:NO, $output数组为空!为什么?无法理解。
TASK3: Check the $cmd."’"。美元文档。"'": ok,复制"result"到SSH works。我迷路了。
根据评论讨论,我们已经看到使用裸文件名运行二进制文件并不总是有效的。在控制台上和在系统命令(如exec()
)中都是如此。
当您在任何一个环境中运行pdfinfo
时,系统将搜索环境变量PATH
以发现在哪个目录中可以找到它。这个变量在您的用户帐户和Apache环境之间几乎总是不同的,这就是为什么在以编程方式运行二进制文件时,总是指定完全限定的文件名是很重要的。
据我所知,exec()
不把当前PHP脚本所在的文件夹作为当前工作目录。即使这样,当前目录.
也需要在Apache用户的PATH
中才能找到它。因此,我不确定为什么这曾经适用于你,但它强调了上述教训的重要性:始终使用完整路径。
您还应该从设置文件中读取路径,而不是在代码中硬连接它。这将有助于你从本地、测试、暂存和实时应用环境中迁移,这些环境可能会将二进制文件存储在不同的位置。