<commit_before># phalcon-project
[![Total Downloads](https://poser.pugx.org/limingxinleo/phalcon-project/downloads)](https://packagist.org/packages/limingxinleo/phalcon-project)
[![Latest Stable Version](https://poser.pugx.org/limingxinleo/phalcon-project/v/stable)](https://packagist.org/packages/limingxinleo/phalcon-project)
[![Latest Unstable Version](https://poser.pugx.org/limingxinleo/phalcon-project/v/unstable)](https://packagist.org/packages/limingxinleo/phalcon-project)
[![License](https://poser.pugx.org/limingxinleo/phalcon-project/license)](https://packagist.org/packages/limingxinleo/phalcon-project)


[Phalcon 官网](https://docs.phalconphp.com/zh/latest/index.html)

## 安装方法
### 编译phalcon安装扩展
~~~
git clone --depth=1 git://github.com/phalcon/cphalcon.git
cd cphalcon/build
sudo ./install

vim etc/php.ini 
extension=phalcon.so
~~~

### Linux下Yum安装扩展
~~~
yum --enablerepo=remi install php70-php-phalcon3
~~~

### Mac下Homebrew安装扩展
~~~
brew install php70-phalcon
~~~

### 安装项目
* 利用composer安装
~~~
composer create-project limingxinleo/phalcon-project demo
~~~

* git clone 安装
~~~
git clone https://github.com/limingxinleo/simple-subcontrollers.phalcon.git
cd simple-subcontrollers.phalcon
composer install
mkdir .phalcon
cp .env.example .env
php run
~~~

## 目录结构

初始的目录结构如下：

~~~
www  WEB部署目录（或者子目录）
├─app                   项目文件
│ ├─config              配置文件
│ │ ├─config.ini        phalcon-devtools用的配置文件
│ │ ├─config.php        系统配置文件
│ │ ├─loader.php        自动加载文件
│ │ └─routes.php        路由文件
│ ├─controllers         控制器目录
│ ├─library             第三方库目录
│ ├─listeners           监听事件目录
│ ├─logics              逻辑层目录
│ ├─models              模型目录
│ ├─tasks               任务目录
│ ├─traits              Trait目录
│ ├─utils               工具类库
│ └─views               视图目录
├─public                资源目录
│ ├─app                 项目资源目录
│ ├─lib                 第三方资源目录
│ ├─.htaccess           apache重写文件
│ └─index.php           入口文件
├─storage               项目写入仓库
│ ├─cache               项目缓存目录
│ │ ├─data              数据缓存目录
│ │ └─view              视图缓存目录
│ ├─log                 日志目录
│ ├─meta                模型元数据目录
│ └─migrations          数据库迁移目录
├─tests                 单元测试目录
├─vendor                第三方类库目录（Composer依赖库）
├─.env                  env支持配置文件
├─composer.json         composer定义文件
├─README.md             README文件
├─LICENSE               授权说明文件
└─run                   命令行入口文件
~~~

## phalcon工具脚本
[devtools](https://github.com/limingxinleo/phalcon-devtools.git)
> 如果想使用更加定制化的功能，比如在app/config/config.ini维护控制器的默认信息，请使用修改后的[devtools](https://github.com/limingxinleo/phalcon-devtools.git) dev分支。

## 其他扩展版本
[Thrift GO服务版本](https://github.com/limingxinleo/thrift-go-phalcon-project)

[Yar 服务版本](https://github.com/limingxinleo/yar-phalcon-project)

[Vue 版本](https://github.com/limingxinleo/simple-vue-phalcon-project)


## Web开发规范
调用方式
~~~
controller -> logic -> model -> db
task -> logic -> model -> db
~~~

## 消息队列
编辑app/tasks/TestTask.php
~~~
namespace App\Tasks;

use limx\phalcon\Redis;
use limx\phalcon\Cli\Color;

class TestTask extends \App\Tasks\System\QueueTask
{
    // 最大进程数
    protected $maxProcesses = 10;
    // 当前进程数
    protected $process = 0;
    // 消息队列Redis键值
    protected $queueKey = 'phalcon:test:queue';
    // 等待时间
    protected $waittime = 1;

    protected function redisClient()
    {
        return Redis::getInstance('127.0.0.1', '910123');
    }

    protected function redisChildClient()
    {
        return Redis::getInstance('127.0.0.1', '910123', 0, 6379, uniqid());
    }

    /**
     * @desc   子进程也能监听消息队列
     *         3秒内没有消息自动回收
     *         抽象类中已实现此方法
     * @author limx
     * @param $data
     */
    protected function run($data)
    {
        $this->handle($data);
        $redis = $this->redisChildClient();
        while (true) {
            // 无任务时,阻塞等待
            $data = $redis->brpop($this->queueKey, 3);
            if (!$data) {
                break;
            }
            if ($data[0] != $this->queueKey) {
                // 消息队列KEY值不匹配
                continue;
            }
            if (isset($data[1])) {
                $this->handle($data[1]);
            }
        }
    }

    /**
     * @desc   消息队列处理逻辑
     * @author limx
     * @param $data
     */
    protected function handle($data)
    {
        echo Color::success($data);
    }
}
~~~

运行php run test即可启动消息队列
~~~
php run test
~~~

## 定时脚本 ##
~~~
crontab -e 
编辑增加 * * * * * /path/to/php /path/to/run System\\\\Cron >> /dev/null 2>&1
启动crond 服务
在config/app.php 中维护cron-tasks数组 样例如下
'cron-tasks' => [
    ['task' => 'System\\Clear', 'action' => 'view', 'params' => ['yes'], 'schedule' => ['dailyAt', [2, 0]]],
],
~~~
schedule写法为[方法名,参数数组]，详见 [Schedule](https://github.com/limingxinleo/support-schedule)

## 注意事项 ##<commit_msg>* readme<commit_after># phalcon-project
[![Total Downloads](https://poser.pugx.org/limingxinleo/phalcon-project/downloads)](https://packagist.org/packages/limingxinleo/phalcon-project)
[![Latest Stable Version](https://poser.pugx.org/limingxinleo/phalcon-project/v/stable)](https://packagist.org/packages/limingxinleo/phalcon-project)
[![Latest Unstable Version](https://poser.pugx.org/limingxinleo/phalcon-project/v/unstable)](https://packagist.org/packages/limingxinleo/phalcon-project)
[![License](https://poser.pugx.org/limingxinleo/phalcon-project/license)](https://packagist.org/packages/limingxinleo/phalcon-project)


[Phalcon 官网](https://docs.phalconphp.com/zh/latest/index.html)

## 安装方法
### 编译phalcon安装扩展
~~~
git clone --depth=1 git://github.com/phalcon/cphalcon.git
cd cphalcon/build
sudo ./install

vim etc/php.ini 
extension=phalcon.so
~~~

### Linux下Yum安装扩展
~~~
yum --enablerepo=remi install php70-php-phalcon3
~~~

### Mac下Homebrew安装扩展
~~~
brew install php70-phalcon
~~~

### 安装项目
* 利用composer安装
~~~
composer create-project limingxinleo/phalcon-project demo
~~~

* git clone 安装
~~~
git clone https://github.com/limingxinleo/simple-subcontrollers.phalcon.git
cd simple-subcontrollers.phalcon
composer install
mkdir .phalcon
cp .env.example .env
php run
~~~

## 目录结构

初始的目录结构如下：

~~~
www  WEB部署目录（或者子目录）
├─app                   项目文件
│ ├─config              配置文件
│ │ ├─config.ini        phalcon-devtools用的配置文件
│ │ ├─config.php        系统配置文件
│ │ ├─loader.php        自动加载文件
│ │ └─routes.php        路由文件
│ ├─controllers         控制器目录
│ ├─library             第三方库目录
│ ├─listeners           监听事件目录
│ ├─logics              逻辑层目录
│ ├─models              模型目录
│ ├─tasks               任务目录
│ ├─traits              Trait目录
│ ├─utils               工具类库
│ └─views               视图目录
├─public                资源目录
│ ├─app                 项目资源目录
│ ├─lib                 第三方资源目录
│ ├─.htaccess           apache重写文件
│ └─index.php           入口文件
├─storage               项目写入仓库
│ ├─cache               项目缓存目录
│ │ ├─data              数据缓存目录
│ │ └─view              视图缓存目录
│ ├─log                 日志目录
│ ├─meta                模型元数据目录
│ └─migrations          数据库迁移目录
├─tests                 单元测试目录
├─vendor                第三方类库目录（Composer依赖库）
├─.env                  env支持配置文件
├─composer.json         composer定义文件
├─README.md             README文件
├─LICENSE               授权说明文件
└─run                   命令行入口文件
~~~

## phalcon工具脚本
[devtools](https://github.com/limingxinleo/phalcon-devtools.git)
> 如果想使用更加定制化的功能，比如在app/config/config.ini维护控制器的默认信息，请使用修改后的[devtools](https://github.com/limingxinleo/phalcon-devtools.git) dev分支。

## 其他扩展版本
[Thrift GO服务版本](https://github.com/limingxinleo/thrift-go-phalcon-project)

[Yar 服务版本](https://github.com/limingxinleo/yar-phalcon-project)

[Vue 版本](https://github.com/limingxinleo/simple-vue-phalcon-project)


## Web开发规范
调用方式
~~~
controller -> logic -> model -> db
task -> logic -> model -> db
~~~

## 消息队列
编辑app/tasks/TestTask.php
~~~
namespace App\Tasks;

use limx\phalcon\Redis;
use limx\phalcon\Cli\Color;

class TestTask extends \App\Tasks\System\QueueTask
{
    // 最大进程数
    protected $maxProcesses = 10;
    // 当前进程数
    protected $process = 0;
    // 消息队列Redis键值
    protected $queueKey = 'phalcon:test:queue';
    // 等待时间
    protected $waittime = 1;

    protected function redisClient()
    {
        return Redis::getInstance('127.0.0.1', '910123');
    }

    protected function redisChildClient()
    {
        return Redis::getInstance('127.0.0.1', '910123', 0, 6379, uniqid());
    }

    /**
     * @desc   子进程也能监听消息队列
     *         3秒内没有消息自动回收
     *         抽象类中已实现此方法
     * @author limx
     * @param $data
     */
    protected function run($data)
    {
        $this->handle($data);
        $redis = $this->redisChildClient();
        while (true) {
            // 无任务时,阻塞等待
            $data = $redis->brpop($this->queueKey, 3);
            if (!$data) {
                break;
            }
            if ($data[0] != $this->queueKey) {
                // 消息队列KEY值不匹配
                continue;
            }
            if (isset($data[1])) {
                $this->handle($data[1]);
            }
        }
    }

    /**
     * @desc   消息队列处理逻辑
     * @author limx
     * @param $data
     */
    protected function handle($data)
    {
        echo Color::success($data);
    }
}
~~~

运行php run test即可启动消息队列
~~~
php run test
~~~

## 定时脚本 ##
~~~
crontab -e 
编辑增加 * * * * * /path/to/php /path/to/run System\\Cron >> /dev/null 2>&1
启动crond 服务
在config/app.php 中维护cron-tasks数组 样例如下
'cron-tasks' => [
    ['task' => 'System\\Clear', 'action' => 'view', 'params' => ['yes'], 'schedule' => ['dailyAt', [2, 0]]],
],
~~~
schedule写法为[方法名,参数数组]，详见 [Schedule](https://github.com/limingxinleo/support-schedule)

## 注意事项 ##
{'fraction_non_alphanumeric': 0.1546607947992031, 'fraction_numerical': 0.010066058508965083, 'mean_word_length': 2.253069577080491, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 45, 'https://': 32, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 4, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 4, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7497035', 'n_tokens_mistral': 4112, 'n_tokens_neox': 4214, 'n_words': 601}