exec() 随机失败并出现奇怪的行为
exec() fails randomly with strange behaviour
我正在尝试使用 exec() 在基于 Ubuntu 的服务器上使用 pdftopm 实用程序进行批量 PDF 到 JPEG 对话。
PHP脚本converter.php
的主要部分是:
for ($i = 1; $i <= $PDF_pageCount; $i++){
exec("pdftoppm -jpeg -f $i -l $i '$PDF_source' '$PNG_output' 2>&1", $Output, $Status);
sleep(1); // To simulate delay and let the other instance to run while this one is inside the loop.
}
现在,以两个文件为例:
- ./A/source_file.pdf
- ./B/source_file.pdf
这些文件存在于它们在磁盘上的位置上。
父文件夹的(A/
& B/
)所有者和权限是:
UID: www-data, GID: www-data, Permission: 755
文件(source_file.pdf
)的所有者和权限是:
UID: www-data, GID: www-data, Permission: 644
当只有一个脚本实例被 运行 时,代码可以正常工作,并且可以毫无问题地生成输出。例如,$PDF_source = './A/source_file.pdf'
。所有页面都将成功转换为 JPEG 文件。
但是当脚本 运行s 的第二个实例时,exec() 函数仅对其中一个起作用,而对另一个起作用,它会产生以下错误,退出状态为 1:
I/O Error: Couldn't open file '/path/to/source_file.pdf': No such file or directory.
换句话说,其中一个文件将被转换为 JPEG,而另一个文件(尽管第一个文件可能已经结束)将在输出时产生错误。
请注意,所有文件路径都是正确的并且文件存在。
另请注意,脚本是 运行 来自 CLI,在 cronjob 中使用以下命令(但也可能从标准 Web 请求执行):
/path/to/php -q /path/to/converter.php
我试图通过在脚本开头使用以下代码来防止 运行一次处理多个文件实例:
class Lock{
private $fp;
function __construct(){
$this->fp=fopen(__FILE__,'r');
if (!flock($this->fp,LOCK_EX|LOCK_NB)) {
die('ARN'.PHP_EOL);
}
}
function __destruct(){
flock($this->fp,LOCK_UN);
fclose($this->fp);
}
}
$lock=new Lock();
到底是什么问题?我该如何解决这个问题?
好吧,我刚刚在输入前添加了 __DIR__.'/'.
,现在可以使用了。
但我还是想知道为什么它在第一次执行脚本时添加目录之前就可以工作?
我正在尝试使用 exec() 在基于 Ubuntu 的服务器上使用 pdftopm 实用程序进行批量 PDF 到 JPEG 对话。
PHP脚本converter.php
的主要部分是:
for ($i = 1; $i <= $PDF_pageCount; $i++){
exec("pdftoppm -jpeg -f $i -l $i '$PDF_source' '$PNG_output' 2>&1", $Output, $Status);
sleep(1); // To simulate delay and let the other instance to run while this one is inside the loop.
}
现在,以两个文件为例:
- ./A/source_file.pdf
- ./B/source_file.pdf
这些文件存在于它们在磁盘上的位置上。
父文件夹的(A/
& B/
)所有者和权限是:
UID: www-data, GID: www-data, Permission: 755
文件(source_file.pdf
)的所有者和权限是:
UID: www-data, GID: www-data, Permission: 644
当只有一个脚本实例被 运行 时,代码可以正常工作,并且可以毫无问题地生成输出。例如,$PDF_source = './A/source_file.pdf'
。所有页面都将成功转换为 JPEG 文件。
但是当脚本 运行s 的第二个实例时,exec() 函数仅对其中一个起作用,而对另一个起作用,它会产生以下错误,退出状态为 1:
I/O Error: Couldn't open file '/path/to/source_file.pdf': No such file or directory.
换句话说,其中一个文件将被转换为 JPEG,而另一个文件(尽管第一个文件可能已经结束)将在输出时产生错误。 请注意,所有文件路径都是正确的并且文件存在。
另请注意,脚本是 运行 来自 CLI,在 cronjob 中使用以下命令(但也可能从标准 Web 请求执行):
/path/to/php -q /path/to/converter.php
我试图通过在脚本开头使用以下代码来防止 运行一次处理多个文件实例:
class Lock{
private $fp;
function __construct(){
$this->fp=fopen(__FILE__,'r');
if (!flock($this->fp,LOCK_EX|LOCK_NB)) {
die('ARN'.PHP_EOL);
}
}
function __destruct(){
flock($this->fp,LOCK_UN);
fclose($this->fp);
}
}
$lock=new Lock();
到底是什么问题?我该如何解决这个问题?
好吧,我刚刚在输入前添加了 __DIR__.'/'.
,现在可以使用了。
但我还是想知道为什么它在第一次执行脚本时添加目录之前就可以工作?