分类目录归档:PHP

为 Mac OS X 系统下的 PHP 增加 mCrypt

现在Laravel、Opencart等软件都是需要PHP支持mCrypt了,
可是Mac OS X 默认的PHP版本是不支持mCrypt的,
使用homebrew可以像yum或apt-get那样快速的安装它。

步骤如下:

# 安装 Command Line Tools
xcode-select --install

# 安装 homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew doctor
brew update

# 添加源, 因为默认源没有php55-mcrypt
brew tap homebrew/dupes
brew tap homebrew/versions
brew tap homebrew/homebrew-php

# 安装 autoconf
brew install autoconf

# 安装 mcrypt
brew install autoconf mcrypt

# 安装 php55-mcrypt 同时会安装最新版本的PHP5.5
brew install php55-mcrypt

# 查看安装到哪里了
brew info php55-mcrypt

# 现在php55-mcrypt安装好了,但是phpinfo()的时候应该没有mcrypt,还需要修改libphp5.so的路径
# 编辑 /etc/apache2/httpd.conf
LoadModule php5_module /usr/local/opt/php55/libexec/apache2/libphp5.so

# 现在php.ini使用的是
/usr/local/etc/php/5.5/php.ini
不是默认的
/etc/php.ini.default

在 Mac OS X 系统下配置 Apache MySQL PHP phpMyAdmin 环境

我用的Mac系统版本是OS X 10.10.1,其实系统中已经默认安装了Apache和PHP,只需要再安装一个MySQL就行了。

一、启动Apache

sudo apachectl start

访问 http://localhost/ 会看到Apache已经成功启动。
web root 的默认目录为 LibraryWebServerDocuments

二、配置Apache

编辑httpd.conf文件修改为自定义目录:

sudo vi /etc/apache2/httpd.conf
DocumentRoot "/Users/UserName/Sites"
<Directory "/Users/UserName/Sites">

把libphp5.so的注释删掉

LoadModule php5_module libexec/apache2/libphp5.so

把虚拟主机配置文件的注释删掉

Include /private/etc/apache2/extra/httpd-vhosts.conf

编辑虚拟主机配置文件

sudo vi /etc/apache2/extra/httpd-vhosts.conf
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot "/Users/UserName/Sites/localhost/"
ServerName localhost
ErrorLog "/private/var/log/apache2/localhost-error_log"
CustomLog "/private/var/log/apache2/localhost-access_log" common
<Directory "/Users/UserName/Sites/localhost/">
Options Indexes
AllowOverride None
Allow from all
</Directory>
</VirtualHost>

三、安装MySQL

我下载的是MySQL 5.5,个人觉得5.6的很多特性在laptop上用不到,而且占空间多。
当然如果是多核服务的话,强烈建议使用5.6。
安装后在 System Preferences 里面会出现 MySQL 的控制面板,进去启动它。
默认的root用户是没有密码的,修改密码

/usr/local/mysql/bin/mysqladmin -u root password your-new-password

四、安装phpMyAdmin

我使用的是phpMyAdmin 4.3.3版本,这里有个大坑,
在我尝试登录phpMyAdmin的时候,总是提示我
Cannot log in to the MySQL server
这个错误太笼统,造成不能登录MySQL的可能性很多,于是用排除法先用命令行登录,成功,
然后用NaviCat,也没问题,由此判断为phpmyadmin本身的问题,
换成phpMyAdmin 3.5版本,尝试登录后提示
#2002 Cannot log in to the MySQL server
原来错误代码是#2002,Google搜到这篇文章,
http://blog.ryantremaine.com/2011/03/2002-cannot-log-in-to-mysql-server.html
编辑phpMyAdmin的config.inc.php文件,修改

$cfg['Servers'][$i]['host'] = 'localhost';

$cfg['Servers'][$i]['host'] = '127.0.0.1';

问题解决。:)

Zend Studio 9.0.1 使用感受及破解注册方法

Zend Studio 9 发布已经有一段时间了,今天抽空研究一下。

先看官网的介绍:http://www.zend.com/en/products/studio/studio-whats-new

新特性包括:
1. Git and GitHub support (Git和GitHub的支持)
2. Deep cloud integration (深度云集成)
3. Creation of deployment packages (部署包的创建)
4. Much faster startup and running, much smaller footprint (更快的启动和运行速度,更少的资源占用)

注意亮点在第四条,官网上说,启动速度提高了67%,磁盘暂用率降低了40%。
当我看到这里,瞬间我就流泪了。对于现在正用的ZS8(优化后),
每次启动2分钟,内存占用500M,如果再开一个firebug,伤不起啊伤不起。
ZS9的出现,就像黑夜中的烛光,黎明中的曙光,乌云散尽的太阳,光芒万丈哇。

