如果你希望看到C语言级别的php代码就需要使用strace

这个默认是安装了的,如果没有安装可以

#yum install strace

查看httpd进程

#ps auxw | grep httpd

有多个,必须停止apache

[root@localhost usr]# /usr/local/webserver/apache2/bin/apachectl stop

启动单进程httpd
[root@localhost usr]# /usr/local/webserver/apache2/bin/apachectl -X -k start

再使用#ps auxw | grep httpd查看只有单经常,记下进程id

将strace绑定至apache

#strace -p 28224

算法

快速排序php代码

<?phpfunction quickSort($arr){$len    = count($arr);if($len <= 1) {return $arr;}$key = $arr[0];$left_arr    = array();$right_arr    = array();for($i=1; $i<$len; $i++){if($arr[$i] <= $key){$left_arr[] = $arr[$i];} else {$right_arr[] = $arr[$i];}}$left_arr    = quickSort($left_arr);$right_arr    = quickSort($right_arr);return array_merge($left_arr, array($key), $right_arr);}$arr = array(6,3,8,5,9,2,10);echo '<pre>';print_r(quickSort($arr));?>

在浏览器请求php页面,得到追踪信息

注意:如果看C语言生成的文件直接strace即可

#strace ./a.out

如果你只要看php的opcode可以参考:

PHP安装与使用VLD查看opcode代码【一种方法】

最简单的php代码

$a='123';   
echo $a;

追踪输出:

我们清晰的看到完整的解析流程

从eAccelerator中去读取缓存:

调用open()函数打开文件-->flock()函数锁定文件-->read()函数读取文件内容-->flock()解除锁定-->close()关闭文件

writev()输出http协议头http/1.1  200等等

关于eAccelerator参考 PHP安装eAccelerator

----------------------------------------------------

flock() 函数 锁定文件或解除锁定

定义:
int flock(int fd,int operation);
表头文件:
#include<sys/file.h>
说明:
flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件, 无法锁定文件的某一区域。
参数:
operation有下列四种情况:
LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。
LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。
LOCK_UN 解除文件锁定状态。
LOCK_NB 无法建立锁定时, 此操作可不被阻断, 马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合。
单一文件无法同时建立共享锁定和互斥锁定, 而当使用dup()或fork()时文件描述词不会继承此种锁定。
返回值:
返回0表示成功, 若有错误则返回-1, 错误代码存于errno。
----------------------------------------------------------
静态HTML

我们请求一个html静态文件,追踪信息

可见直接是open()函数去读静态文件

==============================

linux函数分析查询工具

1.优先推荐linux 中man命令

2.一个不错的中文Linux手册:http://cpp.ezbty.org/manpage

3.在线查英文Man手册:

http://www.kernel.org/doc/man-pages/

http://man7.org/linux/man-pages/dir_all_alphabetic.html

http://linux.about.com/od/commands/l/blcmdl.htm

http://linux.die.net/man/

http://www.linuxmanpages.com/

==============================

通用函数

gettimeofday取得目前的时间

定义:
int gettimeofday ( struct timeval * tv , struct timezone * tz )
表头文件:
#include <sys/time.h>
#include <unistd.h>

gettimeofday()会把目前的时间有tv所指的结构返回, 当地时区的信息则放到tz所指的结构中。
timeval结构定义为:
struct timeval{
long tv_sec; /*秒*/
long tv_usec; /*微秒*/
};
timezone 结构定义为:
struct timezone{
int tz_minuteswest; /*和Greenwich 时间差了多少分钟*/
int tz_dsttime; /*日光节约时间的状态*/
};

#include<sys/time.h>
#include<unistd.h>
main(){struct timeval tv;struct timezone tz;gettimeofday (&tv , &tz);printf("tv_sec; %d\n", tv,.tv_sec) ;printf("tv_usec; %d\n",tv.tv_usec);printf("tz_minuteswest; %d\n", tz.tz_minuteswest);printf("tz_dsttime, %d\n",tz.tz_dsttime);
}
tv_sec: 974857339
tv_usec:136996
tz_minuteswest:-540
tz_dsttime:0

=======================================================================

poll 函数

http://linux.about.com/library/cmd/blcmdl2_poll.htm

Linux / Unix Command: poll

NAME

poll - wait for some event on a file descriptor

SYNOPSIS

#include <sys/poll.h>

int poll(struct pollfd *ufds, unsigned int nfds, int timeout);

DESCRIPTION

pollis a variation on the theme of select. It specifies an array of nfdsstructures of type

        struct pollfd {int fd;           /* file descriptor */short events;     /* requested events */short revents;    /* returned events */};

-------------------------

write 将数据写入已打开的文件内

定义:
ssize_t write (int fd,const void * buf,size_t count);
表头文件:
#include<unistd.h>
说明:
write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。当然, 文件读写位置也会随之移动。

------------------------------

Linux / Unix Command: writev

http://linux.about.com/library/cmd/blcmdl2_writev.htm

NAME

readv, writev - read or write a vector

SYNOPSIS

#include <sys/uio.h>

ssize_t readv(int fd, const struct iovec *vector, int count);
ssize_t writev(int
fd, const struct iovec *vector, int count);

