标签 phalcon 下的文章

Phalcon 是一个用 C 语言编写的,号称是速度最快、占用资源最少的 PHP 框架。它以一个 PHP 扩展的形式安装,与 CodeIgniter、CakePHP 等框架有显著的不同。

Phalcon 在 Windows 上的安装很简单,只要在官方网站上找到对应 PHP 版本的 DLL,放进 PHP 目录,然后在 php.ini 里加上就行了。但在 Linux 和 Mac 上需要自己编译。

在 Mac 上做 PHP 开发,很多人都用 MAMP。情况比较麻烦,因为除了 MAMP 以外,OS X 还自带了一个 PHP;而且 MAMP 没有自带 PHP 的源码。所以需要一些额外的步骤。

准备编译环境

首先,你得有一个包管理器,比如 Homebrew,用来安装一些工具。另外,还要安装 Xcode 或者只安装它的命令行工具,才能进行编译。

接下来,用 Homebrew安装一些工具:

$ brew install autoconf automake libtool

修改环境变量

现在,如果你在终端使用 PHP,实际上用的是 OS X 自带的那个:

$ which php
/usr/bin/php

修改环境变量,让终端调用 MAMP 里的 PHP:

$ export PATH=/Applications/MAMP/bin/php/php5.6.10/bin:$PATH
$ which php
/Applications/MAMP/bin/php/php5.6.10/bin/php

下载 PHP 源码

php --version 获得 PHP 的版本,然后在 php.net 下载对应的源码包。

$ php --version
PHP 5.6.10 (cli) (built: Jul  6 2015 14:28:54) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies

$ curl http://cn2.php.net/distributions/php-5.6.10.tar.bz2 | tar -xj
$ mkdir /Applications/MAMP/bin/php/php5.6.10/include
$ mv php-5.6.10/ /Applications/MAMP/bin/php/php5.6.10/php
$ cd /Applications/MAMP/bin/php/php5.6.10/php/
$ ./configure

安装 Phalcon

$ curl -L -o cphalcon-master.zip https://github.com/phalcon/cphalcon/archive/master.zip
$ unzip cphalcon-master.zip
$ cd cphalcon-master/build
$ sudo ./install

修改 MAMP PHP 配置文件模板

打开 MAMP,点击 File -> File -> Edit Template -> php 5.6.10 php.ini ,添加如下一行:

extension=phalcon.so

重启服务后,即可通过 phpinfo() 函数看到已安装的 Phalcon 信息。

Phalcon\Mvc\View 为基于 Phalcon 框架的应用提供了 Mvc 模式中的视图层,视图代表了应用程序中的用户界面. 视图通常是在 HTML 文件里嵌入 PHP 代码,这些代码仅仅是用来展示数据。 视图的任务是当应用程序发生请求时,提供数据给 web 浏览器或者其他工具。

集成视图到控制器(Integrating Views with Controllers)

当一个控制器执行完成之后, Phalcon 会自动的调用 View 组件,从 views 目录中查找与执行的 Controller同名的文件夹以及 Action 同名的模板文件,然后填充相应的数据后返回给浏览器,比如:http://localhost/item/view/1,Phalcon会将前面的这个Uri地址映射为:

服务器地址:        localhost
控制器:            item
动作:              view
参数:              1

调度器(Dispatcher)会查找名为 ItemController.php 的控制器文件,该文件中的内容应该如下:

<?php

class ItemController extends \Phalcon\Mvc\Controller {
    
    public function indexAction() {}

    public function showAction($itemId) {
        $item = Item::findFirstById($itemId);
        $this->view->setVar('item', $item);
    }
}

同时,调度器会执行 showAction,并将 1 作为参数传递给该方法,该方法中,$this->view->setVar() 方法向 view 中注入了一个名为 item 的对象,该对象的值为 $item,然后我们即可以在:/path/to/views/item/show.phtml 模板文件中以 $item 调用该对象的值或者方法。

Phalcon\Registry 是一个用于在应用中存储全局变量的容器,当向其实例存储了某个对象后,该对象将在整个应用中都可被访问,该类实现了 ArrayAccessIteratorTraversableSerializableCountableJsonSerializable 接口。

