Loading [MathJax]/jax/input/TeX/config.js
社区首页 >问答首页 >对PHP中的popen/fget施加时间限制

对PHP中的popen/fget施加时间限制
EN

Stack Overflow用户
提问于 2015-05-13 16:45:16
回答 2查看 963关注 0票数 3

我希望对使用PHP中的popen打开的fget读取进程施加一个时间限制。

我有下一个代码:

代码语言:javascript
代码运行次数:0
复制
$handle = popen("tail -F -n 30 /tmp/pushlog.txt 2>&1", "r");
while(!feof($handle)) {
    $buffer = fgets($handle);
    echo "data: ".$buffer."\n";
    @ob_flush();
    flush();
}
pclose($handle);

我试过但没有成功:

代码语言:javascript
代码运行次数:0
复制
set_time_limit(60);
ignore_user_abort(false);

这一过程如下:

  1. 浏览器发送一个GET请求,等待HTML5服务器附带事件格式的答复。
  2. 该请求由AWS负载均衡器接收,并转发给EC2实例。
  3. 答案是文件的最后30行。
  4. 浏览器在30条消息中接收它,连接将被持久化。
  5. 如果tail命令发送一个新行,则返回否则fget等待未定义的时间,直到新行从tail命令返回。
  6. 网络不活动60秒后,AWS负载均衡器(60秒内没有新行)关闭到浏览器的连接。到EC2实例的连接未关闭。
  7. 浏览器检测到连接已关闭,并打开一个新连接,进程返回到步骤1。

正如以下步骤所描述的,AWS负载均衡器和EC2实例之间的连接从未关闭过,在几个小时/天之后,有数百个尾和httpd进程在运行,服务器开始不应答。

当然,它似乎是一个AWS负载均衡器错误,但我不希望启动一个进程来赢得亚马逊的关注,等待修复。

我的临时解决方案是在服务器变得不稳定之前做一个sudo杀伤尾来杀死进程。

我认为PHP并没有停止脚本,因为PHP被“阻塞”了,等待fget完成。

我知道AWS负载均衡器的时间限制是可编辑的,但是我希望保持默认值,即使是更高的限制也不会解决这个问题。

我不知道是否需要将这个问题更改为如何在有时限/超时的linux中执行进程?

PHP 5.5.22 / Apache 2.4 / Linux内核3.14.35-28.amzn1.x86_64

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-13 20:25:24

用PHP 5.5.20测试:

代码语言:javascript
代码运行次数:0
复制
//Change configuration.
set_time_limit(0);
ignore_user_abort(true);

//Open pipe & set non-blocking mode.
$descriptors  = array(0 => array('file', '/dev/null', 'r'),
                      1 => array('pipe', 'w'),
                      2 => array('file', '/dev/null', 'w'));
$process      = proc_open('exec tail -F -n 30 /tmp/pushlog.txt 2>&1',
                                $descriptors, $pipes, NULL, NULL) or exit;
$stream       = $pipes[1];
stream_set_blocking($stream, 0);

//Call stream_select with a 10 second timeout.
$read = array($stream); $write = NULL; $except = NULL;
while (!feof($stream) && !connection_aborted()
        && stream_select($read, $write, $except, 10)) {

    //Print out all the lines we can.
    while (($buffer = fgets($stream)) !== FALSE) {
        echo 'data: ' . $buffer . "\n";
        @ob_flush();
        flush();
    }

}

//Clean up.
fclose($stream);
$status = proc_get_status($process);
if ($status !== FALSE && $status['running'] === TRUE)
    proc_terminate($process);
proc_close($process);
票数 0
EN

Stack Overflow用户

发布于 2015-05-14 06:55:28

我没有使用进程文件指针,而是采用了我的“多任务处理”方法。我使用这段代码生成其他“进程”,类似于一种多任务欺骗。

我调用一个脚本hang.php,它只挂起90秒:sleep(90)

您可能需要调整流和stream_select超时。

创建流