20120111 update
geekso.com上面找到了最新的破解方法:
1. 下载ZendStudio9.0.1破解文件:com.zend.php.core_9.0.1.201112141951.jar
2. 复制到plugins目录下覆盖同名文件。
3. 启动ZS9,输入License Key:
34E606CF10C3E4CF202ABCEAA9B0B7A64DD2C5862A514B944AAAB38E3EB8A5F2CD735A2AB4CF9B952590EFA62BA0AB2B3E5D99C33C55309EE143165AC7F1817D626574615F3B32312F31312F323031313B392E303B3030313B313B3330
4. 查看菜单 Help -> About Zend Studio 过期时间变为9999年说明破解成功。

php+css让缩略图显示图片的中心部分

如果原始图片为长方形,让图片缩略图只截取图片中心的正方形部分显示。

分为两部分操作,以缩略图为200px的正方形为例,因缩略图访问次数较多,为节省流量,用php生成一个图片长宽最小不小于200px的保持原图片长宽比的小图:

$thumb_width = $thumb_height = 200;

// Get new dimensions
list($width, $height) = getimagesize($filename);

// If height is longer than width, height increase, width unchanged.
if ($width < $height)
{
$thumb_height = ($thumb_width / $width) * $height;
}
else
{
$thumb_width = ($thumb_height / $height) * $width;
}

// Resample
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $thumb_width, $thumb_height, $width, $height);

// Output
imagejpeg($image_p, null, 100);

第二步,用CSS显示缩小后图片的中间部分:

) no-repeat 50% 50%; max-height:200px; max-width:200px;”>

如果有更好的方法,欢迎回复。

Zend Framework框架最小化类库

使用Zend Framework半年多了,越发觉得它设计巧妙使用灵活,
团队协作用Zend Framework开发中型项目真是很惬意的事情。
但是总能明显感觉每次请求比codeigniter之类的轻量级框架慢,消耗的系统资源也多。
于是抽空跟踪了一下Zend Framework的核心文件,
加载了一个Zend/Application.php竟然会牵连10个模块,
也就是说,在配置好数据库,不加载任何类库的情况下,
初始化一次请求至少需要加载10个类库。

即 Zend Framework 框架的最小化类库。
清单如下:
Application
Config
Controller
Db
Exception
Filter
Layout
Loader
Registry
Uri
View

这些类库一共需要284个文件,至少占用空间2M,
如果这些文件全部读入内存,那得消耗多少内存和资源?

PHP中 HTTP_HOST 和 SERVER_NAME 的区别

最近在开发站群软件,用到了根据访问域名判断子站点的相关问题。PHP获取当前域名有两个变量 HTTP_HOST 和 SERVER_NAME,我想知道两者的区别以及哪个更加可靠。

首先我想说,百度上那些转来转去的文章都是扯淡!
有说相同的,有说不同的,都没说明原因,没经过验证就互相转来转去的,浪费观众时间。

下面说说本人经过亲自验证 + 查阅官方文档 + 官方BUG列表 + 官方邮件列表 + sitepoint + webmasterworld + google的总结:

相同点:
当满足以下三个条件时,两者会输出相同信息。
1. 服务器为80端口
2. apache的conf中ServerName设置正确
3. HTTP/1.1协议规范

不同点:
1. 通常情况:
_SERVER[“HTTP_HOST”] 在HTTP/1.1协议规范下,会根据客户端的HTTP请求输出信息。
_SERVER[“SERVER_NAME”] 默认情况下直接输出apache的配置文件httpd.conf中的ServerName值。

2. 当服务器为非80端口时:
_SERVER[“HTTP_HOST”] 会输出端口号,例如:mimiz.cn:8080
_SERVER[“SERVER_NAME”] 会直接输出ServerName值
因此在这种情况下,可以理解为:HTTP_HOST = SERVER_NAME : SERVER_PORT

3. 当配置文件httpd.conf中的ServerName与HTTP/1.0请求的域名不一致时:
httpd.conf配置如下:
<virtualhost *>
ServerName mimiz.cn
ServerAlias http://www.mimiz.cn
</virtualhost>
客户端访问域名www.mimiz.cn
_SERVER[“HTTP_HOST”] 输出 http://www.mimiz.cn
_SERVER[“SERVER_NAME”] 输出 mimiz.cn

