即使system()中的命令完成,PHP system()也会挂起

时间:2010-12-29 16:26:49

标签: php

我有一个像这样的代码:

$file = fopen( "debug.txt", "w" );
$command = "myExe.exe param0 param1";
fprintf( $file, "starting\r\n" );
fflush( $file );
system( $command );
fprintf( $file, "the end...\r\n" );
fflush( $file );

它打印“开始”但不打印“结束......”。 system()函数挂起。

myExe.exe是一个用C ++编写的应用程序,它实际上终止了;即myExe的主要功能以这样的代码结束:

FILE* f = fopen( "test.txt", "w" );
fclose(f);
return 0;

创建了test.txt,这意味着“myExe.exe”正常工作并正常结束。

每次调用php文件时都不会出现这个问题;有时挂起,有时会工作...

任何帮助和想法都会得到满足。提前谢谢。

信息; 操作系统:赢得XP php服务器:wamp server 2.0

编辑:我的问题与我的调试文件无关。它是关于system()或exec()函数。我可以删除所有其他行。

我的PHP脚本适用于大约4/5次尝试。调用system()后,我调用了一些sql函数,但是当system()挂起时,我的页面会出现致命的错误。

4 个答案:

答案 0 :(得分:1)

Windows上的php中有一个已知的错误(http://bugs.php.net/bug.php?id=44942) 您可能需要尝试一种解决方法,在调用exec函数之前关闭会话(调用session_write_close())。

答案 1 :(得分:0)

尝试使用sprintf将格式化文本打印到字符串,然后写入,如下所示:

$file = fopen( "debug.txt", "w" );
$command = "myExe.exe param0 param1"; 
$startStr = sprintf( "starting\r\n" );
fwrite($file, $startStr);
fflush( $file );  
system( $command );  
$endStr = sprintf( "the end...\r\n" );
fwrite($file, $endStr);
fflush( $file );  

或者,如果您没有使用任何格式化的字符串(在这种情况下它看起来不像您),请删除sprintfs并使用write。

答案 2 :(得分:0)

我建议你下载/购买像phpDesigner或RapidPHP这样的东西,这样你就可以逐步完成程序的逻辑,看看到底发生了什么。没有什么因为程序错误而跳出来,但如果有,上述任何一个程序都会找到它并以红色显示给你。

你真的不需要“\ r \ n”,除非你喜欢双倍间距的东西。只需“\ n”就可以了。

另外,您是否尝试过“php -l”命令来检查错误?它可能会出现一些问题。

最后但并非最不重要的是,PHP中还有其他命令可以在外部运行程序 - 您是否尝试过其他命令?

只是一些想法。 : - )

PS:我刚才有另外一个想法:什么是param0和param1?如果它们包含特殊字符 - 这可能会影响系统命令发生的事情。

PPS:啊!我可能会得到部分答案。 “返回0”行可能是罪魁祸首。尝试将其更改为“exit(0);”代替。 return语句与exit不同。它试图返回调用程序而没有。但是,系统可能会混淆并认为它应该返回到PHP脚本(因为所有返回命令都是RET,这会导致系统命令中的JSR尝试捕获RET。通过将其替换为退出命令,通过程序告诉系统命令。系统命令然后将自己的RET命令返回给PHP。如果这是有道理的。基本上,你使用return命令做一个双RET,你也推动零( 0)状态代码到堆栈。由于系统正常返回自己的状态(通过exit命令)可能发生的事情是null(0)被解释为系统命令的停止命令.IE:零得到弹出到系统堆栈,生成RET,系统弹出RET,留下它不期望的零(0或null)字节并冻结系统命令。再次,答案是切换到使用“退出(0);“而不是返回命令。只是一个猜测但是我想我今年遇到的时候遇到了Perl而答案就是使用exit而不是return。所以我用PHP来解决它可能是同样的问题。 (在我记得它之前,不得不考虑一下。)

答案 3 :(得分:0)

我有一种感觉,只是一种感觉,你的过程中有一些打开的句柄阻止它退出。大多数情况下,当STDIN和STDOUT处理时会发生这种情况。您是否检查过C ++应用程序中的fclose()是否成功?

下载: http://technet.microsoft.com/en-us/sysinternals/bb896653

使用它可以查看myEXE.exe挂起时有多少句柄打开。

您是否恰巧为了SO而大大简化了myEXE.exe并错过了什么?