PHP的 FPM 和 CLI

PHP的 FPM 和 CLI PHP-FPM PHP-FPM 即 PHP FastCGI 进程管理器。 要了解 PHP-FPM ,首先要看看 CGI 与 FastCGI 的关系。 CGI 的英文全名是 Common Gateway Interface,即通用网关接口,是 Web 服务器调用外部程序时所使用的一种服务端应用的规范。 早期的 Web 通信只是按照客户端请求将保存在 Web 服务器硬盘中的数据转发过去而已,这种情况下客户端每次获取的信息也是同样的内容(即静态请求,比如图片、样式文件、HTML文档),而随着 Web 的发展,Web 所能呈现的内容更加丰富,与用户的交互日益频繁,比如博客、论坛、电商网站、社交网络等。 这个时候仅仅通过静态资源已经无法满足 Web 通信的需求,所以引入 CGI 以便客户端请求能够触发 Web 服务器运行另一个外部程序,客户端所输入的数据也会传给这个外部程序,该程序运行结束后会将生成的 HTML 和其他数据通过 Web 服务器再返回给客户端(即动态请求,比如基于 PHP、Python、Java 实现的应用)。利用 CGI 可以针对用户请求动态返回给客户端各种各样动态变化的信息。 FastCGI 顾名思义,是 CGI 的升级版本,为了提升 CGI 的性能而生,CGI 针对每个 HTTP 请求都会 fork 一个新进程来进行处理(解析配置文件、初始化执行环境、处理请求),然后把这个进程处理完的结果通过 Web 服务器转发给用户,刚刚 fork 的新进程也随之退出,如果下次用户再请求动态资源,那么 Web 服务器又再次 fork 一个新进程,如此周而复始循环往复。 而 FastCGI 则会先 fork 一个 master 进程,解析配置文件,初始化执行环境,然后再 fork 多个 worker 进程(与 Nginx 有点像),当 HTTP 请求过来时,master 进程将其会传递给一个 worker 进程,然后立即可以接受下一个请求,这样就避免了重复的初始化操作,效率自然也就提高了。而且当 worker 进程不够用时,master 进程还可以根据配置预先启动几个 worker 进程等着;当空闲 worker 进程太多时,也会关掉一些,这样不仅提高了性能,还节约了系统资源。 这样一来,PHP-FPM 就好理解了,FastCGI 只是一个协议规范,需要每个语言具体去实现,PHP-FPM 就是 PHP 版本的 FastCGI 协议实现,有了它,就是实现 PHP 脚本与 Web 服务器(通常是 Nginx)之间的通信,同时它也是一个 PHP SAPI,从而构建起 PHP 解释器与 Web 服务器之间的桥梁。 PHP-FPM 负责管理一个进程池来处理来自 Web 服务器的 HTTP 动态请求,在 PHP-FPM 中,master 进程负责与 Web 服务器进行通信,接收 HTTP 请求,再将请求转发给 worker 进程进行处理,worker 进程主要负责动态执行 PHP 代码,处理完成后,将处理结果返回给 Web 服务器,再由 Web 服务器将结果发送给客户端。这就是 PHP-FPM 的基本工作原理。...

2024年02月17日 · 1 min · Leanku

PHP位运算使用

PHP 位运算介绍 位运算符允许对整型数中指定的位进行求值和操作。 以下是官网的一个介绍。 例子 名称 结果 $a & $b And(按位与) 将把 $a 和 $b 中都为 1 的位设为 1。 $a | $b Or(按位或) 将把 $a 和 $b 中任何一个为 1 的位设为 1。 $a ^ $b Xor(按位异或) 将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。 ~ $a Not(按位取反) 将 $a 中为 0 的位设为 1,反之亦然。 $a « $b Shift left(左移) 将 $a 中的位向左移动 $b 次(每一次移动都表示 “乘以 2”)。 $a » $b Shift right(右移) 将 $a 中的位向右移动 $b 次(每一次移动都表示 “除以 2”)。 详情请点击这里了解。 平常开发需要用位运算吗? 位运算符都是针对整数的二进制数字形式而进行的。...

2023年02月28日 · 1 min · Leanku

PHP标准输入与输出

