gpt4 book ai didi

PHP proc_open() 超时

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:19:32 24 4
gpt4 key购买 nike

我想调用proc_open在后台执行一个脚本,后台进程会在几秒后终止。基本上,该脚本是一个 C/Java/Python 脚本,它将编译并运行用户提交的代码,因此我希望该进程能够在一段时间后终止。

我想实现的是当后台运行脚本的执行时间超过,比如3秒,停止进程,同时停止写入文件。假设我运行一个 for 循环将某个字符串的 100 万行 写入文件,并且在 time >= 3 秒 时,进程停止。当我取回文件时,我会得到类似 200k 行 的字符串。然后我可以将文件的输出显示回浏览器。

我目前正在使用来自 https://blog.dubbelboer.com/2012/08/24/execute-with-timeout.html 的函数 exec_timeout .然后我执行命令exec_timeout("exec nohup java -cp some_dir compiled_java_file &", 3),后台进程即使已经超过超时值也不会终止,而是继续写到文件直到完成。然后只有我可以将结果回显给浏览器。如果用户提交无限运行的代码,该进程将一直卡在那里,直到我在 ec2 linux 实例中将其杀死。

知道为什么它没有按预期运行吗?或者有什么更好的功能可以实现我的目标?我的应用程序使用 PHP 开发并托管在 AWS Elastic Beanstalk 上。

最佳答案

关于 proc_terminate manual ,第一个用户贡献的笔记:

As explained in http://bugs.php.net/bug.php?id=39992, proc_terminate() leaves children of the child process running. In my application, these children often have infinite loops, so I need a sure way to kill processes created with proc_open(). When I call proc_terminate(), the /bin/sh process is killed, but the child with the infinite loop is left running.

在执行超时时:

proc_terminate($process, 9);

应替换为:

$status = proc_get_status($process);
if($status['running'] == true) { //process ran too long, kill it

//get the parent pid of the process we want to kill
$ppid = $status['pid'];
//use ps to get all the children of this process, and kill them
$pids = preg_split('/\s+/', `ps -o pid --no-heading --ppid $ppid`);
foreach($pids as $pid) {
if(is_numeric($pid)) {
echo "Killing $pid\n";
posix_kill($pid, 9); //9 is the SIGKILL signal
}
}
proc_close($process);
}

关于PHP proc_open() 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45507489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com