如果无法删除文件,请等待,然后重试

时间:2018-11-13 04:16:43

标签: php

警告:

  

警告:取消链接(temp / 1.pdf):资源暂时不可用   C:\ www \ test.php在第122行

     

警告:   unlink(temp / 2.pdf):中的资源暂时不可用   C:\ www \ test.php,第123行

我正在使用PHP的exec运行批处理文件来执行某些OCR,因此由于CMD正在忙于创建文件,因此在代码运行时无法删除该文件。创建文件后,我将使用FPDF / FPDI合并两个PDF,在另一个目录(merged / file.pdf)中创建一个新文件

因此,我需要做的是等待批处理文件执行完毕,并等待CMD释放文件以便可以将其删除。

我只是不知道该怎么做。

$scriptName = 'wscript "launchquiet.vbs" "C:\www\OCR.bat"';
exec($scriptName,$out);
foreach($out as $key => $value) {echo $key." ".$value."<br>";}

那是行不通的,即使我应该通过强制PHP等待脚本完成来强制PHP等待脚本输出。

我也尝试过

exec('wscript "launchquiet.vbs" "C:\www\OCR.bat" &');

exec('wscript "launchquiet.vbs" "C:\www\OCR.bat" 2>&1 &');

使用&2>&1 &,(应该从Googling)强制PHP等待脚本完成,但事实并非如此。

所以,我的问题就是:有没有办法做到这一点,迫使PHP等到exec完成;或者,如何使PHP在删除失败后等待10秒钟,然后再次尝试(如果再次失败,则再次等待)

编辑:执行删除操作的代码:unlink("temp/1.pdf");unlink("temp/2.pdf");

编辑2:整个代码

exec('wscript "launchquiet.vbs" "C:\www\OCR.bat"');

PDF::Merge("temp/" . $newFileName . ".png", "temp/" . $newFileName . "_1.pdf", "temp/" . $newFileName . "_2.pdf", $newFileName);
unlink("OCR.bat"); // Delete Files
unlink("temp/" . $newFileName . ".png");
unlink("temp/" . $newFileName . "_1.pdf";
unlink("temp/" . $newFileName . "_2.pdf";

1 个答案:

答案 0 :(得分:1)

扩展我发现的示例之一,您可以尝试以下代码:

set_time_limit(1800);
ob_implicit_flush(true);

$scriptName = 'wscript "launchquiet.vbs" "C:\www\OCR.bat"';

$descriptorspec = array(
  0 => array("pipe", "r"),  // stdin
  1 => array("pipe", "w"),  // stdout -> we use this
  2 => array("pipe", "w")   // stderr 
);

$process = proc_open($scriptName, $descriptorspec, $pipes);

if (is_resource($process)){
  while( ! feof($pipes[1])){
    $return_message = fgets($pipes[1], 1024);
    if (strlen($return_message) == 0){
      break;
    }
    echo "$return_message<br />\r\n";
    ob_flush();
    flush();
  }
}

$exit=proc_close($process);
echo "exitcode $exit\r\n";

PDF::Merge("temp/" . $newFileName . ".png", "temp/" . $newFileName . "_1.pdf", "temp/" . $newFileName . "_2.pdf", $newFileName);
unlink("OCR.bat"); // Delete Files
unlink("temp/" . $newFileName . ".png");
unlink("temp/" . $newFileName . "_1.pdf";
unlink("temp/" . $newFileName . "_2.pdf";

这应该启动进程,运行该进程,显示STROUT,然后关闭该进程,然后再继续。这应该等待,然后关闭进程应释放所有打开的文件。

希望有帮助。