作者归档:zhiquan

WordPress 使用SMTP

wordpress 发邮件默认使用系统的mail,mail发送的邮件经常被直接放垃圾箱或直接屏敝掉,使用SMTP是另一种简单的选择。

配置

在主题的function.php中加入


add_action('phpmailer_init','mail_init');
function mail_init(&$mail){
	$mail->isSMTP();
	$mail->Host = 'smtp.163.com';
	//$mail->SMTPDebug = 4;
	$mail->SMTPAuth = true;
	$mail->From = 'test@163.com';
	$mail->Username = 'test@163.com';
	$mail->Password = 'password';
}

 

WordPress rewrite

Apache

.htaccess


# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Nginx


location / {
        try_files $uri $uri/ /index.php?$args;
}

# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

 

php facst-cgi 502 bad gate way

当nginx + PHP 使用 unix socket 配置时

location ~ [^/]\.php(/|$)
{
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
nginx 必须要有 /tmp/php-cgi.sock 套接字文件有读写权限,不然会报 502 bad gateway 的错误。

一般php-fpm的用户与nginx为同一用户,这样可减少权限的问题。

slf4j与common-logging

相通点:

  • 两者都为通用日志接口

异同:

  • slf4j 静态绑定日志(编译时绑定)
  • jcl 动态绑定(动态绑定跟类加载器有关,会有一定的问题)

slf4j 解决 jcl 以下两点问题

解决加载问题

Commons Logging存在的ClassLoader问题,即当服务器本身引入Commons Logging时,如果在服务器中载入Commons Logging包,则该包中的类由服务器的ClassLoader加载,从而在加载Log4J中的Logger类时会出现ClassNotFoundException,因为服务器中的ClassLoader没法找到Web App下的jar包。对于父ClassLoader优先的类加载机制来说,目前的一个解决方案是使用commons-logging-api-1.1.1.jar包,该包的Log实现类只包含Jdk14Logger、SimpleLog、NoOpLog三个类,因而在加载这几个类时会使用Web App中的Commons Logging包,从而解决ClassNotFoundException的问题,然而这种方式对那些实现Child ClassLoader First的服务器来说,由WebClassLoader父ClassLoader加载的类在使用日志时会存在问题,因为它们的Log接口由加载自身类的ClassLoader加载,而Log4JLogger类却由WebClassLoader加载。

性能优一些

在使用Commons Logging时,我们经常会看到以下方法的写法:
if (logger.isDebugEnabled()) {
logger.info(“Loading XML bean definitions from ” + encodedResource.getResource());
}

存在isDebugEnabled()的判断逻辑是为了在避免多余的字符串拼接,即如果不存在isDebugEnabled()判断,即使当前日志级别为ERROR时,在遇到logger.info()调用时,它还会先拼接日志消息的字符串,然后进入该方法内,才发现这个日志语句不用打印。而这种多余的拼接不仅浪费了多余的CPU操作,而且会增加GC的负担。SLF4J则提供以下的方式来解决这个问题:

logger.info(“Loading XML bean definitions from {}”, encodedResource.getResource());

Java环境变量

主要配置

  • 配置JAVA_HOME
  • 配置PATH
  • 配置CLASS_PATH

如:

在/etc/profile下增加或在~/.bash_profile下增加
export JAVA_HOME=/usr/share/jdk1.6.0_14
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

jstl 中 c:set 的 scope 作用域要注意的问题

在jstl使用c:set 时,去设置一个变量,需要注意 变量的 scope 问题。设置一个值的行为,相当于,变量已经存在,则更新变量的值,不存在则建增值。

在项目中遇到这样的情况,已经设置了一个session级别的变量a(scope=session),当前页需要新建一个变量,恰好名称也为a。

<c:set var=”a” value=”b”/>

c:set 会首先查找变显是否存在,当未指定 scope 的情况下,查找的顺序为:page->request->session->application,一直往上找,直到找到为止。项目中遇到恰好在session级时找到同名变量存在,c:set 就会把session级的变量 更新了,但实际项目是在当前页创建一个变,在这情况下,就会产生意想不到的问题。

所以使用c:set的话,最好明确指定scope 避免不必要的错误。

Vagrant的安装使用

功能

Vagrant是一个建立和管理虚拟机(VirtualBox、VMware、AWS)的软件。

  • 帮助工作流程标准化、自动化。
  • 降低开发环境的安装配置时间。
  • 去除“我的本地环境”的问题。

解决的问题

Vagrant基于行业标准及单一的一致的工作流程提供易于配置,可重复性和便携式工作环境,以帮助团队最大限度地提高生产力和灵活性。

  • 统一的开发环境。
  • 开发、生产环境(软件环境)一致。
  • 对部署环境管理操作的便捷性。

安装

要安装Vagrant,首先为您的系统找到合适的包并下载它。Vagrant 打包为一个可直接运行安装的安装包。运行安装程序安装后,将自动把Vagrant添加到您的系统路径。使其可在终端使用Vagrant的相关操作命令。

Vagrant 提供 windows、linux、mac 等安装包下载,选择对应系统的安装包下载安装。

下载 Mac安装包  CentOS 64-bit安装包  Windows安装包

安装完后,可在终端命令行下验证Vagrant是否可用:

$ vagrant
Usage: vagrant [options] <command> [<args>]

-v, –version Print the version and exit.
-h, –help Print this help.

出现Vagrant的使用说明,即安装成功。

 

 

PHP Composer 的安装

当前使用国内的安装文件(https://install.phpcomposer.com/installer) 官方安装文件为(https://getcomposer.org/installer)官方安装文件经常下载不了,建议使用国内的安装文件。

环境需求

PHP 5.3.2+

php 是在配置了path下执行的,未配置path的,需要完整的php路径。

下载install文件

命令行下载:

方式1:

php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"

方式2:

wget -O composer-setup.php https://install.phpcomposer.com/installer

方式3:

curl -sS -o composer-setup.php  https://install.phpcomposer.com/installer

浏览器或下载软件下载 :

下载地址:https://install.phpcomposer.com/installer

安装install

安装到当前目录:

php composer-setup.php

安装到指定目录(当前bin目录下):

php composer-setup.php –install-dir=bin 

安装时指定名称

php composer-setup.php –indstall-dir=bin –filename=composer

 全局安装

1、把安装目录加入到系统path中。

2、把composer.phar(–filename) 复制到系统path的目录下。

windows 下新建bat

C:\bin>echo @php “%~dp0composer.phar” %*>composer.bat

把composer.bat 复制到系统的path下,则全局可用。

注意当前环境下php的路径。

运行

php  composer.phar (安装到当前目录 )

全局安装

compsoer -v (显示版本)

定时更新composer

composer selfupdate

WordPress 短标签shortcode的使用

短标签更多是处理数据的调用,可灵活的使用在多个地方上面。当有需对某些数据进行调用时,即可考虑使用短标签功能。

形式

[mycode]
[mycode foo=”bar” id=”123″ color=”red” something=”data”] 标签带有属性的
[mycode]Some Content[/mycode] 标签还有内容
[mycode]<p><a href=”http://example.com/”>HTML Content</a<>/p>[/mycode] 标签内容可为html代码
[mycode]Content [another-shotcode] more content[/mycode] 标签嵌套
[mycode foo=”bar” id=”123″]Some Content[/mycode] 标签有属性及内容

标签的形式基本为以上的形式。

应用场景

标签用在以下场景

  • 直接插入到内容中使用   [my_shortcode]
  • 主题直接调用 <?php echo do_shortcode(“[my_shortcode]”); ?>
  • 侧边栏widget中使用。function.php 中增加 add_filter(‘widget_text’, ‘do_shortcode’); 然后添加一个文本widget,内容填入标签即可。
  • 文章的摘要中使用。function.php 中增加 add_filter( ‘the_excerpt’, ‘do_shortcode’);然后在文章摘要中填入标签即可。
  • 评论内容中使用。function.php增加 add_filter( ‘comment_text’, ‘do_shortcode’ ); 然后评论的内容中填入标签即可。

 

示例

实现调用最新文章数据的功能,定义标签为 [latest-posts showposts=”5″]

在function.php 增加


function latest_posts_function($attr,$content=null,$tagname) {
//对标签属性处理,属性只有showposts,且默认值为1,当使用标签时没有属性,则使用默认属性值。
$params = shortcode_atts(array('showposts'=>5),$attr);
query_posts(array('orderby' => 'date', 'order' => 'DESC' , 'showposts' => $params['showposts']));
$return_string = '<ul>';
if (have_posts()) :
while (have_posts()) : the_post();
$return_string .= '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
endwhile;
endif;
$return_string .= '</ul>';
wp_reset_query();
return $return_string;
}
add_shortcode('latest-posts', 'latest_posts_function');

标签功能添加完。

在需要使用的地方增加标签。如发布文章时,在内容 填入[latest-posts],这样就完成了对短标签的调用。其他形式的调用参考上面提到的调用方式。

Linux SSH免输入密码登录

场景

linux主机A ssh登录到 linux 主机B  ,免输入主机B的密码,直接登录到主机B上。

原理

利用ssh 的 rsa 认证登录。

实现

确认ssh服务开始rsa认证

确认主机B的ssh服务的rsa认证配置(/etc/ssh/sshd_config)是开启的。
RSAAuthentication yes
PubkeyAuthentication yes

主机A生成rsa密钥对

[root@hostA ~]# ssh-keygen -t rsa -P ”

-P表示密码,-P ” 就表示空密码,也可以不用-P参数,这样就要三车回车,用-P就一次回车。
该命令将在/root/.ssh目录下面产生密钥对id_rsa(私钥)和id_rsa.pub(公钥)。

复制主机A的id_rsa.pub(公钥)至主机B上

[root@HostA ~]# scp /root/.ssh/id_rsa.pub root@192.168.1.101:/root/.ssh/hosta_id_rsa.pub
root@192.168.1.101’s password:

然后登录主机B,确认/root/.ssh目录下是否已经存在文件ssh rsa 认证文件 authorized_keys,存在则:

[root@HostB ~]#cat hosta_id_rsa.pub >> $HOME/.ssh/authorized_keys

将主机A的公钥添加至认证文件中。

不存在authorized_keys 文件 则:

[root@HostB ~]#mv hosta_id_rsa.pub $HOME/.ssh/authorized_keys

[root@HostB ~]#chmod 600 $HOME/.ssh/authorized_keys

把主机A的公钥设置为认证文件,具权限改为600(必须600)

注:当前示列中主机B的用户为root用户,其他用户则对应相应用户的目录。

免密码登录是通用rsa密钥对认证,示例中为linux主机A,换成其他的客户端也是同样的原理。生成密钥对进行认证登录的。