我使用 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"
//....
答案 0 :(得分:-1)
服务器上的Php脚本执行时间有限。以这种方式执行长时间运行的脚本通常不是一个好主意。建议将它们作为后台作业运行。
Thi在php.ini中定义,对于apache和shell
是不同的答案 1 :(得分:-1)
最后,我发现了为什么会发生这种情况。
我只是杀了childpid,但没有因childpid杀死其他进程
因此php exec()将始终运行