所以,在实际程序中,应尽量使用_SERVER[“HTTP_HOST”] ,比较保险和可靠。

zend framework 框架中自定义父控制器

今天简单的聊聊ZF框架中的控制器。
大家都知道ZF中不可以使用__construct()构造方法,类的初始化操作需要用init()方法完成,
原因大部分朋友都应该了解,在php中,当子类有构造方法时,父类的构造方法不会被调用,
通过阅读zend/controller/Action.php的__construct()可以知道,它通过使用$this->init(),类似注入的方式,避免了这种情况。
那么在一个项目中,若干的controller可能会做一些同样的动作,比如初始化session、实例化一些对象等等,
如果在每个controller的init()中,写一些重复的代码,当controller比较多时,一来比较麻烦,二来不方便后期维护。
怎样解决这个问题呢?可以把这些代码写到一个文件中,然后include(),也可以OOXX,但我不认为这是个好办法,我的方法是,自定义一个父控制器。
例如:在library目录中新建一个Mylib/Controller/Parent.php文件,让这个文件继承zf的Controller,这样写:
class Mylib_Controller_Parent extends Zend_Controller_Action
{
public function init()
{
parent::init();
// Your custom code
}
}
以后在每个项目controller中不要继承ZF的默认控制器了,直接继承我们自己的Parent:
class DefaultController extends Mylib_Controller_Parent
{
public function init()
{
parent::init();
// Your custom code
}
}
就是这么简单。 😉
第一篇关于Zend Framework的文章,没什么技术含量,以后我会把项目中常用到的、实用的ZF经验技巧写下来,谢谢大家支持。

php pdo 连接 sql server 2005 的方法

注意,本文告诉你如何更好的用pdo连接sql server 2005 而不是 2000。
废话不多说,只说重点,按步骤来:

1. 确保正确安装sql server 2005 , 开启sql server的远程连接访问,检查防火墙,确认在本地可以通过SQL Server Configuration Manager连接到服务器。

2. 修改 php.ini 开启相关扩展(php_pdo.dll ,php_pdo_mssql.dll ,php_mssql.dll),重启apache后,一定要用phpinfo()检查是否成功加载。

3. 修改php.ini中:mssql.secure_connection = Off ,网上很多人说改为On,那是扯淡,改为Off就对啦。

4. (重点) 如果是连接sql server 2000,只需要把php根目录下的ntwdblib.dll文件copy到apache/bin/或者windows/system32/,
但是连接 sql server 2005 必须使用2000.80.194.0以上版本的ntwdblib.dll文件,
在sql server 2005 安装光盘中可以找到。
(下载地址:http://download.pchome.net/dll/n/detail-171972-0.html)

5. PDO连接mssql的字符串服务地址后加“,端口号”,注意是逗号,不是冒号。
例如:
$db = new PDO (“mssql:host=192.168.0.1,1433;dbname=testdb”,”sa”,”pw”);

phpMyAdmin出现PHP has encountered an Access Violation at XXXXXXXX

昨天在帮朋友配置IIS+PHP环境的时候,安装phpMyAdmin出现了PHP has encountered an Access Violation at XXXXXXXX的错误。
由于第一次碰上这种问题,只好去百度搜索答案,然而每次用百度解决技术问题都令我很失望,同时也越来越感慨国内Copy精神的强大。

翻遍了百度前10页的内容,得出错误可能原因如下:
1. ZendOptimizer和php不兼容
2. session_save_path路径不存在或没有足够的权限
3. 内存不足
4. libmysql.dll版本不兼容
5. php或IIS相关文件权限不够

看来不能指望百度,于是又去google继续搜,翻译结果如下:
1. 这是一个PHP的版本bug,是php典型的bug
2. 据说此bug已经修复近4年,仍未完全解决
3. 老外们在使用IIS时经常碰到同样的错误,不同的内存地址
4. 老外的论坛中有很多人提问相同问题,但没有回帖的,没有很好的解决方法。
5. 可以参考:http://bugs.php.net/bug.php?id=28929

看来这个错误没有固定的解决方法,只能靠自己摸索了。
我尝试了所有搜索到的、可能的方法,但仍然没有解决问题。
最后抱着试试看的态度,下载了一个最新版本的phpMyAdmin,问题解决了。

总结:
1. 造成此错误的随机性太强,不要期望有固定的解决方法
2. 根据硬件、软件环境,具体情况具体分析
3. 重点检查权限问题和兼容性问题
4. 不要仅仅考虑php、Zend等服务环境的兼容,网站代码的兼容性也不能放过
5. 遇事冷静思考,没有解决不了的问题