• 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也使用了多进程,每个进程又生成多个线程。

    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带来的灾难。

    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数据库)
    7. 当ZE执行程序时可能会需要连接若干扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还;
    8. 最后,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” ,表示不限制大小,以实际系统的内存为依据。

  • 相关阅读:
    Leetcode 217 存在重复
    Leetcode 125验证回文串
    HTML标签
    Having dreams is what makes life tolerable.
    Database数据库——MySQL简述
    Python实践之路8——选课系统
    Python学习之路16——线程、进程和协程
    Python实践之路7——计算器
    Python学习之路14——Socket
    Python学习之路13——异常处理
  • 原文地址:https://www.cnblogs.com/weizaiyes/p/8183820.html
Copyright © 2020-2023  润新知