分类 php 下的文章

记一次因session文件过多导致服务器node用尽的故事

最近服务器访问量逐步上升,cpu频繁告警,终于到了需要升级的时刻了, 配置已升级了就等待重启生效了。
由于有过重启会要半个小时的经历,所以重启都有点担惊受怕,因配置升级,服务器在1分钟内就重启完成了,瞬间cpu占用就下降了。
然而故事还没有完,第二天,数据库又搞事情了,cpu告警, 这就轻车熟路了升级数据库, 升级很顺利,告警也解除了,然而看了服务器的各项参数,发现了一项异常, 服务器根目录挂载的分区的node 占用将近100%了, 可用数目一直在减少,立刻行动起来, 因为我们用户头像都存了一份在服务器的,起初我以为是到了该清理头像的时候了, 但是进目录一看, 头像数量不足以导致到这个数量级,然后找看是那个目录占用了大量的node。我把我认为可能的文件夹都用

find ./文件夹名称 |wc -l

找了一遍, 最后发现是 php的session存放的目录 存在大量的文件占用了 node。
这里其实能更好理解node的意义, 所谓的node其实就是文件,一个文件对应一个node,硬盘的容量有限,存放文件的数量其实也是有限的, 所有文件数量的大小 没有达到硬盘的容量,但是文件数量达到了,照样写不进去内容。
找到原因后, 然后马上采取行动,恢复node的数量,判断是 session文件没有及时删除:推测应该是访问量大的时候重启了系统没有自动销毁这些文件, 亦或由于大量的访问由于某种原因,导致了无效session文件的堆积,那么只要删除这些无效的session文件 即可。

cd /var/lib/php
find ./session/ -cmin +24 -name "sess_*" -and -size 0 -delete > /dev/null 2>&1
find ./session/ -cmin +1440 -name "sess_*" -delete > /dev/null 2>&1

php的session存放的目录定义在php的配置文件里, 可能和我的不一样。如果有缘人遇到一样的问题, 可以酌情修改下。

php server_name 和http_host 的区别

今天终于知道这2个的区别了
如果你只配置了一个域名,比如 在 config配置文件中 server_name:wuhao.pw那么在

$_SERVER[SERVER_NAME] 和 $_SERVER[HTTP_HOST] 的值应该都是 wuhao.pw

但是如果你 config配置文件中server_name:*.wuhao.pw
那么这个时候 假设访问的域名是 www.wuhao.pw 区别就显现了

$_SERVER[SERVER_NAME] 的值  *.wuhao.pw
$_SERVER[HTTP_HOST] 的值则 www.wuhao.pw

php中获取curl请求的请求头信息及相应头信息

有时候 做 curl 的时候一直获取不到数据
那么可以像浏览器调试 一样看请求的头信息么?

curl_setopt($ch,CURLINFO_HEADER_OUT,true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY,true);

设置上述参数

curl_exec执行后
$info = curl_getinfo($ch);
print_r($info);

即可查看

安装 swoole 报的错 Unable to load dynamic library swoole

由于服务器安装了多个php版本,采用官方文档的 安装命令后, 启用模块后发现报了这个错误提示
Unable to load dynamic library 'swoole'
折腾过程滤过:
最后的解决之道
编译对应版本时 一定要执行 make clean 后 再执行 官方的 安装步骤
再然后 就是 编译对应的版本,要指定对应版本的配置文件
例如:

sudo ./configure --with-php-config=/usr/bin/php-config7.4

PHP 的命令行模式

PHP 的命令行模式中 -r 参数的用法 一直莫不请套路,今天终于明白了
-r --run
使用该参数可以在命令行内运行单行 PHP 代码。无需加上 PHP 的起始和结束标识符(<?php 和 ?>),否则将会导致语法解析错误。

注意:

使用这种形式的 PHP 时,应注意避免和外壳环境进行的命令行参数替换相冲突。

显示语法解析错误的范例

$ php -r "$foo = get_defined_constants();"
Command line code(1) : Parse error - parse error, unexpected '='
这里的问题在于即使使用了双引号 ",sh/bash 仍然实行了参数替换。由于 $foo 没有被定义,被替换后它所在的位置变成了空字符,因此在运行时,实际被 PHP 读取的代码为:
$ php -r " = get_defined_constants();"
正确的方法是使用单引号 '。在用单引号引用的字符串中,变量不会被 sh/bash 还原成其原值。
$ php -r '$foo = get_defined_constants(); var_dump($foo);'
array(370) {
["E_ERROR"]=>
int(1)
["E_WARNING"]=>
int(2)
["E_PARSE"]=>
int(4)
["E_NOTICE"]=>
int(8)
["E_CORE_ERROR"]=>
[...]
如果使用的外壳不是 sh/bash,可能会碰到更多问题。请将碰到的 Bug 向 » https://bugs.php.net/ 报告。注意,当试图将 shell 变量用到代码中或者使用反斜线时仍然很容易碰到问题。
注意:

-r 在 CLI SAPI 中有效,在 CGI SAPI 中无效。

注意:

此选项只用于非常基本的用途。因此一些配置指令(例如 auto_prepend_file 和 auto_append_file)在此模式下被忽略。
更多使用方法 https://www.php.net/manual/zh/features.commandline.php