Console Wars – PHP CLI Libraries 命令行战争 - PHP的终端类库

http://www.sitepoint.com/console-wars-php-cli-libraries/

三大PHP终端类库

每个都zhendui不同用户类型用户喜好提供了不同的方法

  • Symfony console 测试稳定、鲁棒性好、文档丰富、能解决大部分问题 
  • Hoa console 更专业,适合做控制窗口、鼠标、指针等
  • Webmozart console 是最新的库,马上要出稳定版本了,适合那些很快变大的新项目

搭建自己的公开CentOS源

背景:公司的网络实在是有够变态的,有层http代理,没法好好上网,装个linux做实验的时候各种软件下不了,不太懂运维,偶然想到去看局域网里的linux服务器是怎么更新的,果然挖出一个内网的yum源,顺便就想到自己搭建一套http源,从公网里定期同步更新一下,用到的时候就很爽了。

上手:

首先呢,把这个服务器扔到虚拟机里了,远程操作和扩展硬盘会比较容易一些,而且平时挂在那也不会费太多资源。

安装了Centos 6.5

分配两个网卡(一个自动,一个对接局域网)和两块硬盘,其中一个硬盘挂载到/var

找到了国内的高校源 bit、ustc

http://mirror.bit.edu.cn/web/

http://mirrors.ustc.edu.cn/

他们都提供了rsync服务

在linux上安装rsync客户端

我把目录放在/var/www/pub下

依次创建目录层级,只同步我需要的源可以有效减少磁盘占用,不然一个源同步下来我的硬盘就报废了

rsync -avrtH rsync://mirrors.ustc.edu.cn/centos/6/ /var/www/pub/centos/6/
rsync -avrtH rsync://mirrors.ustc.edu.cn/rpmfusion/free/el/ /var/www/pub/rpmfusion/free/el/
rsync -avrtH rsync://mirrors.ustc.edu.cn/rpmfusion/nonfree/el/ /var/www/pub/rpmfusion/nonfree/el/
rsync -avrtH rsync://mirrors.ustc.edu.cn/epel/6Server/x86_64/ /var/www/pub/epel/6Server/x86_64/

同步了几天,同步完成后看了一下虚拟机的硬盘文件还不到100GB,比预想的小很多,分配磁盘时专门划出了200GB呢。

安装apache  yum install -y httpd

关闭selinux  vim /etc/selinux/config selinux=disabled

最后有个软件createrepo可以指定目录生成索引,大家自行百度就知道了

大型网站架构设计学习笔记

最近买了本《大型网站系统与JAVA中间件实践》曾宪杰。
做了这么多年php,为了学习技术,还是只能找java的书籍,不得不说是php开发者的悲哀。
分布式系统基础知识
计算机的五要素CPU、内外存、输入输出设备,分布式系统要逐一对应
线程与进程的执行模式
阿姆达尔定律:多核
互不通信的多线程、共享容器协同的多线程、通过事件协同的多线程、多进程

OSI模型、TCP/IP模型
网络IO实现方式 BIO、NIO、AIO

————————

