查看PHP-FPM内存占用

1、查看php-fpm进程数量

ps -ef |grep "php-fpm"|grep "pool"|wc -l

2、查看每个php-fpm进程占用内存

ps -ylC php-fpm --sort:rss

3、查看php-fpm平均内存占用

ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

4、查看单个php-fpm进程消耗内存明细

pmap $(pgrep php-fpm) | less

phar中的配置文件路径

直接上代码,在打包过的phar中,可以通过下面代码获取配置文件的路径:

<?php
define('IN_PHAR', boolval(Phar::running(false)));
define('ROOT', IN_PHAR ? dirname(Phar::running(false)) : realpath(__DIR__ . '/..'));
var_dump(IN_PHAR);
var_dump(ROOT);

NGINX + PHP-FPM 优化记录

最近做的 NGINX + PHP-FPM 优化,记录一下,留待后用。

测试环境,8 核 CPU,64G 内存。

1、PHP-FPM 配置文件

listen = 127.0.0.1:9000 修改为 listen = /tmp/php-fpm.sock
listen.backlog 取消注释,并修改值为 102400
pm = dynamic 修改为 pm = static
pm.max_children 的值修改为 200

2、启动多个 PHP-FPM 实例

复制 php-fpm.conf 配置文件

cp php-fpm.conf php-fpm.1.conf

修改复制的 php-fpm.1.conf

listen = /tmp/php-fpm.sock 修改为 listen = /tmp/php-fpm.1.sock

建议启动的 PHP-FPM 实例数量与 CPU 核心数量一致。

3、NGINX 配置文件

worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
worker_rlimit_nofile 204800;
events {
    use epoll;
    worker_connections 204800;
}
upstream phpbackend {
    server unix:/tmp/php-fpm.sock
    server unix:/tmp/php-fpm.1.sock
}
server {
    default backlog = 102400;
    location ~ .php$ {
        fastcgi_pass   phpbackend;
        include        fastcgi_params;
    }
}

4、修改系统打开文件数

打开 /etc/security/limits.conf 文件,添加:

* soft nofile 65535
* hard nofile 65535

修改完成需要重启服务器生效!并可使用下面命令查看是否生效:

ulimit -n

wp cli 的安装使用

推荐安装方式:wget 或 curl

wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar

安装后,可以查看版本等信息

php wp-cli.phar --info

为了方便使用(直接使用wp命令)

chmod +x wp-cli.phar# sudo mv wp-cli.phar /usr/local/bin/wp

版本更新(升级)

wp cli update

macOS 编译 PHP 过程中出现 cannot find openssl’s 的解决

在自己的本子上编译安装 PHP 的过程中,遇到了cannot find openssl’s <evp.h> 的错误,解决办法如下:

brew install openssl

一般来说,问题就这样解决了。。。。

但是,如果还没有解决,那么在 configure 的时候

./configure --with-openssl-dir=/usr/local/Cellar/openssl/1.0.2n

搞定!

macOS Sierra中,为PHP安装RabbitMQ客户端

工作原因需要用到 RabbitMQ 消息队列,于是到 pecl.php.net 上找到了 amqp 扩展,在编译安装的过程中,系统报出需要用到 librabbitmq 这个库,但是网上找了好长时间都找不到合适的源码。于是偶然间尝试了 brew 这么个东西,发现还是挺好的。

自己记录一下,省的日后又不知道怎么办了。。。

安装 librabbitmq :

# brew install rabbitmq-c

安装 amqp 扩展:

# phpizel
# ./configure --with-php-config=/usr/local/php/bin/php-config
# make
# make install

OK了,看一下是否安装成功:

# php --ri amqp

就能够看到 amqp 扩展的版本号以及相关的配置信息了。

让PHP7达到最高性能的几个Tips

本文转发自:http://www.laruence.com/2015/12/04/3086.html

1. Opcache

记得启用Zend Opcache, 因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快, 所以之前测试时期就发生了有人一直没有启用Opcache的事情. 启用Opcache非常简单, 在php.ini配置文件中加入:

zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1

2. 使用新的编译器