代码语言:javascript
代码运行次数:0
复制
header('Content-Type: text/plain; charset=utf-8');
$timeout = 20; 
$result = array(); 
$sockets = array(); 
$buffer_size = 8192;
$id = 0;
$stream = stream_socket_client("ispeedlink.com:80", $errno,$errstr, $timeout,
    STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT); 
if ($stream) {
  $sockets[$id++] = $stream;  // supports multiple sockets
  $http = "GET /testbed/hang.php HTTP/1.0\r\nHost: ispeedlink.com\r\n\r\n"; 
  fwrite($stream, $http);
} 
else { 
  echo "$id Failed\n";
} 

可以通过添加流:$sockets[$id++] = $stream;来运行其他脚本

下面将向$result[$id]数组中读取任何内容。

监视流:

代码语言:javascript
代码运行次数:0
复制
while (count($sockets)) {
  $read = $sockets; 
  stream_select($read, $write = NULL, $except = NULL, $timeout); 
  if (count($read)) {
    foreach ($read as $r) { 
      $id = array_search($r, $sockets); 
      $data = fread($r, $buffer_size); 
      if (strlen($data) == 0) { // either reads data or EOF
        echo "$id Closed: " . date('h:i:s') . "\n\n\n";
        fclose($r); 
        unset($sockets[$id]);
      } 
      else {
        $result[$id] .= $data; 
      }
    }
  }
  else { 
    echo 'Timeout: ' . date('h:i:s') . "\n\n\n";
    break;
  }
}
echo system('ps auxww');

当我想要终止一个进程时,我使用system('ps auxww')获取pid并使用system("kill $pid")终止它。

kill.php

代码语言:javascript
代码运行次数:0
复制
header('Content-Type: text/plain; charset=utf-8');
//system('kill 220613');

echo system('ps auxww');
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30227531

