让FPM以root用户运行

fpm默认是不能以root用户运行的,会报:
ERROR: [pool www] please specify user and group other than root

如果有特殊原因,需要以root用户运行,需要修改配置,以让fpm支持以root用户的方式运行fpm
vim /lib/systemd/system/php-fpm.service
把:
ExecStart=/usr/sbin/php-fpm –nodaemonize
修改成:
ExecStart=/usr/sbin/php-fpm -R –nodaemonize

改完后,需要执行:
systemctl daemon-reload
以生效修改

再执行,重启fpm进程
systemctl restart php-fpm

如果之前的fpm是手动运行的,需要以发送Linux信号的方式停止fpm服务,如果开启的fpm进程较多,要多等一会儿,等子进程完了再systemctl start php-fpm,不然会出现端口被占用,无法启动的情况
kill -SIGKILL [fpm master的进程号]

正则手记

这几个老是容易忘记

  • 在多个字符串中选择一个字符串匹配
    111(?:abc|def)222
  • 只匹配hello php和java中的hello, 不匹配hello python中的hello
    hello (?=php|java)
  • 只匹配除 hello python和javascript外的其它串中的hello
    hello (?!python|javascript)
  • 只匹配dan或john is a good man中的is a good man
    (?<=dan|john) is a good man
  • 只匹配除dan和john以外中的is a good man
    (?<!dan|john) is a good man 

 

CURL报”426 Unsupported SSL protocol TLSv1.2″时,升级curl, openssl, php-curl

服务器上php 5.6调用curl时,返回”426 Unsupported SSL protocol TLSv1.2, Upgrade to TLSv1.3 is required”.

用”openssl ciphers -V | column -t“ 查看,原来是openssl不支持TLSv1.3,需要升级,但由于PHP的CURL扩展是调用的Curl,Curl再调用的openssl,所以需要把openssl和curl升级,把php-curl重新编译.

思路是重新安装openssl和curl到新目录,以防止破坏以前的依赖,不然就容易翻车。

一、升级openssl

去https://www.openssl.org/source/下载v1版本,因为我是php5,系统也比较老,下载v1保险一些。
./config –prefix=/usr/local/openssl
make
make install

完成后测试下: /usr/local/openssl/bin/openssl version,
可能会报错:
bin/openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
建立软链
ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

二、升级CURL

去官网下载最新的curl,按标准安装方法,把curl安装到/usr/local/curl目录,需要指定上面新的openssl目录
./configure –prefix=/usr/local/curl –with-ssl=/usr/local/openssl

完成后可以测试一下,是否可以下载TLSv1.3的URL内容,如果没有问题就到三步

三、重新编译php-curl

去PHP官网下载和你当前版本一样的原码,解压,注意要指定新的curl目录
/root/software/php-5.6.40/ext/curl
phpize
./configure –with-curl=/usr/local/curl/
make
make install

如果是php8的curl扩展到这一步要报错:

checking for cURL support… yes, shared
checking for libcurl >= 7.29.0… no
configure: error: Package requirements (libcurl >= 7.29.0) were not met:

No package ‘libcurl’ found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables CURL_CFLAGS
and CURL_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

要这样才可以
export PKG_CONFIG_PATH=/usr/local/curl/lib/pkgconfig

报下面的错误的话要这样:
libtool: compile: cc -I. -I/root/software/php-8.3.1/ext/curl -I/root/software/php-8.3.1/ext/curl/include -I/root/software/php-8.3.1/ext/curl/main -I/root/software/php-8.3.1/ext/curl-I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib -I/usr/local/curl/include/ -DHAVE_CONFIG_H -g -O2 -D_GNU_SOURCE -DZEND_COMPILE_DL_EXT=1 -c /root/software/php-8.3.1/ext/curl/interface.c -MMD -MF interface.dep -MT interface.lo -fPIC -DPIC -o .libs/interface.o
/root/software/php-8.3.1/ext/curl/interface.c:58:28: fatal error: zend_smart_str.h: No such file or directory
./configure –with-curl=/usr/local/curl –with-php-config=/opt/remi/php83/root/bin/php-config

报下面的错误的话要这样make:
/root/software/php-8.3.1/ext/curl/multi.c: In function ‘curl_multi_get_gc’:
/root/software/php-8.3.1/ext/curl/multi.c:572:2: error: ‘for’ loop initial declarations are only allowed in C99 mode

或者修改代码,把那一行的行内定义提出去,或者用下面的命令编译:
make CFLAGS=-std=c99

最后测试一下:
php -r “phpinfo();” | grep cURL
输出
cURL support => enabled
cURL Information => 8.2.1

没有问题,如果是fpm,要重启fpm。

其它的问题
如果在编译的时候出现很多语法错误,有可能是系统安装了多个php版本,引用到了错误的php头文件,在.configure的时候,要指定–with-php-config
安装好扩展之后,但加载扩展如果出现下面的错误,是因为php扩展和curl的版本不对,需要下载新的curl版本重新安装。
PHP Warning: PHP Startup: Unable to load dynamic library ‘curl’ (tried: /opt/remi/php83/root/usr/lib64/php/modules/curl (/opt/remi/php83/root/usr/lib64/php/modules/curl: cannot openshared object file: No such file or directory), /opt/remi/php83/root/usr/lib64/php/modules/curl.so (/opt/remi/php83/root/usr/lib64/php/modules/curl.so: undefined symbol: curl_easy_escape)) in Unknown on line 0

nginx+php-fpm出现504的问题处理

nginx犯错误日志报:
2023/09/04 19:57:24 [error] 42010#42010: *1327 upstream timed out (110: Connection timed out) while reading response header from upstream, client: xxxx, server: localhost, request: “GET /xxxx HTTP/1.1”, upstream: “fastcgi://127.0.0.1:9082”, host: “xxx.xxx.xxx.xxx:3000”, referrer: “http://xxxx”