PHP标准输入与输出 一、PHP STDIN、STDOUT、STDERR简介: STDIN、STDOUT、STDERR命令输入输出流,用于向控制台(linux shell终端、windows cmd终端)输入、输出内容,它们默认是已经打开的,可以直接对他们进行读写操作,它们只能在CLI(command-line interface,命令行界面)模式中使用,在Http模式时,它们是未定义的。 而他们的打开副本php://stdin、php://stdout、php://stderr 也无法输出内容到http浏览器,经测试:写入php://stderr的内容将会输入到默认站点的错误日志中,其它两种无任何效果。 STDIN/STDOUT/STDERR简介:原始流流打开副本描述STDINphp://stdin标准输入(standard input),只读,用于从控制台输入内容; STDOUTphp://stdout标准输出(standard output),只写,用于向控制台输出正常信息; STDERRphp://stderr错误输出(standard error),只写,用于向控制台输出错误信息; 官方推荐使用常量 STDIN、 STDOUT 和 STDERR 来代替它们手动打开的副本封装器php://stdin、 php://stdout 和 php://stderr。 二、PHP STDIN用法: PHP语言中"STDIN"用于从控制台读取内容,遇到此常量或者通过fopen()函数打开php://stdin脚本将会等待用户输入内容,直到用户按下回车键提交。 新建文件demo.php <?php echo "请输入内容:"; $input = fgets(STDIN); echo sprintf("输入的内容为: %s\n", $input); $handle = fopen('php://stdin', 'r'); echo "请输入: "; $stdin = fread($handle, 10); //最多读取10个字符 echo sprintf("输入为: %s\n", $stdin); fclose($handle); //php demo.php 运行代码,键盘输入123,输出结果如下 //请输入内容:123 //输入的内容为: 123 //请输入: 456 //输入为: 456 三、PHP STDOUT用法: PHP语言中STDOUT用于向控制台输出标准信息;向此常量、或者向fopen()函数打开的php://stdout写入的内容将直接输出到控制台的标准输出;标准输出的内容可以用过">“或者"1>“重定向到指定地方,比如文件。 <?php fwrite(STDOUT, "STDOUT写入的正常输出;\n"); $stdout = fopen("php://stdout", "w"); fwrite($stdout, "php://stdout写入的正常输出;\n"); fclose($stdout); // php demo....

2023年01月11日 · 1 min · Leanku

# Carbon(nesbot/carbon)-- PHP 日期时间利器化

Carbon(nesbot/carbon)– PHP 日期时间利器化 一、Carbon介绍 Carbon 是 PHP 中最流行的 日期时间处理库,基于 PHP 原生的 DateTime 类封装,提供 链式操作、易读 API、时区支持 等强大功能。 特点: 链式调用,语义化强 支持日期时间加减、比较、格式化 支持中文等多语言友好显示 可与 Laravel、Hyperf 等框架无缝集成 官方文档:https://carbon.nesbot.com/docs/ 安装:composer require nesbot/carbon 二、基本使用 2.1 获取当前时间 $now = Carbon::now(); // 当前时间,默认系统时区 echo $now; // 2023-09-28 15:30:12 // 指定时区: $nowShanghai = Carbon::now('Asia/Shanghai'); 2.2 日期创建 $dt1 = Carbon::create(2023, 9, 28, 15, 30, 0); // 年, 月, 日, 时, 分, 秒 $dt2 = Carbon::parse('2023-12-31 23:59:59'); $dt3 = Carbon::today(); // 当天 0:00:00 $dt4 = Carbon::tomorrow(); // 明天 0:00:00 $dt5 = Carbon::yesterday(); // 昨天 0:00:00 2....

2022年11月15日 · 2 min · Leanku

Guzzle

Guzzle HTTP 客户端全解析及 PHP 使用与优化 一、介绍 Guzzle 是 PHP 世界中最流行的 HTTP 客户端库之一,用于发送 HTTP/HTTPS 请求并处理响应。 它支持: 同步和异步请求 HTTP/2 中间件机制(类似 Laravel / Hyperf 的管道) 并发请求 请求重试、超时、连接池 Guzzle 常被用于调用第三方 API、微服务接口或爬取网页数据。 官方文档:https://docs.guzzlephp.org 二 、安装 composer require guzzlehttp/guzzle 三、基本使用 3.1 同步 GET 请求 use GuzzleHttp\Client; $client = new Client([ 'base_uri' => 'https://api.example.com', 'timeout' => 5.0, // 超时时间 ]); $response = $client->get('/users/1'); echo $response->getStatusCode(); // 200 echo $response->getBody(); // JSON 或 HTML 3.2 POST 请求与 JSON 数据 $response = $client->post('/users', [ 'json' => [ 'name' => 'John', 'email' => 'john@example....

2022年11月15日 · 2 min · Leanku