长期执行后,PHP exec不会获得stdout

时间:2015-04-03 17:07:34

标签: php c exec stdout

我得到了一个用C语言编写并用gcc编译的程序,我已经在Valgrind的Linux和带有drmemory的Windows中测试了内存泄漏等,以及相关的有问题的argv参数。我发现这样做绝对没有问题,而且我得到了我期望的输出。包含但几乎没有使用的唯一库是stdio.h,stdlib.h,string.h,sys / time.h。只有输出是printf并且fopen到一个特定的文件,当然在使用后关闭,没有乱搞stdout或stderr或类似的东西。

我用exec从PHP调用这个程序,程序似乎几乎一直都能完美运行,除了几次可执行文件需要30多秒或类似的东西。问题是,似乎我没有得到stdout我应该用PHP exec函数调用分配给$ output参数,它也不返回任何东西,这应该是从程序输出的最后一行。 exec函数的返回值参数设置为0,这实际上是C程序中main函数设置为返回的唯一返回值,没有退出或其他任何东西。我当然将PHP脚本的时间限制设置为0,它可以运行几个小时就好了。还应注意,我使用管理员权限从Windows 7中的cmd.exe运行此PHP脚本。

我现在已经调试了这么多,在我决定发布之前,我想看看它是否真的到了我的程序的printf部分,我想要的输出应该打印,所以我写了printf之后的文件完全相同的字符串。你猜怎么着?它将预期结果写入该文件......

从此我认为PHP exec不知何故在一定时间后没有得到stdout输出。有人对如何解决这个问题有任何想法吗?

我想一个可能的解决方法是让PHP脚本检查输出的创建文件,而不是通过应该从stdout获取它的$ output参数。也许当它从$ output中得不到任何东西时这样做,但这似乎是一个非常简陋的解决方法。

我错过了某种设置吗?

我正在运行PHP 5.6.6。

编辑: 在开始进行任何测试之前,我已经确定在PHP脚本的开头设置了这个:

error_reporting(E_ALL);
set_time_limit(0);

1 个答案:

答案 0 :(得分:0)

您是否尝试延长服务器配置中的最长执行时间(或使用set_time_limit())?我记得没错,默认值为30。也许这会导致问题。