我有一个 php 脚本 test.php,它调用 latex+biber:
`/usr/local/texlive/2016/bin/x86_64-linux/latex --interaction batchmode test.tex `;
`/usr/local/texlive/2016/bin/x86_64-linux/biber test`;
如果我从终端php test.php
(以 root 身份)运行该脚本,则该脚本可以正常工作;从浏览器调用时,它不起作用http://localhost/test.php
。在后一种情况下,我理解它是从用户 apache 调用的。(我正在 Linux Fedora 29 机器上进行测试)。
该问题原来与“biber”有关:
[root@fedora-pc]# su -s /bin/bash apache
bash-4.4$ /usr/local/texlive/2016/bin/x86_64-linux/biber test
Can't open test.blg (Permission denied) at /tmp/par-617061636865/cache-975de9a2a2c44ccaa5329d9695a54026ffc29f68/inc/lib/Log/Log4perl/Appender/File.pm line 151.
另外,我刚刚发现
[root@fedora-pc 2019]# /usr/local/texlive/2016/bin/x86_64-linux/tlmgr update --list
/usr/local/texlive/2016/tlpkg/installer/xz/xzdec.x86_64-linux: (stdin): Unexpected end of input
[root@fedora-pc 2019]# tlmgr update --self
/usr/local/texlive/2016/tlpkg/installer/xz/xzdec.x86_64-linux: (stdin): Unexpected end of input
/usr/local/texlive/2016/bin/x86_64-linux/tlmgr: checksum error when downloading /tmp/WQEchRh21D/TzyO2wJ8pA from http://ftp.rrze.uni-erlangen.de/ctan/systems/texlive/tlnet/tlpkg/texlive.tlpdb: digest disagree
我不太了解 LaTex,不知道发生了什么事以及如何修复它。(biber 是 2.9 版本)
答案1
Linux Fedora 29,4.19.12-301.fc29.x86_64;pdfTeX,版本 3.14159265-2.6-1.40.19(TeX Live 2018)(我已更新)
当我将以下行添加到 sudoers 文件时,我的问题得到了解决:
apache ALL=(ALL:ALL) NOPASSWD:/usr/local/texlive/2018/bin/x86_64-linux/biber
我的脚本test.php
是:
<?php
$NomeFile = 'test';
$bibFile = $NomeFile;
$texFile = $NomeFile.".tex";
$pdfFile = $NomeFile.".pdf";
$f=fopen($texFile,'w');
$header ="\\documentclass{article} \n ";
$header.="\\usepackage[latin1]{inputenc} \n ";
$header.="\\usepackage[T1]{fontenc} \n ";
$header.="\\usepackage[american,italian]{babel} \n ";
$header.="\\usepackage[babel,italian=guillemets]{csquotes} \n ";
$header.="\\usepackage[backend=biber,sorting=ynt]{biblatex}\n";
$header.="\\usepackage[pdftex]{hyperref} \n ";
$header.= "\\bibliography{".$bibFile."}";
$header.="\\begin{document} \n ";
$f=fopen($NomeFile.'.tex','w');
fputs($f,$header);
fputs($f,"\\cite{Mario}");
$printbib = '\\printbibliography';
fputs($f,$printbib);
fputs($f,"\\end{document}");
fclose($f);
$filenameTeX = $NomeFile.'.tex';
$test_2 = `/usr/local/texlive/2018/bin/x86_64-linux/pdflatex --interaction batchmode $texFile `;
$test_3 = `sudo -u root /usr/local/texlive/2018/bin/x86_64-linux/biber $bibFile `;
$test_4 = `/usr/local/texlive/2018/bin/x86_64-linux/pdflatex --interaction batchmode $texFile `;
$filenamePdf = $NomeFile.'.pdf';
echo "2 <pre>$test_2</pre>";
echo "3 <pre>$test_3</pre>";
echo "4 <pre>$test_4</pre>";
echo "<br><a href=\"$filenamePdf\">$filenamePdf</a>";
echo "<br><a href=\"$filenameTeX\">$filenameTeX</a>";
?>
我的 .bib 文件
@BOOK{Mario,
author = {Mario Doe},
title = {TITLE},
publisher = {My Pubblisher},
location = {World},
year = {2025}
}
我也已设置PAR_GLOBAL_TEMP=\var\www\tmp
,tmp
归用户所有apache
,但没有帮助。
我的浏览器调用http://localhost/test.php
会产生所需的test.tex
文件test.pdf
,包括参考书目。/var/www/tmp/
仍然是空的。如果我尝试[root@....]# php test.php
或
[root@...]# su -s /bin/bash apache
bash-4.4$ php test.php
请注意,如果我稍后编译 .tex 文件,则会/var/www/tmp/
被多个文件污染,主要是在inc
子目录中。
我不确定这是最好的解决方案,但在本地设置下它仍然对我有用。