交易网站基本三部分业务功能:用户、商品、交易
APP server
|
*
APP server + DB server
|
*
APP server * N + DB server
|
*
负载均衡 + APP server *N + DB server +处理session(sitcky、同步、集中存储、cookie based
|
*
数据库读写分离,增加读库
|
*
增加搜索引擎
|
*
增加缓存(页面缓存、数据缓存)
|
*
引入分布式存储系统
|
*
专库专用、数据垂直拆分
|
*
单机数据水平拆分
|
*
应用拆分
按功能拆分
服务化
中间件

替换wordpress 常用公共js库

http://www.bootcdn.cn/

我的wordpress装了七牛云存储的插件,里面可以勾选使用360提供的useso.com的库,其中jquery用的staticfiles.com的cdn,我所处的网络很多网站莫名奇妙被屏蔽,手动更改了插件的内容

这里要赞一下wordpress 在后台可以直接修改代码,太方便了

wordpress gravatar头像不显示的解决方法

function mytheme_get_avatar($avatar) {
$avatar = str_replace(array(“http://www.gravatar.com”,”0.gravatar.com”,”1.gravatar.com”,”2.gravatar.com”),”gravatar.duoshuo.com”,$avatar);
return $avatar;
}
add_filter( “get_avatar”, “mytheme_get_avatar”, 10, 3 );

放到模板函数 functions.php

linux 下安装程序为什么需要重新编译?

linux 下安装程序为什么需要重新编译,直接使用可执行文件不行么?
这个疑问一直以来存在我的脑海中。于是今天搜索了一下。
http://www.jb51.net/article/47457.htm
这篇文章告诉我“编译主要是为了能让软件运行更快”的经验竟然不是真的。

软件需要编译安装的真实理由有如下3点:
1.软件在编译期间需要配置
2.软件需要统一安装路径
3.需要最新的版本

但我认为这些理由都不是理由啊。
1.配置模块我可以在使用过程中配置,扩展,调整
2.统一安装路径,在windows下的傻瓜安装向导里主要就是配置路径,但我没看到统一安装路径需要从头编译的道理,实际上安装完了软件我移动到另外的目录里,调整下配置文件,就希望它能继续运行
3.需要新的版本,大家一边宣称开源可以依靠社区的力量,一边却各自为政,全球linuxer重复编译的时间够造好几次人造卫星了。

于是我看到了这样的解释
http://bbs.csdn.net/topics/330116718

这是由于Linux系统的程序相互信赖造成的。比如某个程序依赖于其它一些库,而且版本也有要求,要想直接用,需要在编译时对信赖关系进行调整。./configure就是起这个作用的。

RPM包,DEB包是二进制了,也有依赖,一般情况下,二进制包只对应着特定的发行版。因为,在特定的发行版中,库之间的信赖关系是固定的。比如想把redhat5.2的rpm包安装到fedora上,就不一定成功。

初学者可以使用某个发行版,就不需要自己编译程序了。直接从官网上下载二进制的发行包就行了。有的发行版有在线安装软件的功能,比如redhat和fedora用的yum,unbuntu用的apt-get等

我深深感受到了开源界的恶意,因为商业应用的windows操作系统上开发的软件,虽然老版本的软件在新版本操作系统下不一定兼容,但是通过新出的编译工具打包编译后可以向下兼容,至少看起来是虽然windows有众多版本,但是在任一版本操作系统下的指定版本编译工具打包后的程序是可以在N个版本操作系统中兼容运行的。

当网上的开源卫士宣称全球大部分web服务器跑着linux,而我看到的是周围小公司仍然在使用略贵一些的windows虚拟主机、VPS托管网站时,我更是深有感触。

我们需要行动起来,建立起一个对社会有用的云服务网站,大V们通过网站可以节省重复在本机编译的时间,运维狗通过网站可以快速获取自己需要的可用二进制包,把工作交给云端,我们喝茶去。

一个小网站的开发上线过程是这样的:
开发 -> 更新网站
一个大型线上网站的开发上线过程是这样的:
开发 -> 提交版本库 -> 生成tag -> 线上自动化测试程序 -> 打包生成增量更新 -> 部署

不论大小网站,一个windows服务器上apache新增模块的过程是这样的:
下载指定版本php_mysql.dll -> 放到指定目录 -> 修改apache配置文件 -> 重启服务
不论大小网站,一个linux服务器上apache新增模块的过程是这样的:
下载指定版本php源码 -> phpize编译生成php_mysql.so -> 放到指定目录 -> 修改apache配置文件 -> 重启服务

那么对于不论用多久windows的人,换台机器,重复操作也是很轻松的一件事;
那么对于不论用多久linux的人,换台机器,重复操作也是很花时间的一件事。

半吊子的危险性——误以为PHP5.3以后取消了$GLOBALS超全局变量

今年之前一直在使用php 5.2做开发,很早前就知道5.2升级5.3是个坎,网上还有很多程序升级到5.3有困难。但作为一个半吊子,居然从来没好好看过升级说明,只知道global啥玩意的不支持了,并想当然的理解成了5.3之后再没有全局变量可用了。

http://php.net/manual/zh/migration53.php

今天下点功夫逐一点一下各个升级特性,放到文末供参考

PHP 5.3.x 的大多数改进对现有代码没有影响。需要注意的是有一些不兼容和新功能,在生产环境中切换 PHP 版本需要先行测试代码。

下面说一下我半吊子想当然以为不能用的功能。

register_globals取消了这个开关
不是说取消了部分global

这个开关开的时候$_POST\$_GET\$xxx、cookie、session数组里的值会注册到对应的变量去
另外取消了一些HTTP_VAR_POST这样的变量
全用简写$_POST这种表示
global $variable; 以及$GLOBALS是在任何版本的php中都可用的

以下是测试程序。

实际环境测试运行发现从5.2、5.3、5.4、5.5、5.6各个版本php表现看都是一致的,没有问题。

另外之前想当然的因素之一也是这个文章闹的。
http://www.hack1990.com/cat_2/1273.html

再回顾以下经典的php自动全局变量漏洞
才明白开启register_globals之后才会有这个问题,php5.4及以后这个开关消失,就再不会有这个问题了

——————————————————————

http://www.haidx.com/win-apache-php5-3-x-fastcgi-zend-guard-loader.html
http://www.php.net/manual/zh/appendices.php

【不向下兼容的变化】
给函数传递了不兼容的参数时将返回 NULL,之前是返回FALSE,但有一些例外,比如函数 get_class() 在出现错误时将会返回 FALSE。
realpath() 现在是完全与平台无关的. 结果是非法的相对路径比如 __FILE__ . “/../x” 将不会工作.
数组函数 natsort(), natcasesort(), usort(), uasort(), uksort(), array_flip(), 和 array_unique() 将不再接受对象作为参数, 在将这些函数应用于对象时, 请首先将对象转换为数组.
函数内 include 或者 require 一个文件时,文件内 将不能使用 func_get_arg(), func_get_args() 和 func_num_args() 函数。
最小的 Windows 支持版本是 Windows XP SP3; Windows 98, ME, 2000 和 NT4 将不再被支持.

【被弃用的 INI 指令】
define_syslog_variables
register_globals
register_long_arrays
safe_mode
magic_quotes_gpc
magic_quotes_runtime
magic_quotes_sybase

【被弃用的函数】
call_user_method() (使用 call_user_func() 替代)
call_user_method_array() (使用 call_user_func_array() 替代)
define_syslog_variables()
dl()
ereg() (使用 preg_match() 替代)
ereg_replace() (使用 preg_replace() 替代)
eregi() (使用 preg_match() 配合 ‘i’ 修正符替代)
eregi_replace() (使用 preg_replace() 配合 ‘i’ 修正符替代)
set_magic_quotes_runtime() 以及它的别名函数 magic_quotes_runtime()
session_register() (使用 $_SESSION 超全部变量替代)
session_unregister() (使用 $_SESSION 超全部变量替代)
session_is_registered() (使用 $_SESSION 超全部变量替代)
set_socket_blocking() (使用 stream_set_blocking() 替代)
split() (使用 preg_split() 替代)
spliti() (使用 preg_split() 配合 ‘i’ 修正符替代)
sql_regcase()
mysql_db_query() (使用 mysql_select_db() 和 mysql_query() 替代)
mysql_escape_string() (使用 mysql_real_escape_string() 替代)
废弃以字符串传递区域设置名称. 使用 LC_* 系列常量替代.
mktime() 的 is_dst 参数. 使用新的时区处理函数替代.

【新参数】
PHP 核心:
clearstatcache() – 新增 clear_realpath_cache 和 filename 参数.
copy() – 新增流环境参数 context.
fgetcsv() – 新增 escape 参数.
ini_get_all() – 新增 details 参数.
nl2br() – 新增 is_xhtml 参数.
parse_ini_file() – 新增 scanner_mode 参数.
round() – 新增 mode 参数.
stream_context_create() – 新增 params 参数.
strstr() 和 stristr() – 新增 before_needle 参数.

json:
json_encode() – 新增 options 参数.
json_decode() – 新增 depth 参数.

【新的全局常量】
__DIR__
__NAMESPACE__
E_DEPRECATED
E_USER_DEPRECATED
INI_SCANNER_NORMAL
INI_SCANNER_RAW
PHP_MAXPATHLEN
PHP_WINDOWS_NT_DOMAIN_CONTROLLER
PHP_WINDOWS_NT_SERVER
PHP_WINDOWS_NT_WORKSTATION
PHP_WINDOWS_VERSION_BUILD
PHP_WINDOWS_VERSION_MAJOR
PHP_WINDOWS_VERSION_MINOR
PHP_WINDOWS_VERSION_PLATFORM
PHP_WINDOWS_VERSION_PRODUCTTYPE
PHP_WINDOWS_VERSION_SP_MAJOR
PHP_WINDOWS_VERSION_SP_MINOR
PHP_WINDOWS_VERSION_SUITEMASK

【新类】
日期/时间:
DateInterval
DatePeriod

Phar:
Phar
PharData
PharException
PharFileInfo

【INI 文件处理改变】
移除了 zend_extension_debug and zend_extension_ts. 使用 zend_extension 指令来加载全部 Zend 扩展.
session.use_only_cookies 默认被设置为 “1”(打开).

【其他改变】
如果会话启动失败, session_start() 现在将返回 FALSE.
getimagesize() 现在支持 icon 文件 (.ico).

【禁用global】
$SERVER_xxx、$HTTP_xxx等变量替换成$_SERVER[‘SERVER_xxx’]

记一次openssl生成证书、私钥、公钥

6a2f856e36fc3562ccf765dced56b2b7
之前跟银联对接时,由于我是用PHP做开发的,比较较真,一开始没有用他们提供的工具去做,绕了点弯路。
第一步就是涉及加解密问题,需要用到私钥公钥,实际上用openssl可以很方便的随意生成,不过命令太多,如果你不是用正确的命令可能得到的文件也相去甚远。

openssl genrsa -out rsa_private_key.pem 1024
生成一个私钥文件,这个文件你自己要保存好,他是后面所有东西的基础,他如果没了整套数据都要换。
openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout
生成一个公钥文件,我们知道加密传输就是靠公钥做加密及验证

如果要对方环境可以验签测试,私钥需要多转换一步
openssl pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt
这样这个新产生的私钥可以发给对方使用

怎么用

ServerA用第一步产生的私钥加密数据传给ServerB,ServerB用第二步产生的公钥做验签
同理,ServerB加密后发数据给ServerA时,SeverA可以用B提供的公钥做验签。