php exec()从未结束

时间:2016-03-21 07:17:38

标签: php exec

我使用 php exec()来运行可执行文件,似乎永远不会结束。

但是在shell中运行这个可执行文件是可以的

这是可执行文件的主要内容:

  

叉();

     

子进程会浪费一些时间。   我 setrlimit 一个CPU时间

     

在父进程中:当used_time计算超出限制时,侦听信号并终止子进程

如何让php exec()工作?

更新

因为代码太长,我只选择其中一些

主要功能

child_pid = fork();
if(child_pid == 0)
{
    compile();
    exit(0);
}
else
{


    int res = watch();
    if(res)
        puts("YES");
    else
        puts("NO");
}

子进程

    LIM.rlim_cur = LIM.rlim_max = COMPILE_TIME;
    setrlimit(RLIMIT_CPU,&LIM);

    alarm(0); 
    alarm(LIM.rlim_cur * 10);
    switch(language)
    {
     //..... here is execl() to call compiler like gcc,g++,javac
    }

父进程

   int status = 0;
    int used_time = 0;
    struct timeval case_startv, case_nowv;
    struct timezone case_startz, case_nowz;
    gettimeofday(&case_startv, &case_startz);
    while(1)
    {
        usleep(50000);
        kill(child_pid,SIGKILL);
        gettimeofday(&case_nowv, &case_nowz);
        used_time = case_nowv.tv_sec - case_startv.tv_sec;

        if(waitpid(child_pid,&status,WNOHANG) == 0) //still running
        {
            if(used_time > COMPILE_TIME)
            {
                report_log("Compile time limit exceed");
                kill(child_pid,SIGKILL);
                return 0;

            }
        }
        else
        {
           //handle signals
        }
    }

测试时,只需php文件中的exec()函数

我所说的情况只发生在: 使用php exec()运行可执行文件来编译用户代码,如:

 #include "/dev/random"
    //....

2 个答案:

答案 0 :(得分:-1)

服务器上的Php脚本执行时间有限。以这种方式执行长时间运行的脚本通常不是一个好主意。建议将它们作为后台作业运行。

Thi在php.ini中定义,对于apache和shell

是不同的

答案 1 :(得分:-1)

最后,我发现了为什么会发生这种情况。

我只是杀了childpid,但没有因childpid杀死其他进程

因此php exec()将始终运行