本人在windows下创建多进程的研究,唯一缺点,主进程所在终端关闭则所有子进程全部关闭。原理是通过proc_open创建多进程,通过环境变量识别父子进程,还能通过proc_open进行父子进程通信
<?php
namespace EasyTask;
use \Exception as Exception;
/**
* Class Wpc
* @package EasyTask
*/
class Wpc
{
/**
* 进程实例
* @var resource
*/
private $instance = null;
/**
* 环境变量
* @var null
*/
private $env = null;
/**
* 进程管道
* @var null
*/
private $pipes = [];
/**
* 进程工作目录
* @var null
*/
private $workDir = null;
/**
* 进程文件
* @var null
*/
private $filename = '';
/**
* 进程执行参数
* @var null
*/
private $argument = '';
/**
* 标准输入输出描述符
* @var array
*/
private $stdStruct = [];
/**
* 设置环境变量
* @param array $env
* @return $this
*/
public function setEnv($env)
{
$this->env = $env;
return $this;
}
/**
* 设置进程文件
* @param string $filename
* @return $this
* @throws Exception
*/
public function setFile($filename)
{
$filename = realpath($filename);
if (!file_exists($filename))
{
throw new Exception("the file:{$filename} is not exist");
}
$this->filename = $filename;
return $this;
}
/**
* 设置进程参数
* @param string $argument
* @return $this
*/
public function setArgument($argument)
{
$argument = (string)$argument;
$this->argument = $argument;
return $this;
}
/**
* 设置进程工作目录
* @param string $path
* @return $this
* @throws Exception
*/
public function setWorkDir($path)
{
$path = realpath($path);
if (!is_dir($path))
{
throw new Exception("the path:{$path} is not exist");
}
$this->workDir = $path;
return $this;
}
/**
* 设置标准输入输出文件描述符
* @param array $struct
* @return $this
*/
public function setStdStruct($struct)
{
$this->stdStruct = $struct;
return $this;
}
/**
* 获取进程ID
* @return int|false
*/
public function getPid()
{
if (is_resource($this->instance))
{
$status = proc_get_status($this->instance);
return !empty($status['pid']) ? $status['pid'] : false;
}
return false;
}
/**
* 获取程是否正在运行
* @return bool
*/
public function getIsRunning()
{
if (is_resource($this->instance))
{
$status = proc_get_status($this->instance);
return !empty($status['running']) ? $status['running'] : false;
}
return false;
}
/**
* 启动进程
* @return int 进程id
* @throws
*/
public function start()
{
if (!$this->stdStruct)
{
throw new Exception('Please set the file descriptor');
}
$this->instance = proc_open("$this->filename $this->argument", $this->stdStruct, $this->pipes, $this->workDir, $this->env, ['bypass_shell' => true]);
if (!$this->instance)
{
throw new Exception('failed to create process through proc_open');
}
return $this->getPid();
}
/**
* 停止进程
* @param bool $force 是否强制退出
*/
public function stop($force = false)
{
if (is_resource($this->instance))
{
$this->closePipes();
if (!$force)
{
proc_close($this->instance);
}
else
{
proc_terminate($this->instance);
}
}
}
/**
* 关闭管道
*/
private function closePipes()
{
if (is_resource($this->instance))
{
foreach ($this->pipes as $pipe)
{
if (is_resource($pipe))
{
fclose($pipe);
}
}
}
}
} <?php //高先生简单验证码. //随机数 //为什么循环0-15的数字 //因为要实现最简单的字母和数字混搭 //16进制0-9 a-f //dechex 十进制转换为16进制 //创建一个四位的验证码. //$nmsg.  ...
开启错误提示代码:ini_set("display_errors", "On"); error_reporting(E_ALL | E_STRICT);关闭错误提示代码:error_reporting(E_ALL ^&n...
(1).前端文件:<form action="upload.php" method="post" enctype="multipart/form-data"> &...
(1).在PHP中可以查看的环境变量包括: (1.1).电脑环境变量 (2.1).服务器环境变量(2).getenv()函数获取一个环境变量的值.参数1是环境变量的key,参数2值为true的时候仅从你的电脑环境变量中查找,参数2值为false会从两种变量中全部查询//获取我电脑登录的用户名,输出A...
有时候我们需要爬一个接口,但是这个接口需要很多参数,包括header和cookie要去编写,使用php curl模拟实在太慢。我们可以通过浏览器的network来复制请求为curl命令。例如我需要模拟请求接口地址:https://www.xkmz.cc/Ajax/Debug/delly,我们只需要在...
断点下载的原理:http请求头添加Range参数告诉文件服务器端需要的字节范围例如1个文本文件的字节为1000,第一次请求Range: bytes=0-500第二次请求Range: bytes=501-1000通过每次的请求将返回的流追加写入到文件。注意的项目:断点下载服务器端的每次只返回字节传输的...