php proc open 返回,PHP 函数proc_open笔记

之前写过一个爬虫demo(现在叫爬虫感觉有点勉强,啥都没有的那种),没有异步,必须等待 http 请求返回后,再进行内容解析,解析的时候也无法进行 http 请求

爬虫 demo 现在还没有异步,没有错误处理,啥都没有

然后之前参与的一个项目,用过 workerman 做过 websocket 的服务器,稍微瞟过一点源码,开启子进程是用的 proc_open 函数

windows环境没有pcntl库,想试一试用proc_open实现最基础的功能,进程共享/交互使用redis或者干脆用mysql算了

函数原型

resource proc_open ( string $cmd , array $desc , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] )

重点是 $desc 这个参数,内容是三个 资源流(resoure stream)[目前理解为和 fopen 返回的是同一类东西]

$desc[0] 是子进程的 STDIN , 往里面写入内容,子进程可以通过读取他自己的STDIN获取到内容

$desc[1] 是子进程的 STDOUT, 子进程的输出(echo,print_r,var_dump()等等),都会写入到$desc[1] 所代表的资源里面

$desc[2] 是子进程的 STDERR,错误输出,可以自主写入内容,暂时不明白进程退出会写入什么东西,抛出的异常信息好像不会写入到这个里面

下面贴一个自己的demo,因为目前还不知道如何判断当前是否子进程(不通过命令行参数的情况下),所以子进程是启动的不同的文件

#filename main.php

//主进程文件,输出时间(子父进程会sleep的关系,所以可能不会和当前时间相同,差距 2s 以内)

$child_file = "child.php";

$descriptorspec = array(

0 => array("pipe", "r"), // 标准输入,子进程从此管道中读取数据

1 => STDOUT, // 标准输出,重定向子进程输入到主进程STDOUT

2 => array("file", "error-output.txt", "a") // 标准错误,写入到一个文件

);

$child_process = proc_open("php {$child_file}", $descriptorspec, $pipes);

while(1){

$time = date("Y-m-d h:i:s");

fwrite($pipes[0], "main say {$time}\n");

sleep(2);

}

proc_close($child_process);

#filename child.php

while(1){

while($stdin = fread(STDIN, 65535)){

echo "child get main : " . $stdin;

sleep(2);

}

}

命令行输入php main.php 会不停的输出内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值