linux php 进程初探

定义

根据维基百科的定义,进程(Process)是计算机中已运行程序的实体。用户下达运行程序的命令后,就会产生进程。进程需要些资源才能完成工作,如CPU使用时间、存储器、文件以及1/0设备,且为依序逐一进行,也就是每个CPU核心任何时间内仅能运行一项进程。我们简单总结下,进程就是代码运行的实体。这里补充一点,进程不一定都是正在运行的,也可能在等待调度或者停止,进程状态将在后续详细介绍。

PID

  1. 首先我们来学习PID这个概念, PID全称ProcessID,是标识和区分进程的ID,它是一个全局唯一的正整数
  2. 我们来编写个print_pid.php程序显示当前进程的PID。php提供两个函数实现

php 的posix扩展给我们提供了一个函数 posix_getpid

<?php
print("PID:".posix_getpid()."\n");

在这里插入图片描述

  1. 从图可以看出,进程运行时PID是由操作系统随机分配的,同一个程序运行两次会产生两个进程,当然也就有两个不同的PID那PID究竟有什么用呢?我们稍后会讨论,现在先了解下PPID

PPID

  1. 每个进程除了一定有PID还会有PPID也就是父进程ID,通过PPID可以找到父进程的信息。为什么进程都会有父进程ID呢?

因为进程都是由父进程衍生出来的,后面会详细介绍几种衍生的方法。

  1. 那么跟人类起源问题一样,父进程的父进程的父进程又是什么呢?

实际上有一个PID为1的进程是由内核创建的init进程,其他子进程都是由它衍生出来,所以前面的描述并不准确,进程号为1的进程并没有PPID。因为所有进程都来自于一个进程,所以Linux的进程模型也叫做进程树。

  1. 我们来编写个print_ppid.php程序显示当前进程的PPID。

php 的posix扩展给我们提供了一个函数 posix_getppid

<?php
print('PPID:'.posix_getppid()."\n");

在这里插入图片描述
4. 我们发现父进程ID都是一样的了,而且通过ps命令可以看到父进程就是bash说明通过终端执行命令其实是从bash,这个进程衍生出各种子进程。

ps aux |grep "17003" |grep -v "ps" |grep -v "grep"

在这里插入图片描述

拿到PID,PPID有什么用呢?马上揭晓。

  1. 查看PID首先我们想知道进程的PID,可以通过top或者ps命令来查看。在命令行执行top后,得到类似下面的输出,可以看到目前有很多进程PID分别是1、2、8和9等等
    在这里插入图片描述
  2. PS aux后输出如下,其中aux参数让ps命令显示更详细的参数信息。
    在这里插入图片描述
  3. 使用PID

拿到PID后,我们就可以通过kill命令来结束进程了,也可以通过kill -9或其他数字向进程发送不同的信号。信号是个很重要的概念,我们后面会详细介绍,那么有了进程ID,我们也可以看看进程名字。

进程名字

  1. 每个进程都一定有进程名字,例如我们运行top进程名就是"top",如果是自定义的程序呢?

php中可以通过cli_get_process_title 获得进程名。

<?php
$strNewName='dalei';


cli_set_process_title($strNewName);
print("process_name: ".cli_get_process_title()."\n");

sleep(30);

在这里插入图片描述

我们使用 sleep() 让程序挂载一段时间,然后再开一个终端来查看当前的进程信息。可以看到,不管是使用 ps 还是使用 top ,都可以看到相应的进程名称为dalei 的进程。这样,就完成了进程名称的自定义。
在这里插入图片描述
在这里插入图片描述

注意

  1. 如果我们没有自定义进程名称,打印cli_get_process_title函数就不会有任何的输出,大家可以自己尝试一下。
  2. 如果使用的是 Mac OS 系统,会提示:

// Warning: cli_set_process_title(): cli_set_process_title had an error: Not initialized correctly

  1. 进程名可以设置为中文
  1. 直接使用top命令展示出来的进程名都是php并不是我们设置的进程名(不管你设置的是中文还是英文,不过可以使用top -p 27002 -c 查看设置的进程名,不过如果进程名为中文展示存在乱码问题),使用ps 进程名为中文也存在乱码,所以并不推荐使用中文定时进程名 。
    在这里插入图片描述

