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 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,让开发者可以自己通过插件的方式定义一些作业定时执行,需要开发者定义好任务执行的频率和回调函数。 阅读更多

wordpress添加重写规则,构建新页面

添加翻译规则。首先我们前面介绍了url的翻译规则,我们要往翻译规则中添加一条自己的翻译规则

add_action('generate_rewrite_rules', 'hliang_rewrite_rules' );
/**********重写规则************/
function hliang_rewrite_rules( $wp_rewrite ){
	$new_rules = array(    
		'my-account/?$' => 'index.php?my_custom_page=hello_page',
	); //添加翻译规则
	$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
	//php数组相加   
}

添加 $public_query_vars

/*******添加query_var变量***************/
add_action('query_vars', 'hliang_add_query_vars');
function hliang_add_query_vars($public_query_vars){
	$public_query_vars[] = 'my_custom_page'; //往数组中添加添加my_custom_page

	return $public_query_vars;
}

添加模板载入规则

//模板载入规则
add_action("template_redirect", 'hliang_template_redirect');
function hliang_template_redirect(){
	global $wp;
	global $wp_query, $wp_rewrite;

	//查询my_custom_page变量
	$reditect_page =  $wp_query->query_vars['my_custom_page'];
	//如果my_custom_page等于hello_page,则载入user/helloashu.php页面
	//注意 my-account/被翻译成index.php?my_custom_page=hello_page了。
	if ($reditect_page == "hello_page"){
	    include(TEMPLATEPATH.'/user/helloashu.php');
	    die();
	}
}

更新重写规则

/***************激活主题更新重写规则***********************/
add_action( 'load-themes.php', 'hliang_flush_rewrite_rules' );
function hliang_flush_rewrite_rules() {
	global $pagenow, $wp_rewrite;
	if ( 'themes.php' == $pagenow && isset( $_GET['activated'] ) )
		$wp_rewrite->flush_rules();
}

OK,到了这里,到后台重新激活你的主题,就能看到前面图示的效果了。