复制
相关文章
php中popen,exec,system,passthru区别
system() 原型:string system (string command [, int return_var]) system()函数很其它语言中的差不多,它执行给定的命令,输出和返回结果。第二个参数是可选的,用来得到命令执行后的状态码。 exec() 原型:string exec (string command [, string array [, int return_var]]) exec() 函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。虽然它只返
友儿
2022/09/11
6630
反反爬虫技术:对限制连续请求时间的处理
一般的反爬措施是在多次请求之间增加随机的间隔时间,即设置一定的延时。但如果请求后存在缓存,就可以省略设置延迟,这样一定程度地缩短了爬虫程序的耗时。
Python研究者
2022/04/08
1.3K0
反反爬虫技术:对限制连续请求时间的处理
Java 中如何限制方法的返回时间
可以使用 JDK 中的 ExecutorService 方法来对调用的方法进行处理。
HoneyMoose
2023/02/10
3.1K0
Java 中如何限制方法的返回时间
python中os. popen sy
python调用Shell脚本或者是调用系统命令,有两种方法: os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码,正确会返回0,错误会返回其他数字。 后者的返回值是脚本执行过程中的输出内容。实际使用时视需求情况而选择。 popen的返回时一个对象,直接查看,是这样的结果:<open file 'help', mode 'r' at 0x00000000026B2150> popen要想查看结果需要这样查看:
py3study
2020/01/09
6360
PHP使用 Redis 对 IP 访问频次进行限制
我有一个接口站 http://api.qianduanwang.vip 有一个接口发现被恶意调用了,需要想对 IP 进行访问频次限制,服务器上正好有 Redis,就用这个对 IP 访问频次进行限制是个不错的选择,那来直接上代码吧!
程序猿的栖息地
2022/04/29
1.2K0
PHP使用 Redis 对 IP 访问频次进行限制
利用PHP的Popen实现RRDTOOL作图的动态输出
最近看了一下RRDTOOL如何作图,语法确实比较繁琐,但不是太难。命令行下执行的时候,每次都需要输出成为一个文件。我们希望做一个应用,能够动态生成图表,看了看Cacti的实现方法,核心的部分就是使用了popen这个函数,将命令的输出放到了管道中,然后循环读取所有的数据,完成后,再以图片的形式输出到客户端。这样用户就能够看到动态的图片而不需要进行物理的存储了,下面是我截取的代码段,供大家参考。
大江小浪
2018/07/25
1K0
nginx限制上传大小和超时时间设置说明/php限制上传大小
现象说明: 在服务器上部署了一套后台环境,使用的是nginx反向代理tomcat架构,在后台里上传一个70M的视频文件,上传到一半就失效了! 原因是nginx配置里限制了上传文件的大小 client_max_body_size:这个参数的设置限制了上传文件的大小,可以在http、server、location三个区域里配置 [root@dev-huanqiu ~]# cat /Data/app/nginx/conf/nginx.conf ....... ....... http { include
洗尽了浮华
2018/01/23
8.2K0
详解PHP中的 input属性(隐藏 只读 限制)
<input onkeydown="if(event.keyCode==13)event.keyCode=9">
用户8449980
2021/07/13
1.9K0
php中的时间戳与javascript中的时间戳的比较
php中的时间戳与javascript中的时间戳的比较,本质上看,它们是一样的东西,但如果二者要进行相等比较的时候,还是有点不同的,稍不注意,就会误入歧途,所以,这里列出容易忽略的两点不同,供大家参考:
风柏杨4711
2021/03/15
3.4K0
详解PHP中的 input属性(隐藏 只读 限制)
<input onkeydown="if(event.keyCode==13)event.keyCode=9">
用户2323866
2021/06/29
1.7K0
日期时间限制的选择
对于elementUI一些拿来即用的组件,虽然是可以直接用,但仍需要针对自己的业务做一些特殊处理
itclanCoder
2021/11/18
3K0
Layui 时间控件限制[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142445.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/31
1.9K0
mysql中的数据库对用户权限做限制
mysql中限定用户对数据库的权限 默认的MySQL安装之后根用户是没有密码的 先用根用户进入: # mysql -u root 执行: mysql> GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY “123456”; 用的是123456做为root用户的密码,我这里是做个例子,要是用123456做密码 那还不象不设置密码了:)
全栈程序员站长
2021/07/23
4K0
datetimepicker限制最大时间
$( ‘#datetimepicker3’). datetimepicker({
全栈程序员站长
2021/04/07
1.1K0
对的时间遇到对的课
同学们好! 《计算机视觉原理及实战》已经开播两节拉! 内容新颖有趣,范例源自生活 好奇宝宝们请戳下面的节选see see~ ▼
AI科技大本营
2018/04/27
6240
JobObject实现对进程进行内存和运行时间限制
最近在研究oj系统,查过网上的解决方案,大致分为两种: 一种是基于Java虚拟机的解决方案,让编译好的程序运行在java虚拟机里面,通过对虚拟机的限制保障时空有效性和系统安全性; 第二种是基于linux系统的方案,通过内置的系统函数设置程序可用资源以及通过限制用户运行此程序以保障系统安全性. 实际情况是希望在windows下实现oj系统,而且对jvm无爱,遂研究下通过windows的一些内核机制实现此目的. 根据上面的第二种解决方案后查阅MSDN及相关资料后得知windows下没有设置程序可用资源的函数,
码农二狗
2018/06/29
1.9K0
[MySQL] PHP IP登录限制的实现
在登录的时候 , 对安全性比较高的业务 , 需要进行限制指定IP或IP段才能登录 , 企邮企业有的就限制只能在本企业内登录
唯一Chat
2020/12/21
4K0
[MySQL] PHP IP登录限制的实现
python对列表中的字典按[key]时间排序
在翻看之前的一些面试题,发现其中有一个问题就是对列表中的字典按照某个key进行排序,题目是这样的:
the5fire
2019/02/28
5.7K0
(三)对 props 进行限制
# 🐷一、对 props 进行限制 class Person extends React.Component { render() { console.log(this) const { naem, age, sex } = this.props return ( <ul> <li>姓名:{name}</li> <li>性别:{sex}</li>
老怪兽
2023/02/22
2870
点击加载更多

相似问题

如何对操作施加时间限制

48

对工会施加限制

11

对apk的安装施加限制

22

对CLR施加内存限制

21

对clojure中的函数args施加限制

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档