takuya/process

php proc_open 封装类,用于shell命令进程管理。

1.3.6 2021-03-10 16:53 UTC

This package is auto-updated.

Last update: 2024-09-19 11:21:42 UTC


README

Process 类组件在 proc_open 中执行命令。

<CircleciTest>

示例

<?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 中的文件。

资源