在这里插入图片描述

  1. 是这cli_get_process_titlecli_get_process_title函数仅针对 CLI 运行环境。也就是说,在 CGI 正常网页运行的状态下这两个函数是没有效果的。

进程参数

  1. 任何进程启动时都可以赋予一个字符串数组作为参数,一般名为ARGV或ARGS,通过解析这些参数可以让你的程序更加通用,例如cp命令通过给定两个参数就可以复制任意的文件,当然如果需要的参数太多最好还是使用配置文件。
  2. 在php中也有个预定义变量可以获取进程参数 $argv(包含当运行于命令行下时传递给当前脚本的参数的数组。),还有个 $argc(包含当运行于命令行下时传递给当前脚本的参数的数目。)

注意: 脚本的文件名总是作为参数传递给当前脚本,因此 $argc 的最小值为 1。

<?php
echo 'process_argv:';
print_r($argv);
echo "\n";
echo 'process_argc:';
print_r($argc."\n");

在这里插入图片描述

进程输入与输出

进程参数只有在启动进程时才能赋值,如果需要在程序运行时进行交互,就需要了解进程的输入与输出了

  1. 每个进程操作系统都会分配三个文件资源,分别是标准输入STDIN、标准输出STDOUT和错误输出STDER。通过这些输入流,我们能够轻易得从键盘获得数据,然后在显示器输出数据。
  2. 标准输入
  1. php://stdinphp://stdoutphp://stderr 允许直接访问 PHP 进程相应的输入或者输出流。 数据流引用了复制的文件描述符,所以如果你打开 php://stdin 并在之后关了它, 仅是关闭了复制品,真正被引用的 STDIN 并不受影响。 推荐你简单使用常量 STDIN、 STDOUT 和 STDERR 来代替手工打开这些封装器
  1. 在php中相应的标准输入输出,请看下表
原始流 流打开副本 描述
STDINphp://stdin标准输入(standard input),只读,用于从控制台输入内容;
STDOUTphp://stdout标准输出(standard output),只写,用于向控制台输出正常信息;
STDERRphp://stderr错误输出(standard error),只写,用于向控制台输出错误信息;

标准输入实例

  1. php提供下面两种方式获得标准输入,官方推荐第一种
  2. php://stdin 是只读的
  3. 使用 fopen 打开封装器需要使用 fclose 关闭已打开的文件指针
<?php
//第一种方法
echo "请输入内容:";
$input = fgets(STDIN);
echo sprintf("输入的内容为:%s\n", $input);
//第二种方法
$dome = fopen("php://stdin", 'r');

echo "请输入:";
$test = fread($dome, 12);//最多读取12个字符
echo sprintf("输入为:%s\n", $test);
fclose($dome);

在这里插入图片描述

标准输出实例

PHP 中STDOUT用于向控制台输出标准信息;或者用fopen()函数打开的php://stdout写入的内容将直接输出到控制台的标准输出;标准输出的内容可以用过">"或者"1>"重定向到指定地方,比如文件。

<?php
fwrite(STDOUT,"通过STDOUT写入了:大雷编程\n");
$demo = fopen("php://stdout", "w");
fwrite($demo, "通过php://stdout写入:大雷编程\n");
fclose($demo);

在这里插入图片描述

标准错误输出实例

PHP中 STDERR 用于向控制台输出错误信息;或者用fopen()函数打开的"php://stderr"写入的内容将直接输出到控制台的错误输出;错误输出的内容可以用过"2>"重定向到指定地方,比如文件;也可以使用"2>&1"将错误输出定向到标准输出,与标准输出合并。

<?php
<?php
fwrite(STDERR, "STDERR写入错误输出;\n");
fwrite(STDOUT, "STDOUT 写入正常 \n");

$demo = fopen("php://stderr", "w");
fwrite($demo, "php://stderr写入的错误输出;\n");
fclose($demo);

$stdout = fopen("php://stdout", "w");
fwrite($stdout, "php://stdout写入正常 \n");
fclose($stdout);


在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值