<?php

    // 实例化一个 \Phalcon\Registry 对象
    $registry = new \Phalcon\Registry();

    // 向 $registry 存储一个对象 something,其值为一个字符串: something
    $registry->something = 'something';
  
    // 以数组的方式存储一个对象
    $registry['something'] = 'something';

    // 获取前面存储的值
    $value = $registry->something;
    // 若以数据的键的方式访问
    $value = $registry['something'];

    // 检测是否存在某个对象
    $exists = isset($registry->something);
    // 或者以数组的方式检测
    $exists = isset($registry['something']);

    // 删除某个值
    unset($registry->something);
    // 若以数组的键的方式删除
    unset($registry['something']);

要确定 Phalcon Engine 应该具备哪些特性,首先就得确定我准备让 Phalcon Engine 应用于哪些业务场景下,我所经历的最多的项目包括企业网站、移动App开发、企业内部系统(OA、ERP)以及微信服务平台的开发,那我也将 Phalcon Engine 的业务场景限制在上面所述的这些业务里面。

我们假设系统目录结构如下:

/path/to/app/
    controllers/
    models/
    views/
    public/
        css/
        js/
        img/
        index.php

index.php 为入口文件。

Apache

.htaccess 文件存放在 /path/to/app/public/ 目录下,同时编辑该文件,内容如下:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
</IfModule>

一个完整的虚拟主机配置文件示例:

<VirtualHost *:80>

    ServerAdmin admin@example.host
    DocumentRoot "/path/to/app/public"
    DirectoryIndex index.php
    ServerName example.host
    ServerAlias www.example.host

    <Directory "/path/to/app/public">
        Options All
        AllowOverride All
        Allow from all
    </Directory>

</VirtualHost>

Nginx

index index.php index.html index.htm;
try_files $uri $uri/ @rewrite;

location @rewrite {
    rewrite ^/(.*)$ /index.php?_url=/$1;
}

location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass php;
}

location ~* ^/(css|img|js|flv|swf|download)/(.+)$ {
    root $app_root/public;
}

location ~ /\.ht {
    deny all;
}

作为PHP C拓展形式的Phalcon,需要一个略微不同于传统php的库或框架的安装方法。你可以选择一个当前系统的一个二进制包下载,或者使用源代码构建它。

Phalcon 可编译在PHP 5.3.1及以上版本,但是因为老PHP版本错误导致内存泄漏,官方强烈推荐你使用PHP 5.3.11或更高版本。

PHP 5.3.9版本以前有几个安全漏洞,不建议在生产网站中使用。点击学习更多

在 Windows 上安装 Phalcon

要在Windows上使用Phalcon,你可以下载一个DLL库。编辑php.ini文件,并且在最后附加上:

extension=php_phalcon.dll

重启你的Web服务器。

在 XAMPP 下安装 Phalcon PHP

XAMPP是一个易于安装的Apache发行版,其中包含MySQL、PHP和Perl。仅仅需要下载并启动安装程序。但是需要注册的是,XAMPP 总是只发行 32 位的版本,所以,您同样需要下载 32 位版本的 Phalcon。您可以从下面的网址中下载正确的 Phalcon:

下载完成之后,解压下载得到的压缩包,此时您可以得到一个名为 php_phalcon.dll 的文件,将该文件移动至 path\to\xampp\php\ext 目录下,之后打开 \path\to\xampp\php\php.ini 文件,在该文件的最末尾加上下面这一行:

extension=php_phalcon.dll

然后通过 xampp 控制面板重启 apache 服务器即可完成安装,此时打开 http://localhost ,查看 phpinfo 信息即可看到,PHPINFO 信息中已经存在了 Phalcon 章节。这表示 Phalcon 已经安装成功。

在 WAMP 中安装 Phalcon

在 WAMP 中安装Phalcon 与在 XAMPP 中安装类似,只是需要注意几个目录位置是不同的,PHP的扩展库目录为:\path\to\wamp\bin\php\phpVERSION\etx\php.ini 的目录是 \patho\to\wamp\apache\ApacheVERSION\bin\php.ini,在上面的两个目录地址中,需要将 VERSION 替换为相应软件的版本号。

在 Linux/Solaris/Mac 下安装

在Linux/Solaris/Mac系统下,你能很轻易从源代码编译和安装这个拓展:

基本要求(Requirements)¶