struct iovec {void *iov_base;    /* Starting address */size_t iov_len;    /* Length in bytes  */
};

----------------------------

使用man命令查getsockname

其他函数:

ACCEPT()和ACCEPT4()

getuid  取得用户标识
getcwd  获取当前目录
rt_sigaction(2)  检查和改变信号动作,sigaction() 系统调用被用于更改一个进程在接收一个特定信号后的动作。
setitimer  获取设置定时器的值
poll(2) 在文件描述符上等待事件
stat64 获取文件状态
chdir  改变工作目录

linux上使用strace查看C语言级别的php源码【一种方法】相关推荐

  1. linux中复制字符串出错,C语言实现字符串的复制的两种方法

    本文将要为您介绍的是C语言实现字符串的复制的两种方法,具体操作方法: 利用数组实现 1 #include 2 #include 3 4 void copy_string(char str1[],cha ...

  2. linux 6 yum配置,redhat 6(centos 6)配置 yum 源的两种方法

    由于 redhat的yum在线更新是收费的,如果没有注册的话不能使用,如果要使用,需将redhat的yum卸载后,重启安装,再配置其他源. 本文包括配置本地源及第三方源.第三方源包括:网易,epel, ...

  3. 在Linux上安装CHM查看工具

    在Linux上安装CHM查看工具: [root@localhost ~]# yum install chmlib [root@localhost ~]# yum install wxGTK [root ...

  4. Linux中一行命令查看网卡流量、统计网络流量的各种实现方法

    Linux中一行命令查看网卡流量.统计网络流量的各种实现方法. 方法一.nload工具 源码包路径: wget http://heanet.dl.sourceforge.net/project/nlo ...

  5. Linux内核网络协议栈:udp数据包发送(源码解读)

    <监视和调整Linux网络协议栈:接收数据> <监控和调整Linux网络协议栈的图解指南:接收数据> <Linux网络 - 数据包的接收过程> <Linux网 ...

  6. linux临时配置mac地址,Linux获取网卡型号、mac地址、修改IP地址的几种方法

    1.获取所有有(无)网卡型号 方法一.ifconfig 用法:ifconfig | grep | cut -d ':' -f 1 ubuntu root@ubuntu:~# ifconfig | gr ...

  7. linux配置yum源的三种方法:

    linux配置yum源的三种方法: 1.配置网络yum源 2.通过上传镜像文件配置本地yum源 3.通过连接存储或本地镜像文件配置本地yum源(虚拟机) 配置各种yum源的时候,需要提前知道自己的li ...

  8. 基于线上的茶叶购买小程序(论文+程序设计源码+数据库文件)

    微信小程序在日常生活中应用越来越广,网上消费.游戏娱乐等成为了一种常见应用方式.为进一步了解和探索微信小程序在点餐系统中的潜在价值和意义,本文通过使用 Javascript 技术.Spring boo ...

  9. 区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-熊丽兵-专题视频课程...

    区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-103人已学习 课程介绍         区块链开发技术进阶-深入详解以太坊智能合约语言 solidity视频培训教程:本课程是 ...

最新文章

  1. JavaScript Array相关方法
  2. 变量命名规范 匈牙利 下划线 骆驼 帕斯卡
  3. 面试后要请你吃饭_做了15年HR,面试4千人,发现优秀的会计能将这些题应答如流...
  4. 重造车轮—基于JQ的商品展示放大镜
  5. Android小知识10则(上)(2018.8重编版)
  6. OSI 七层网络协议的定义与理解
  7. [转载] python 装饰器
  8. 斐波那契数列PHP非递归数组实现
  9. python中字典的知识讲解
  10. oracle新书 罗敏_Oracle Acs资深顾问罗敏 老罗技术核心感悟:分表还是分区?
  11. C语言--实现汉诺塔【图文讲解,附代码】
  12. python VS matlab: reshape/max/matrix index等方法比较
  13. 移动 电信 联通 APN cmwap cmnet ctwap ctnet 3gwap uniwap 3gnet uninet是...
  14. hosts屏蔽网站以及代理越过屏蔽
  15. 新概念1、2英语学习计划
  16. 专享策略02 | 商品股指通用套利策略(一)
  17. 坑 | NIO - [AsynchronousFileChannel + CompletionHandler]
  18. 虹软人脸识别 - 人脸特征数据的存取
  19. 软件工程(4)--螺旋模型
  20. IDEA上集成log4j将SQL语句打印在控制台上

热门文章

  1. linux怎么创建用户教程,在Linux中如何手动创建一个用户
  2. 导入eclipse项目运行时run as no application
  3. Python 比较俩张图片差异
  4. Python3 pathlib让编程更美好
  5. 数据结构和算法:(3)3.2.1单链表的整表创建
  6. 1.数字图像获取:1.4图像的数据结构与特征
  7. Python Qt GUI设计:QMdiArea和QMdiSubWindow类实现多文档界面(拓展篇—3)
  8. 基于VS+Qt Gui显示控制台用于调试
  9. 设置echarts的grid、tooltip、柱状图渐变色、折线图渐变色
  10. 解决Vue用v-html、v-text渲染后台富文本框文本内容样式修改问题,用自定义css样式无法渲染出对应效果的问题