作者归档:salmonl

关于salmonl

成长,长成自己的样子。微博@动机在北京,欢迎来玩~

xdebug扩展安装笔记

一、前景提要

编译安装一个PHP扩展并不是一件难事,但有时候我们需要明确扩展的版本, 这有时候就会成为一个小问题。比如接下来说的xdebug。

xdebug是什么,有那些功能,及使用场景,超出了本文讨论的范围。你可以去官网查看。

二、版本选择

不知道你是不是这样,直接通过官网的下载(download)导航进到下载页, 发现一系列版本不知道下载哪一个,反正我是这样。
继续阅读

常用shell命令-进程查看

一、查看进程,ps aux

ps aux | grep 'niliu'
#以上命令想必你一定不陌生,那么如果想快速知道每行的含义呢
[root@Mcqp15t170 chuanbo7]# ps aux | grep 'USER'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      5637  0.0  0.0 112640   960 pts/0    S+   19:28   0:00 grep --color=auto USER

每一列参数说明
+---------+--------------------------------------------------------------------------------------------------------------------+
| name    | info                                                                                                               |
+---------+--------------------------------------------------------------------------------------------------------------------+
| USER    | 进程所有者用户名                                                                                                    |
| PID     | 进程标识符                                                                                                          |
| %CPU    | 该进程使用CPU百分比                                                                                                 |
| %MEM    | 该进程使用物理内存百分比                                                                                             |
| VSZ     | 该进程使用的虚拟内存(KB)                                                                                            |
| RSS     | 该进程占有的固定内存(KB)                                                                                            |
| TTY     | 终端名称                                                                                                           |
| STAT    | 进程状态(具体状态含义参考下文进程状态)                                                                                |
| START   | 进程开始执行时间(当天显示小时:分钟;一天之前显示月:日, 一年之前的还没有遇到过)                                           |
| TIME    | 进程实际占有CPU总时间(i:s)                                                                                          |
| COMMAND | 启动任务命令行包括参数                                                                                              |
+---------+--------------------------------------------------------------------------------------------------------------------+


# 其实ps aux就行了,但是如果进程太大,不方便查看

ps aux | grep 'filterfeeds'
root     16803  8.6  0.3 368496 43760 ?        S    17:37   4:27 /usr/local/sinasrv2/bin/php /data1/www/htdocs/energy.tv.weibo.cn/public/cli.php request_uri=/cli_filterfeeds/index/proc_total/8/proc_num/6
root     16870 18.6  0.4 383204 59104 ?        R    17:37   9:37 /usr/local/sinasrv2/bin/php /data1/www/htdocs/energy.tv.weibo.cn/public/cli.php request_uri=/cli_filterfeeds/index/proc_total/8/proc_num/7

进程状态:

D   不可中断睡眠 (通常是在IO操作) 收到信号不唤醒和不可运行, 进程必须等待直到有中断发生
R   正在运行或可运行(在运行队列排队中)
S   可中断睡眠 (休眠中, 受阻, 在等待某个条件的形成或接受到信号)
T   已停止的 进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行
W   正在换页(2.6.内核之前有效)
X   死进程 (未开启)
Z   僵尸进程  进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放BSD风格的
<   高优先级(not nice to other users)
N   低优先级(nice to other users)
L   页面锁定在内存(实时和定制的IO)
s   一个信息头
l   多线程(使用 CLONE_THREAD,像NPTL的pthreads的那样)
+   在前台进程组 

继续阅读

C语言指针笔记

C语言指针是难点,是必须要攻克的堡垒。

看C语言的资料,指针是绕不过去的,这里记录自己对指针的理解。

一、感性认识指针。
0、有如下C代码,存为point.c文件

#include <stdio.h>

int main()
{
	int num = 1;
	int *point;

	point = &num;

	// %p表示输出地址
	printf("&num = %p | point = %p | *point = %d \n", &num, point, *point);
}

继续阅读

shell脚本中关联数组及其遍历

shell中(version >= 4.1.2)也存在关联数组(associated array),跟PHP的关联数据很像。

查看shell版本

bash -version

GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

继续阅读

编译器cc、CC、gcc、g++区别

看C语言经典教材《C程序设计语言》中,Linux下编译C代码用的是cc, 广为人知的C编译器的gcc, 还有CC、g++那么有啥差异呢

一、cc是Unix下C语言编译器,是c compiler的缩写。
cc是付费的。所以Unix的两个孩子Linux和Mac OS上的cc都是软连接。
0、Linux下(这里测试用的是Centos)

[root@izj6cfhaw27k49x8usszs3z ~]# which cc
/usr/bin/cc
[root@izj6cfhaw27k49x8usszs3z ~]# ls -l /usr/bin/cc
lrwxrwxrwx 1 root root 3 Jul 22  2018 /usr/bin/cc -> gcc
[root@izj6cfhaw27k49x8usszs3z ~]# which gcc
/usr/bin/gcc

可见,cc是gcc的软连接
继续阅读

PHP foreach遍历对象

foreach可以遍历数组,也可以遍历对象。但是默认情况下只能遍历对象的可见属性。

class User
{
    public  $name = 'salmonl';
    private $sex  = 'm';
    private $age  = 30;

    public static function getAge()
    {
        return $this->age;
    }
}

$user = new User();
var_dump($user);

foreach ($user as $key => $value) {
    echo $key, '==>', $value, PHP_EOL;
}

继续阅读

PHP后台上传图片

前台图片上传

比较普遍用这种方式,页面通过form表单来提交,服务端PHP通过$_FILES来接收

<!DOCTYPE html>
<html>
 <head>
  <meta charset="UTF-8">
  <title></title>
 </head>
 <body> 
  <form action="upload.php" method="post" enctype="multipart/form-data">
   图片:<input type="file" name="img"/>
   <input type="submit" value="点击上传"/>
  </form>
 </body>
</html>

我们知道form表单默认是通过application/x-www-urlencoded方式编码传递的。以上form表单指定了通过multipart/form-data的编码方式,支持二进制传输。

那么服务端如果想调用公司平台接口上传呢,下来将进行介绍
继续阅读

PHP生成二维码传到页面的坑

PHP生成二维码

最近做页面保存长图的功能,长图底部需要附带页面地址二维码,之前没搞过二维码相关的实现,在Google上搜索一番,发现了两个现有的轮子phpqrcode扩展和qr-code扩展。

对比发现phpqrcode很多年没有维护了,最终选择了qr-code。
注:如果使用phpqrcode可以参考PHP基于phpqrcode类生成二维码

使用qr-code生成二维码很容易,参考这篇文章PHP生成二维码
继续阅读

堆及堆排序PHP实现

什么是堆

堆是一种数据结构,特殊的树形数据结构。常见的堆有二叉堆、二项式堆、斐波拉契堆等。
堆这种数据结构主要用来实现两个功能:堆排序和优先队列。

细说二叉堆

这里细说的堆排序使用的是二叉堆,那么二叉堆是什么样的呢
二叉堆是一颗完全二叉树(维基百科提到还有可能是近似完全二叉树,很不理解),节点和双亲节点维持着固定的关系,要么节点的值都大于双亲节点,要么节点的值都小于双亲节点,并且每个节点的左右子树都是二叉堆。
特点:
0、节点都大于双亲节点的二叉堆叫大顶堆。
1、节点都小于双亲节点的二叉堆叫小顶堆。
2、二叉堆一般用一维数组来存储。
3、二叉堆一个节点的左右孩子没有顺序。
4、有n个元素的二叉堆,最后一个非叶节点为n/2 -1
继续阅读