PHP选项和运行
PHP运行模式
五大运行模式
1.cgi 通用网关接口
2.fast-cgi cgi升级
3.cli (Command Line Interface)
4.isapi 微软提供的面向Internet服务的API接口
5.apache2handler(将php作为apache的模块 nginx类似)
PHP的运行模式
php命令行模式
CLI
常用变量 STDIN STDOUT STDERR
上层调用->SAPI层->CGI/FAST-CGI APACHE EMBED
本地查看运行模式的方法
php -r phpinfo(); |find/grep "Server API"
php -r "echo php_sapi_name();"
phpinfo();
CLI模式
PHP命令行接口
直接在命令行下运行
php test.php
应用场景
- 定时任务
- 开发桌面应用就是使用PHP-CLI和GTK包
- 开发shell脚本
优点和缺点
无法为普通用户提供http服务
CGI模式
Common Gateway Interface 通用网关接口
网页和web服务连接起来
把http服务器接收的指令传递给执行程序 在把执行程序的结果返回给http服务器
CGI跨平台性强
- http服务器接收到用户请求后 如index.php 会通过配置的CGI服务执行
- 生成一个php-cgi.exe进程 执行php程序
- 执行的返回结果交给http服务器
应用场景
提供http服务
优点和缺点
跨平台,几乎可以在任何操作系统上实现.
web和server是独立的,结构清晰,可控性强
性能比较差,来一个请求,fork一个进程,100个请求就会fork100进程,消耗资源较多(fork-and-execute 模式)
FAST-CGI
快速通用网关接口(Fast Common Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本。FastCGI致力于减少Web服务器与CGI程序之间互动的开销,从而使服务器可以同时处理更多的网页请求。。
执行过程
web服务器启动时 ,载入FastCGI进程管理器
FastCGI进程管理器会启动多个CGI进程等待web服务器的链接.
当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将环境变量和标准输入发送到FastCGI子进程php-cgi
FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了
应用场景
提供http服务
优点和缺点
跨平台,几乎可以在任何操作系统上实现.
web和server是独立的,结构清晰,可控性强,并不需要web升级而变化
支持大并发
多进程,消耗较多内存
模块模式
模块模式指将php作为web服务器的一个模块运行
主要说说 iis 的 isapi 和apache的apache2handler
apache的apache2handler
apache监听到一个用户请求index.php
apache根据conf文件中配置的LoadModule php_module modules/mod_php5.so(windows下面是php5apache2_2.dll)调用PHP
在mod_php5.so(php5apache2_2.dll)注册一个php的钩子 php_ap2_register_hook
这个php_ap2_register_hook钩子函数中包括4个挂钩以及对应的函数ap_hook_pre_config, ap_hook_post_config ap_hook_handler,ap_hook_child_init。其中pre_config,post_config,child_init是启动挂钩,它们在服务器启动时调用。 handler挂钩是请求挂钩,它在服务器处理请求时调用。其中在post_config挂钩中启动php。
php执行完成数据通过.so或dll返回给apache
apache将数据返回到客户端
应用场景
提供http服务
优点和缺点
安装配置方便,不需要安装代码解析程序
支持多线程,占用资源少
支持大并发
apache
worker模式
worker全新的支持多线程和多进程混合模型的MPM 由于 使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。但是,worker也使用了多进程,每个进程又生成多个线程。
<IfModule worker.c>
ServerLimit 25 #每个子进程可配置的线程数上限
ThreadLimit 200 #所有服务线程总数的硬限制
StartServers 3
MaxClients 2000(2.3.13后改为MaxRequestWorkers)
MinSpareThreads 50
MaxSpareThreads 200
ThreadsPerChild 100 #每个子进程建立的线程数
MaxRequestsPerChild 0 (MaxConnectionsPerChild)
Event是Work模式的优化,主要为了解决Worker模式处理KeepAlive连接性能差的缺陷。通过建立专用处理线程来处理KeepAlive连接,同时将活跃请求转发给其他线程。避免了KeepAlive带来的灾难。
<IfModule event.c>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
apache vs nginx
apache采用了select网络 I/O模型低效
nginx采用最新epoll(linux2.6内核)和kqueue(freebsd) 网络I/O 模型
Apache进程干的事情多:执行PHP、输出HTML都得干,占用的资源就多(CPU、内存)
一般访问量网站优先选择Apache,它稳定可靠
Apache模块非常丰富,为了用它的模块得选它
Apache的rewrite非常强大,rewrite多就选择它
大访问量优先选择Nginx,它支持更多的并发连接
处理的都是静态内容(html,图片),首选Nginx
Nginx本质上是反向代理服务器,需要反向代理就选它
PHP运行机制和原理
1.从未手动开启php进程 是随着Apache启动而运行
2.PHP通过SAPI和Apache相连
3.PHP总共有三个模块 内核 Zend引擎 扩展层
4.PHP内核用来处理请求 文件流 错误处理等相关操作
5.Zend引擎(ZE)用来将源文件转换成机器语言 然后在虚拟机上运行
6.扩展层是一组函数 类库和流 PHP使用它们执行特定操作 (Mysql扩展连接Mysql数据库)
- 当ZE执行程序时可能会需要连接若干扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还;
- 最后,ZE将程序运行结果返回给PHP内核,它再将结果传送给SAPI层,最终输出到浏览器上。
php简化执行过程与上面的例子类似,但更加复杂
1.扫描(scanning) ,将index.php内容变成一个个语言片段(token)
2.解析(parsing) , 将一个个语言片段变成有意义的表达式
3.编译(complication),将表达式编译成中间码(opcode)
4.执行(execution),将中间码一条一条的执行
5.输出(output buffer),将要输出的内容输出到缓冲区
php更快
压缩代码,去除无用的注释或空白
尽量使用PHP内置函数或扩展函数
用apc/xcache/opcache等缓存PHP的opcode
使用多线程、多进程优化程序逻辑
缓存复杂和耗时运算的结果
能异步处理的任务不要马上处理,如发邮件
依据资源情况对FastCGI配置合适的参数
异步处理
fsockopen支持socket编程,可以使用fsockopen实现邮件发送等socket程序等等,使用fcockopen需要自己手动拼接出header部分
PHP引用
引用不是C的指针
引用允许用两个变量来指向同一个内容
引用做的第二件事是用引用传递变量
引用做的第三件事是引用返回
PHP垃圾回收机制
垃圾主要是针对内存的, 如果一个对象, 并没有任何变量引用它,那这个对象就是垃圾.
PHP选项
memory_limit
系统分配给PHP的最大内存数量。
可以在PHP代码中动态的修改,int_set(‘memory_limit’,’128M’);
如果设置为“-1” ,表示不限制大小,以实际系统的内存为依据。
PHP选项和运行的更多相关文章
- Maven学习(四)Maven 命令行选项
说明: 1.使用-选项时,和后面的参数之间可以不要空格.而使用--选项时,和后面的参数之 间必须有空格.如下面的例子: $ mvn help:describe -Dcmd=compiler:co ...
- 学习笔记——Maven 命令行选项
2014-10-09:更新裁剪反应堆具体用法 说明: 1.使用-选项时,和后面的参数之间可以不要空格.而使用--选项时,和后面的参数之 间必须有空格.如下面的例子: $ mvn help:des ...
- 9个 SSH常用命令选项
9个 SSH常用命令选项 SSH 是什么 SSH(全称 Secure Shell)是一种加密的网络协议.使用该协议的数据将被加密,如果在传输中间数据泄漏,也可以确保没有人能读取出有用信息.要使用 SS ...
- Microsoft Windows Installer 工具 Msiexec.exe 的命令行选项
摘自:http://support.microsoft.com/kb/314881/zh-cn 概要 本文列出了 Windows Installer 工具 Msiexec.exe 的命令行选项.Msi ...
- SSH常用命令选项
SSH 是什么 SSH(全称 Secure Shell)是一种加密的网络协议.使用该协议的数据将被加密,如果在传输中间数据泄漏,也可以确保没有人能读取出有用信息.要使用 SSH,目标机器应该安装 SS ...
- dokcer 运行和进入容器
<pre name="code" class="html">docker:/root# docker run -itd --name zjtest8 ...
- 第5章1节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 官方简介(原创)
天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...
- 查询在应用程序运行得很慢, 但在SSMS运行得很快的原因探究
原文:查询在应用程序运行得很慢, 但在SSMS运行得很快的原因探究 查询在应用程序运行得很慢, 但在SSMS运行得很快的原因探究 -理解性能疑点 1 引言 内容来自http://www.so ...
- 老李推荐:第5章1节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 官方简介
老李推荐:第5章1节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 官方简介 在MonkeyRunner的框架中,Monkey是作为一个服务来接受来自Monkey ...
随机推荐
- Centos6.6安装Python3.5笔录
1.CentOS6.6 安装Python3.5 的依赖包 yum groupinstall "Development tools" yum install zlib-devel b ...
- O2耳放 DIY 模拟放大
http://nwavguy.blogspot.com/2011/07/o2-headphone-amp.html 原文链接 O2耳放. O2是一个DIY项目.免费,开源.本篇博客也免费,开源. O2 ...
- 【bzoj1083】[SCOI2005]繁忙的都市
1083: [SCOI2005]繁忙的都市 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2424 Solved: 1591[Submit][Sta ...
- Android Studio 编译提示 No installed build tools found. Please install the Android build tools
添加 ANDROID_HOME=D:\Android\adt-bundle-windows\sdk 系统变量即可
- 数字图像处理实验(8):PROJECT 04-04,Highpass Filtering Using a Lowpass Image 标签: 图像处理MATLAB 2017-05-25 0
实验要求: 高通滤波器可以通过1减去低通滤波器的传递函数得到. 使用公式 计算可以的得到 . 实验代码: % PROJECT 04-04 Highpass Filtering Using a Lowp ...
- does not name a type
一般都与头文件有关 1.缺少using namespaces std: 2.头文件的地方不对. 3.加错了头文件,还会出现内部函数库的报错.有的函数被多个函数库包含
- (回文串)leetcode各种回文串问题
题目一:最长连续回文子串. 问题分析:回文串顾名思义表示前后读起来都是一样,这里面又是需要连续的.分析这个问题的结构,可以想到多种方法.暴力解决的方式,2层循环遍历得出各个子串,然后再去判断该子串是否 ...
- QT背景
Qt是一个跨平台的C++图形用户界面应用程序框架.它为应用程序开发者提供建立基于window界面所需的功能. Qt是诺基亚公司的一个产品.1996年,Qt进入商业领域,已成为全世界范围内数千种成功的应 ...
- 如何将一个用utf-8编码的文本用java程序转换成ANSI编码的文本
jdk有一个关于UTF-8的bug所以加了一句 br.skip(1); bugID: http://bugs.java.com/view_bug.do?bug_id=4508058 public st ...
- cmake笔记
注:cmake . 当前文件夹(一个点) cmake .. 父目录(两个点) 例子一 一个经典的C程序,如何用cmake来进行构建程序呢? //main.c #include <stdi ...