php在执行bat脚本时,一直阻塞,如何解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php在执行bat脚本时,一直阻塞,如何解决相关的知识,希望对你有一定的参考价值。

虽然你已经问了很久了 。今天我也碰到这个问题了。
发现是session死锁造成的 。
你可以在执行bat脚本的时候吧session关闭
session_write_close();
这样就不会阻塞下次请求了。不过如果你想执行完写入session那就不行了
参考技术A exec 或者 system 都可以调用cmd 的命令
直接上代码:
复制代码代码如下:

<?php
/** 打开windows的计算器 */
exec('start C:WindowsSystem32calc.exe');
/** php生成windows的批处理文件后,再执行这个批处理文件*/
$filename = 't.bat';
$somecontent = 'C:
';
$somecontent .= 'cd "C:/Program Files/mysql-Front"';
$somecontent .= '
start MySQL-Front.exe';
if (!$handle = fopen($filename, 'w'))
echo "不能打开文件 $filename";
exit;

/** 首先我们要确定文件存在并且可写*/
if (is_writable($filename))
/** 那就是当我们使用fwrite()的时候,$somecontent将要写入的地方
将$somecontent写入到我们打开的文件中 。*/
if (fwrite($handle, $somecontent) === FALSE)
echo "不能写入到文件 $filename";
exit;

echo "成功地将 $somecontent 写入到文件 $filename";
fclose($handle);
else
echo "文件 $filename 不可写";

exec($filename);
?>

如何调试.BAT脚本?

有没有办法单步执行.bat脚本?问题是,我有一个构建脚本,它调用了很多其他脚本,我想看看它们被调用的顺序是什么,这样我就可以知道我到底要去哪里并添加我的修改。

答案

我不知道无论如何要逐步执行.bat文件,但你可以使用echopause来帮助调试。

回声 将在批处理文件中回显消息。如ECHO Hello World将在执行时在屏幕上打印Hello World。但是,如果在批处理文件的开头没有@ECHO OFF,您还将获得“ECHO Hello World”和“Hello World”。最后,如果您只想创建一个空行,请键入ECHO。在末尾添加句点会创建一个空行。

暂停 提示用户按任意键继续。

资料来源:Batch File Help

@ workmad3:answer有更多使用echo命令的好技巧。

另一个有用的资源... DDB: DOS Batch File Tips

另一答案

确保脚本中没有'echo off'语句,并在调用每个脚本以重置您错过的任何脚本后调用'echo on'。

原因是如果保持echo,则命令解释器将在执行之前输出每个命令(在参数处理之后)。使它在生产中使用看起来非常糟糕,但对于调试目的非常有用,因为您可以看到输出出错的地方。

此外,请确保检查由调用的批处理脚本和程序设置的ErrorLevels。请记住,.bat文件中使用了两种不同的方法。如果您调用程序,则错误级别为%ERRORLEVEL%,而从批处理文件中,错误级别在ErrorLevel变量中返回,并且不需要围绕它的%。

另一答案

面对类似的担忧,我发现以下工具有一个简单的谷歌搜索:

JPSoft的“Take Command”包括批处理文件IDE /调试器。他们的short presentation video很好地展示了它。

几个小时后我就试用了试用版。这是我的第一个拙见:

  • 一方面,它确实允许调试.bat和.cmd脚本,我现在相信它在某些情况下可以提供帮助
  • 另一方面,它有时会阻塞,我不得不杀死它...特别是在调试下标时(并不总是系统地)..它不会显示“调用堆栈”也不会显示“跳出”按钮。

它试试了。

另一答案

我发现'跑步'(win32)软件正是我正在寻找的:http://www.steppingsoftware.com/

您可以加载bat文件,放置断点/开始单步执行它,同时查看输出和环境变量。

评估版只允许跨越50行...有没有人有类似功能的免费替代品?

另一答案

删除@ECHO OFF并调用批处理文件将所有输出重定向到日志文件。

c:> yourbatch.bat(可选参数)> yourlogfile.txt 2>&1

发现在http://www.robvanderwoude.com/battech_debugging.php

有用!!别忘了2>&1 ......

WIZ

另一答案

我能想到的唯一方法就是用echos和pauses来代码。

另一答案

您是否尝试将结果重新路由到文件?喜欢whatever.bat> log.txt

您必须确保在这种情况下,每个其他被调用的脚本也会记录到像>> log.txt这样的文件

此外,如果您在该批处理文件的开头和结尾放置日期/ T和时间/ T,您将获得该时间点的时间,并且您可以映射脚本的运行时间和顺序。

另一答案

或....从另一个.bat文件调用您的主.bat文件,并将结果输出到结果文件,即

runner.bat> mainresults.txt

runner.bat调用主.bat文件的位置

您应该立即看到主.bat文件中执行的所有操作

另一答案

或者,打开一个cmd窗口,然后从那里调用批处理,输出将在屏幕上。

以上是关于php在执行bat脚本时,一直阻塞,如何解决的主要内容,如果未能解决你的问题,请参考以下文章

如何让bat文件一直循环执行

ajax - 执行 php 脚本和数据验证时出错 - 如何解决?

求问 BAT脚本如何自动执行 adb shell 以后的命令

如何调试.BAT脚本?

如何使用Windows的内置功能从脚本中压缩或解压缩?

写个bat 脚本 打开cmd 并指向某个目录