必要的包:

  • PHP 5.3.x/5.4.x/5.5.x development resources
  • GCC compiler (Linux/Solaris) or Xcode (Mac)
  • Git (如果不是已经安装在你的系统,且你没有从Github上下载这个包并通过FTP/SFTP上传到你的服务器上)

通用平台下安装指定的软件包:

#Ubuntu
sudo apt-get install gcc make git-core libpcre3-dev php5-dev

#Suse
sudo yast -i gcc make php5-devel
#or
sudo zypper install gcc make php5-devel

#CentOS/Fedora/RHEL
sudo yum install git gcc make pcre-devel php-devel

#Solaris
pkg install gcc-45 php-53 apache-php53

编译

创建扩展:

git clone git://github.com/phalcon/cphalcon.git
cd cphalcon/build
sudo ./install

添加扩展到你的php配置文件:

#Ubuntu: Add this line in your php.ini
extension=phalcon.so

#Centos/RedHat: Add a file called phalcon.ini in /etc/php.d/ with this content:
extension=phalcon.so

重启Web服务器.

Phalcon自动检测你的系统架构,然而,您可以强制编译为一个特定的架构:

sudo ./install 32bits
sudo ./install 64bits
sudo ./install safe

在 FreeBSD 上安装

对于FreeBSD,仅仅只需要简单的命令进行安装:

pkg_add -r phalcon

或者

export CFLAGS="-O2 -fno-delete-null-pointer-checks"
cd /usr/ports/www/phalcon && make install clean

\Phalcon\Text 是 Phalcon 框架提供的字符处理工具类,该类中定义了如下这些工具方法:

public static function camelize($str){ }
public static function uncamelize($str){ }
public static function increment($str, $separator=null){ }
public static function random($type, $length=null){ }
public static function startsWith($str, $start, $ignoreCase=null){ }
public static function endsWith($str, $end, $ignoreCase=null){ }
public static function lower($str){ }
public static function upper($str){ }

camelize($str)

该方法用于将字符串转换为驼峰式字符串,原始字符串要求以下划线 _ 相连,使用示例如下:

echo \Phalcon\Text::camelize('coco_bongo'); //CocoBongo

uncamelize($str)

该方法将驼峰式的字符串转换为以下划线相连的字符串,使用示例如下:

echo \Phalcon\Text::uncamelize('CocoBongo'); //coco_bongo

increment($str, $separator=null)

给字符串后面增加一个数字后缀,同时对该后缀进行递增操作,若原始字符串还未被设置过,则在字符串后面增加之,若已定义过,则给该数字加1,使用示例如下:

echo \Phalcon\Text::increment("a"); // "a_1"
echo \Phalcon\Text::increment("a_1"); // "a_2"
echo \Phalcon\Text::increment("a","-); // "a-1"

第二个参数用于定义数字与字符串的分隔符。

random($type, $length=null)

根据给定的类型生成相应类型的随机字符串,类型是以 RANDOM_ 为前缀的常量, Phalcon提供了如下几个随机类型常量:

const RANDOM_ALNUM = 0; // 包含英文字母与数字的随机字符串
const RANDOM_ALPHA = 1; // 仅包含英文字母的随机字符串
const RANDOM_HEXDEC = 2; // 
const RANDOM_NUMERIC = 3; // 纯数字随机字符串
const RANDOM_NOZERO = 4; // 无0的随机纯数字字符串

第二个参数用于定义生成的随机字符串的长度。

startsWith($str, $start, $ignoreCase=null)

检测 $str 字符串是否以 $start 字符串开始,$ignoreCase 定义是否忽略大小写,使用示例如下:

echo \Phalcon\Text::startsWith("Hello", "he", false); // true
echo \Phalcon\Text::startsWith("Hello", "he"); // false
echo \Phalcon\Text::startsWith("Hello", "He"); // true

endsWith($str, $end, $ignoreCase=null)

startsWith 使用方法一致,其功能为检测是否以 $end 字符串结尾,使用示例如下:

echo \Phalcon\Text::endsWith("Hello", "LLO", false); // true
echo \Phalcon\Text::endsWith("Hello", "LLO"); // false
echo \Phalcon\Text::endsWith("Hello", "llo"); // true

lower($str)

$str 字符串转换为纯小写,若 mbstring 函数可用,lower 函数会优先选择 mbstring 函数。

upper($str)

$str 字符串转换为纯大写,功能与 lower 函数类似。