警告:
警告:取消链接(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";
答案 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,然后关闭该进程,然后再继续。这应该等待,然后关闭进程应释放所有打开的文件。
希望有帮助。