使用新一点的编译器, 推荐GCC 4.8以上, 因为只有GCC 4.8以上PHP才会开启Global Register for opline and execute_data支持, 这个会带来5%左右的性能提升(Wordpres的QPS角度衡量)

其实GCC 4.8以前的版本也支持, 但是我们发现它支持的有Bug, 所以必须是4.8以上的版本才会开启这个特性.

3. HugePage

我之前的文章也介绍过: 让你的PHP7更快之Hugepage , 首先在系统中开启HugePages, 然后开启Opcache的huge_code_pages.

以我的CentOS 6.5为例, 通过:

$ sudo sysctl vm.nr_hugepages=512

分配512个预留的大页内存:

$ cat /proc/meminfo | grep Huge
AnonHugePages: 106496 kB
HugePages_Total: 512
HugePages_Free: 504
HugePages_Rsvd: 27
HugePages_Surp: 0
Hugepagesize: 2048 kB

然后在php.ini中加入:

opcache.huge_code_pages=1

这样一来, PHP会把自身的text段, 以及内存分配中的huge都采用大内存页来保存, 减少TLB miss, 从而提高性能.

4. Opcache file cache

开启Opcache File Cache(实验性), 通过开启这个, 我们可以让Opcache把opcode缓存缓存到外部文件中, 对于一些脚本, 会有很明显的性能提升.

在php.ini中加入:

opcache.file_cache=/tmp

这样PHP就会在/tmp目录下Cache一些Opcode的二进制导出文件, 可以跨PHP生命周期存在.

5. PGO

我之前的文章: 让你的PHP7更快(GCC PGO) 也介绍过, 如果你的PHP是专门为一个项目服务, 比如只是为你的Wordpress, 或者drupal, 或者其他什么, 那么你就可以尝试通过PGO, 来提升PHP, 专门为你的这个项目提高性能.

具体的, 以wordpress 4.1为优化场景.. 首先在编译PHP的时候首先:

$ make prof-gen

然后用你的项目训练PHP, 比如对于Wordpress:

$ sapi/cgi/php-cgi -T 100 /home/huixinchen/local/www/htdocs/wordpress/index.php >/dev/null

也就是让php-cgi跑100遍wordpress的首页, 从而生成一些在这个过程中的profile信息.

最后:

$ make prof-clean
$ make prof-use && make install

这个时候你编译得到的PHP7就是为你的项目量身打造的最高性能的编译版本.

暂时就这么多吧, 以后想起来再加, 欢迎大家尝试, thanks

微信支付退款过程中出现“curl出错,错误码:52”的解决办法

在微信支付相关的开发过程中,会涉及到微信的退款实现,但在调用SDK的WxPayRefund类时,会遇到“curl出错,错误码:52”的问题,解决方法如下:

打开“lib/Wxpay.api.php”文件,并找到下面两行代码:

const SSLCERT_PATH = '../cert/apiclient_cert.pem';
const SSLKEY_PATH = '../cert/apiclient_key.pem';

将“SSLCERT_PATH”和“SSLKEY_PATH”的路径替换为服务器的绝对路径,保存后上传到服务器。

P.S. 我使用的是PHP版本的SDK,如果你使用的是其他版本的SDK,请自己找到对应的位置,自行修改。

WordPress 的定时任务 WP-Cron

我们知道 Linux 服务器有个 crontab 的功能,可以让你定时去执行一些作业,但是并不是每个人都对 Linux 系统很熟悉,并且不是所有的主机管理面板都有 crontab 这个栏目。其实 WordPress 本身也有类似于 crontab 的功能,让你可以直接在 WordPress 后台执行安排好任何,定时执行。

WP-Cron 功能是基于页面浏览的,所以时间上不会那么准确,会相差一些,但是随着博客流量增大,这个准确度会越来越高的。比如 WordPress 本身的文章预发布功能就是基于 WP-Cron 实现的。WP-Cron 还定义一套完整的 API,让开发者可以自己通过插件的方式定义一些作业定时执行,需要开发者定义好任务执行的频率和回调函数。 继续阅读 →