页面报504

检查以下部分:
1. php.ini的: max_execution_time设置
2. 检查fpm配置文件的 request_terminate_timeout 设置
3. 检查nginx的配置:
fastcgi_connect_timeout 3000s;
fastcgi_read_timeout 3000s;

怎么控制浏览器的Referer?

一、怎么禁止浏览器发送Referer头?

1、在HTML的<head>标签中添加以下meta标签:<meta name=”referrer” content=”no-referrer”>
2、用HTTP头中的”Referer-Policy”字段,可以在HTTP响应头中设置这个字段来控制浏览器如何发送referrer信息。例如:Referrer-Policy: no-referrer

2、怎么控制Referer的值

不能随意指定Referer值,但可以通过下面的代码把域名值作为Referer发送,而不是完全的URL: <meta content=”origin” name=”referrer”>

三、在HTML的Meta中,控制Referer的Meta主要有以下几种

1、<meta content=”no-referrer” name=”referrer”>:不发送Referer信息,但是不包括本站内的链接。

2、<meta content=”no-referrer-when-downgrade” name=”referrer”>:默认选项,https页面发https的referer,http页面发http的referer,不向不安全的地址发送referer。

3、<meta content=”origin” name=”referrer”>:只发送当前文档的来源(即Origin Header)。

4、<meta content=”origin-when-cross-origin” name=”referrer”>:当前文档和目标URL的域名相同,发送当前文档的完整URL,否则只发送当前文档的来源。

5、<meta content=”unsafe-url” name=”referrer”>:发送完整的URL,包括https到http的跨域跳转。

ImageMagick常用操作-增加水印

convert -fill black -font “宋体-简-粗体” -stroke white -pointsize 200 -gravity north -draw ‘text 0,0 “文字”‘ “原文件.PNG” “marked/新文件.PNG”

Mac下默认是不支持中文的,查看支持哪些字体
convert -list font

#gravity : 组合的图片的位置,取值:
southwest: 左下
southeast: 右下
northwest: 左上
northeast: 右上
south : 底部居中
west : 左侧居中
north: 顶部居中
east: 右侧居中

改尺寸

convert -resize 600×600 src.jpg dst.jpg

MySQL大表改结构(pt-online-schema-change)

yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm

yum install percona-toolkit

https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html

pt-online-schema-change –user=xxx –password=”xxx” –host=”xxx” –alter=”ADD bbb INT NULL DEFAULT ‘0’” D=dmp_main,t=test –execute

MySQL优化中一些不常用的技巧

在Join中强制使用索引

SELECT
    fieldA, fieldB
FROM `表A` o force index( `indexA`, `indexB`) 
inner join `表B` a force index(indexB)
on o.aa=a.bb 
WHERE `xx` = 'xx'
and xx_id in (1,2,3);

在SQL中忽略索引

SELECT 
    fieldA, fieldB 
FROM `表A` o force index( `indexA`) 
inner join `表B` a force index(indexB) 
on o.aa=a.bb 
WHERE 
    `xx` = 'xx' 
    and xx_id in (1,2,3);

在使用Inner Join的时候(直接用Join也是),MySQL会自动决定以哪一个表为标准表进行关联,有时候我们希望能按我们写的顺利进行关联时,就可以用STRAIGHT_JOIN。

SELECT 
    TABLE1.FIELD1, TABLE2.FIELD2 
FROM TABLE1 STRAIGHT_JOIN TABLE2 
WHERE XX=XX

其它的优化

关闭查询缓冲 SQL_NO_CACHE
SELECT SQL_NO_CACHE field1, field2 FROM TABLE1;

强制查询缓冲 SQL_CACHE
SELECT SQL_CALHE * FROM TABLE1;

优先操作 HIGH_PRIORITY
HIGH_PRIORITY可以使用在select和insert操作中,让MYSQL知道,这个操作优先进行。
SELECT HIGH_PRIORITY * FROM TABLE1;

滞后操作 LOW_PRIORITY
LOW_PRIORITY可以使用在insert和update操作中,让mysql知道,这个操作滞后。
update LOW_PRIORITY table1 set field1= where field1= …

延时插入 INSERT DELAYED
INSERT DELAYED INTO table1 set field1= …
INSERT DELAYED INTO,是客户端提交数据给MySQL,MySQL返回OK状态给客户端。而这是并不是已经将数据插入表,而是存储在内存里面等待排队。当mysql有 空余时,再插入。另一个重要的好处是,来自许多客户端的插入被集中在一起,并被编写入一个块。这比执行许多独立的插入要快很多。坏处是,不能返回自动递增 的ID,以及系统崩溃时,MySQL还没有来得及插入数据的话,这些数据将会丢失。

强制使用临时表 SQL_BUFFER_RESULT
SELECT SQL_BUFFER_RESULT * FROM TABLE1 WHERE …
当我们查询的结果集中的数据比较多时,可以通过SQL_BUFFER_RESULT.选项强制将结果集放到临时表中,这样就可以很快地释放MySQL的表锁(这样其它的SQL语句就可以对这些记录进行查询了),并且可以长时间地为客户端提供大记录集。

分组使用临时表 SQL_BIG_RESULT和SQL_SMALL_RESULT
SELECT SQL_BUFFER_RESULT FIELD1, COUNT(*) FROM TABLE1 GROUP BY FIELD1;
一般用于分组或DISTINCT关键字,这个选项通知MySQL,如果有必要,就将查询结果放到临时表中,甚至在临时表中进行排序。SQL_SMALL_RESULT比起SQL_BIG_RESULT差不多,很少使用。