takuya / process
php proc_open 封装类,用于shell命令进程管理。
1.3.6
2021-03-10 16:53 UTC
Requires
- php: >=7.2
Requires (Dev)
- phpunit/phpunit: ^8.0
This package is auto-updated.
Last update: 2024-09-19 11:21:42 UTC
README
Process 类组件在 proc_open 中执行命令。
示例
<?php $proc1 = new Process('sh'); $fd_out = $proc1->setInput('echo HelloWorld') ->pipe('cat') ->pipe('cat') ->pipe(['grep', 'Hello']) ->wait(); $ret = stream_get_contents($fd_out);
安装
composer require takuya/process
特性
STDOUT/STDERR 缓冲IO流
进程将返回缓冲IO以进行读写
方法将返回流。
<?php $proc = new Process(['echo', 'HelloWorld']); $fd_out = $proc->run(); $output = stream_get_contents($fd_out); // you can reuse, re-read output fseek($fd_out,0); $str = stream_get_contents($fd_out);
伪线程风格编程
<?php $proc = new Process('sh sleep.sh'); $proc->start(); echo 'started'; $proc->join();
管道命令链式方法
Process#pipe() 可以管道程序。
隐式连接管道 stdout -> stdin
<?php $proc = new Process(['echo', 'HelloWorld']); $fd_out = $proc->pipe('cat') ->pipe('cat') ->pipe('cat') ->pipe('cat') ->wait();
显式管道,连接 (Proc1#)stdout -> (Proc2#)stdin
<?php $proc1 = new Process(['echo', 'HelloWorld']); $proc2 = new Process(['cat']); [$p1_out,$p1_err] = $proc1->start(); $proc2->setInput($p1_out); $proc2->start(); $proc2->wait(); $proc1->wait();
注意:先调用 $proc2->wait()
,以避免长锁定,以并行运行两个进程。原因是 Process
类在 wait
时采用隐式 IO 缓冲,所以调用 wait()
意味着运行流缓冲循环,直到进程结束。
简单的方法,只需单个文件即可使用。
无需额外包。
需要使用单个文件 src/Process.php
。只需像这样写入 require_once。
<?php require_once 'src/Process.php';
这个 Process 类
是用 vanilla php 编写的。无额外包。无 pear,无 composer,无需安装其他包。
使用此功能无需 composer.phar
或其他包管理器,您只需要写入 require_once。
更多示例
更多使用,请阅读本项目中 /samples
、/tests/Features
和 ./docs
中的文件。