Php 如果无法删除该文件,请稍候,然后重试

Php 如果无法删除该文件,请稍候,然后重试,php,Php,警告: 警告:取消链接(temp/1.pdf):资源在中暂时不可用 C:\www\test.php,第122行 警告: 取消链接(temp/2.pdf):资源在中暂时不可用 C:\www\test.php,第123行 我使用PHP的exec运行一个批处理文件来执行一些OCR,因此在代码运行时无法删除该文件,因为CMD正在忙于创建文件。创建文件后,我使用FPDF/FPDI合并两个pdf,在不同的目录中创建一个新文件(merged/file.pdf) 所以,我需要做的是等待批处理文件完成执行,等待C

警告:

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

警告: 取消链接(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>";}

使用
&
2>&1&
,这应该(通过谷歌搜索)迫使PHP等待脚本完成,但它不会

因此,我的问题是:有没有一种方法可以做到这一点,迫使PHP等待exec完成;或者,如何让PHP在删除失败时等待,比如10秒,然后重试(如果再次失败,则再次等待)

编辑:执行删除操作的代码:
unlink(“temp/1.pdf”)
取消链接(“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";

扩展我找到的一个示例,您可以尝试以下代码:

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";
设置时间限制(1800);
ob_隐式_刷新(真);
$scriptName='wscript“launchquiet.vbs”“C:\www\OCR.bat”“;
$descriptorspec=数组(
0=>数组(“管道”、“r”),//stdin
1=>array(“pipe”,“w”),//stdout->我们使用这个
2=>数组(“管道”,“w”)//stderr
);
$process=proc_open($scriptName,$descriptorspec,$pipes);
如果(是_资源($process)){
而(!feof($pipes[1])){
$return_message=fgets($pipes[1],1024);
if(strlen($return_message)==0){
打破
}
回显“$return\u message
\r\n”; ob_flush(); 冲洗(); } } $exit=proc_close($process); 回显“exitcode$exit\r\n”; 合并(“temp/”$newFileName..png”,“temp/”$newFileName.\u 1.PDF”,“temp/”$newFileName.\u 2.PDF“,$newFileName”); 取消链接(“OCR.bat”);//删除文件 取消链接(“temp/”$newFileName.png”); 取消链接(“temp/”$newFileName.\u 1.pdf”; 取消链接(“temp/”$newFileName.\u 2.pdf”;
这将启动流程,运行流程,显示STROUT,然后在继续之前关闭流程。这将等待,然后关闭流程将释放所有打开的文件


希望这有帮助。

回答你最后一个问题:
while(1){做一些事情;如果事情奏效,休息;睡觉(10);}
你能把试图删除文件的代码包括进来吗?我在你的问题中没有看到类似的东西。你能用PHP全部执行吗?这样你可以检查过程。或者等待它完成。@billynoah添加了unlink()。而(1){unlink(“temp/1.pdf”;如果东西坏了;sleep(10);}…这就是我所能想到的。我不知道如何编写“如果东西起作用”部分…我能想到的最接近的东西是“或死()”,但我不想它死,请稍等几秒钟。我要求您将代码包含在上下文中。我可以看到您使用了取消链接,但在哪里?这没有意义-上面的代码调用
exec())
这通常会在脚本继续之前完成。包括您实际使用的代码-我们需要一个MCVE
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";
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";