越努力 越幸运

命令行艺术之 ps 与 kill

一、概览

命令 psProcess Status 的缩写,它是用来列出系统中当前运行的进程,列出的是它们的快照,也即是执行 ps 命令的那一刻的那些进程,如果需要动态的列出进程信息,则需要使用 top 命令。

使用 ps 命令可以确定哪些进程正在运行及运行状态:是否结束、是否僵死、占用多少资源等。

Program 与 Process 区别与联系:

Program(程序):通常为 binary program,放在存储介质中(硬盘等),以实体文档存在;

Process(进程):程序被触发后,执行者的权限、属性、程序代码及所需资料都会被载入内存,作业系统会给这个内存内的单元一个唯一标识(PID),也即是进程就是一个正在运行中的程序。

更多、详细信息请阅读《鸟哥的 Linux 私房菜》

命令 ps 主要用于查看进程当前信息,而命令 kill 主要用于管理进程(杀死哪些进程)。

在 Linux 系统中,进程有 5 种状态:

运行:正在运行或在运行队列中等待

中断:休眠中,受阻,在等待某个条件的形成或接收到信号

不可中断:收到信号不唤醒和不可运行,必须等待直到中断发生

僵死:进程已经终止,但进程描述符还在,直到父进程调用wait4后才释放

停止:收到信号后停止运行

对应的进程状态在 ps 命令中则使用如下标识来标记:

PHP 代码规范摘记

一、概览

  • PHP 代码文件必须<?php<?= 标签开始;

  • PHP 代码文件必须不带BOM的 UTF-8 编码;

  • PHP 代码中应该只定义类、函数、常量等声明,或其他会产生 从属效应 的操作(如:生成文件输出以及修改ini配置文件等),二者只能选其一;

  • 类的命名必须遵循 StudlyCaps 大写开头的驼峰命名规范;

  • 类中的常量所有字母都必须大写,单词间用下划线分隔;

  • 方法名称必须符合 camelCase 式的小写开头驼峰命名规范;

  • 代码必须使用4个空格符而不是 tab键 进行缩进;

  • 每个 namespace 命名空间声明语句和 use 声明语句块后面,必须插入一个空白行;

  • 类的开始花括号({)必须写在函数声明后自成一行,结束花括号(})也必须写在函数主体后自成一行;

  • 方法的开始花括号({)必须写在函数声明后自成一行,结束花括号(})也必须写在函数主体后自成一行;

  • 类的属性和方法必须添加访问修饰符(privateprotected 以及 public), abstract 以及 final 必须声明在访问修饰符之前,而 static 必须声明在访问修饰符之后;

  • 控制结构的关键字后必须要有一个空格符,而调用方法或函数时则一定不能有空格符;

  • 控制结构的开始花括号({)必须写在声明的同一行,而结束花括号(})必须写在主体后自成一行;

  • 控制结构的开始左括号后和结束右括号前,都一定不能有空格符。

以下例子程序简单展示了以上大部分规范:

<?php
namespace Vendor\Package;

use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

class Foo extends Bar implements FooInterface
{
    public function sampleFunction($a, $b = null)
    {
        if ($a === $b) {
            bar();
        } elseif ($a > $b) {
            $foo->bar($arg1);
        } else {
            BazClass::bar($arg2, $arg3);
        }
    }

    final public static function bar()
    {
        // method body
    }
}

二、通用规则

1. 文件

所有 PHP 文件必须以一个空白行作为结束;

Nginx 与 PHP 环境搭建

一、基础工具

为了快速便捷的在本机(Mac OS)上搭建 Nginx+PHP 环境,首先安装 OS X 系统中最受欢迎的包管理工具 Homebrew

使用如下命令进行 Homebrew 安装:

ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

Homebrew 有如下常用的命令:

brew install #安装一个包

brew update #更新 Homebrew 在服务端上的包目录

brew upgrade #更新一个包

brew list –versions #查看已安装的包列表(包括版本号)

二、Nginx 与 PHP 安装

1. PHP 与 PHP-FPM 环境设置

Mac 系统已经自带安装了 PHP 环境,所以这里不再安装,可以使用如下命令查看自带版本是否为需要的版本:

php -v

php-fpm -v

验证版本满足需求后即可,否则使用 brew install 进行安装。

然后就可以使用命令 php-fpm(非管理员会有 warning 信息,忽略即可)或者命令 sudo php-fpm 启动 php-fpm 进程了,如果提示默认端口 9000 被占用,则需要更改 php-fpm.conf 配置文件里的端口号。

Windows 线程同步(用户态)

一、基本概念

所有线程都必须访问系统资源(如堆、串口、文件、窗口等),如果一个线程独占了对某个资源的访问,则其他线程就无法完成其工作;同时,不能让任何线程在任何时刻都能访问任何资源。

在如下两种基本情况下,线程之间需要相互通信:

  • 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性;
  • 一个线程需要通知其他线程某项任务已经完成。

二、原子访问:Interlocked 系列函数

原子访问是指一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源。

有如下示例代码:

// define a global var
long g_x = 0
DWORD WINAPI ThreadFunc1(PVOID pvParam)
{
	g_x++;
	return 0;
}

DWORD WINAPI ThreadFunc2(PVOID pvParam)
{
	g_x++;
	return 0;
}

现创建两个线程分别执行 ThreadFunc1 和 ThreadFunc2 ,两个函数的代码完全相同,当两个线程都停止运行时 g_x 的值被认为是 2 。但真的是这样吗?答案是有可能。

在 PHP 类中 self 、this 和 static 的区别

一、问题缘由

最近刚开始学习 PHP 语言,快速阅读完语言手册后,为了快速上手就开始看看 Slim 源码并开始写一个小的 Demo 以理解从前端到后端的数据流向。

但是在 Slim 源码文件 Slim.php 里 Slim 类的实现里有如下代码:

class Slim
{
    /**
     * @const string
     */
    const VERSION = '2.6.3';

    /**
     * @var \Slim\Helper\Set
     */
    public $container;

    /**
     * @var array[\Slim]
     */
    protected static $apps = array();

    /**
     * @var string
     */
    protected $name;

    // ...
    
    /**
    * Get application instance by name
    * @param  string    $name The name of the Slim application
    * @return \Slim\Slim|null
    */
    public static function getInstance($name = 'default')
    {
        return isset(static::$apps[$name]) ? static::$apps[$name] : null;
    }
    
    // ...
    
}

那么,代码段 static::$apps[$name]) 是什么意思呢?为什么是关键字 static 而不是 self 呢?甚至是 $this->apps[$name] 呢?接下来就讲讲在 PHP 的类里 thisselfstatic 的区别。