exec()随机出现奇怪的行为

时间:2017-12-05 18:13:20

标签: php ubuntu exec

我尝试使用exec()在基于Ubuntu的服务器上使用pdftoppm实用程序进行批量PDF到JPEG对话。 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/

现在,以两个文件为例:

  • ./ A / source_file.pdf
  • ./ B / source_file.pdf

这些文件存在于磁盘上。 父文件夹&#39; (B/&amp; source_file.pdf)所有者和权限为:

  

UID:www-data,GID:www-data,Permission:755

文件&#39; ($PDF_source = './A/source_file.pdf'}所有者和权限均为:

  

UID:www-data,GID:www-data,权限:644

当只运行一个脚本实例并且生成输出没有任何问题时,代码工作文件。例如,使用I/O Error: Couldn't open file '/path/to/source_file.pdf': No such file or directory. 。所有页面都将成功转换为JPEG文件。

但是当脚本的第二个实例运行时,exec()函数只对其中一个运行,而在另一个运行中,它会在退出状态1下产生以下错误:

/path/to/php -q /path/to/converter.php

换句话说,其中一个文件将转换为JPEG而另一个文件(尽管第一个文件可能已经结束)将在输出时产生错误。 请注意,文件的所有路径都是正确的,文件存在。

另请注意,该脚本正在使用cronjob中的以下命令从CLI运行(但也可能从标准Web请求执行):

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();

我试图阻止在脚本开头使用以下代码一次运行多个文件实例:

x.Range("A" & rw).Value = y.Range("N" & re).Value

究竟是什么问题?我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:0)

好吧,我刚刚在输入之前添加了__DIR__.'/'.,现在它正在运行。

但是我仍然想在第一次执行脚本之前添加目录之前找出它为什么工作?